summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-09 17:41:26 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-09 17:41:26 +0100
commita97e2a90a4508dc7936f132aebcccc08fd3305b0 (patch)
tree866ab5e78a8a7f4d09ba329f49b917caf83e970c
parent4643a85a171652a25eecfca5a7af4cf4ccb2d580 (diff)
loader, anim-crop-tool: workaround relative path usage
-rw-r--r--anim-crop-tool/main.cpp5
-rw-r--r--loader/filesystem.cpp14
-rw-r--r--loader/impl.hpp7
-rw-r--r--loader/loader.hpp1
4 files changed, 23 insertions, 4 deletions
diff --git a/anim-crop-tool/main.cpp b/anim-crop-tool/main.cpp
index e4878480..4d0eca1e 100644
--- a/anim-crop-tool/main.cpp
+++ b/anim-crop-tool/main.cpp
@@ -4,6 +4,7 @@
#include "serialize/anim.hpp"
#include "compat/defs.hpp"
#include "compat/sysexits.hpp"
+#include "loader/loader.hpp"
#include <cerrno>
#include <cmath>
@@ -211,8 +212,8 @@ static std::tuple<options, Arguments, bool> parse_cmdline(int argc, const char*
else if (!args.value<StringView>("scale").isEmpty())
opts.scale = { { .r = {args.value<float>("scale")} } , anim_scale_type::ratio };
- opts.output_dir = args.value<StringView>("output");
- opts.input_file = args.value<StringView>("input");
+ opts.output_dir = Path::join(loader.startup_directory(), args.value<StringView>("output"));
+ opts.input_file = Path::join(loader.startup_directory(), args.value<StringView>("input"));
opts.input_dir = Path::split(opts.input_file).first();
if (opts.output_dir.isEmpty())
diff --git a/loader/filesystem.cpp b/loader/filesystem.cpp
index 850ec84f..f3a72365 100644
--- a/loader/filesystem.cpp
+++ b/loader/filesystem.cpp
@@ -38,12 +38,26 @@ bool loader_impl::chdir(StringView pathname)
return !ret;
}
+StringView loader_impl::startup_directory() noexcept
+{
+ fm_debug_assert(!original_working_directory.isEmpty());
+ return original_working_directory;
+}
+
void loader_impl::set_application_working_directory()
{
static bool once = false;
if (once)
return;
once = true;
+ if (auto loc = Path::currentDirectory(); loc)
+ original_working_directory = std::move(*loc);
+ else
+ {
+ Error err; err << "can't get original working directory:";
+ Corrade::Utility::Implementation::printErrnoErrorString(err, errno);
+ original_working_directory = "."_s;
+ }
if (const auto loc = Path::executableLocation())
{
String path;
diff --git a/loader/impl.hpp b/loader/impl.hpp
index e1d6d649..8fa650ea 100644
--- a/loader/impl.hpp
+++ b/loader/impl.hpp
@@ -28,6 +28,8 @@ struct loader_impl final : loader_
std::vector<serialized_scenery> sceneries_array;
std::unordered_map<StringView, const serialized_scenery*> sceneries_map;
+ String original_working_directory;
+
StringView shader(StringView filename) noexcept override;
Trade::ImageData2D texture(StringView prefix, StringView filename) noexcept(false);
std::shared_ptr<struct tile_atlas> tile_atlas(StringView filename, Vector2ub size, Optional<pass_mode> pass) noexcept(false) override;
@@ -39,9 +41,10 @@ struct loader_impl final : loader_
void get_anim_atlas_list();
void get_scenery_list();
-
- static void set_application_working_directory();
static anim_def deserialize_anim(StringView filename);
+
+ void set_application_working_directory();
+ StringView startup_directory() noexcept override;
static void system_init();
static bool chdir(StringView pathname);
[[nodiscard]] static bool check_atlas_name(StringView name);
diff --git a/loader/loader.hpp b/loader/loader.hpp
index 1189a02d..fadccb45 100644
--- a/loader/loader.hpp
+++ b/loader/loader.hpp
@@ -25,6 +25,7 @@ struct loader_
static std::vector<std::shared_ptr<struct tile_atlas>> tile_atlases(StringView filename, pass_mode p);
virtual const std::vector<serialized_scenery>& sceneries() = 0;
virtual const scenery_proto& scenery(StringView name) noexcept(false) = 0;
+ virtual StringView startup_directory() noexcept = 0;
loader_(const loader_&) = delete;
loader_& operator=(const loader_&) = delete;