From 0e6cc6ec4ba1c5cee8815303cd5b98e14a30ee29 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Mar 2025 10:31:59 +0000 Subject: Use working directory for `aapt` commands --- src/path.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 12 deletions(-) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index 2c08ddd98..2217622c6 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -30,28 +30,80 @@ gb_internal String remove_directory_from_path(String const &s) { } -// NOTE(Mark Naughton): getcwd as String -#if !defined(GB_SYSTEM_WINDOWS) -gb_internal String get_current_directory(void) { - char cwd[256]; - getcwd(cwd, 256); +#if defined(GB_SYSTEM_WINDOWS) +gb_global SRWLOCK cwd_lock; + +String get_working_directory(gbAllocator allocator) { + AcquireSRWLockExclusive(&cwd_lock); + + TEMPORARY_ALLOCATOR_GUARD(); + + DWORD sz_utf16 = GetCurrentDirectoryW(0, nullptr); + wchar_t *dir_buf_wstr = gb_alloc_array(temporary_allocator(), wchar_t, sz_utf16); + if (dir_buf_wstr == nullptr) { + ReleaseSRWLockExclusive(&cwd_lock); + return {}; + } + + DWORD n = GetCurrentDirectoryW(sz_utf16, dir_buf_wstr); + GB_ASSERT(n+1 == sz_utf16); + ReleaseSRWLockExclusive(&cwd_lock); + + + isize buf_len = sz_utf16*4; + u8 *buf = gb_alloc_array(allocator, u8, buf_len); + gb_ucs2_to_utf8(buf, buf_len, cast(u16 *)dir_buf_wstr); + + return make_string_c(cast(char const *)buf); +} + +bool set_working_directory(String dir) { + bool ok = false; + TEMPORARY_ALLOCATOR_GUARD(); + + char const *cdir = alloc_cstring(temporary_allocator(), dir); + wchar_t *wstr = gb__alloc_utf8_to_ucs2(temporary_allocator(), cdir, nullptr); - return make_string_c(cwd); + AcquireSRWLockExclusive(&cwd_lock); + + ok = SetCurrentDirectoryW(wstr); + + ReleaseSRWLockExclusive(&cwd_lock); + + return ok; } #else -gb_internal String get_current_directory(void) { - gbAllocator a = heap_allocator(); - wchar_t cwd[256]; - GetCurrentDirectoryW(256, cwd); +String get_working_directory(gbAllocator allocator) { + TEMPORARY_ALLOCATOR_GUARD(); - String16 wstr = make_string16_c(cwd); + auto buf = array_make(temporary_allocator()); + size_t size = PATH_MAX: - return string16_to_string(a, wstr); + char const *cwd; + for (; cwd == nullptr; size *= 2) { + array_resize(&buf, size); + + cwd = getcwd(buf.data, buf.count); + if cwd == nullptr && errno() != ERANGE { + return {}; + } + } + + return copy_string(allocator, make_string_c(cwd)); +} + +bool set_working_directory(String dir) { + TEMPORARY_ALLOCATOR_GUARD(); + char const *cdir = alloc_cstring(temporary_allocator(), dir); + return !chdir(cdir); } + #endif + + gb_internal bool path_is_directory(String path); gb_internal String directory_from_path(String const &s) { -- cgit v1.2.3 From 1fc1a7fd51cec273619e1bcc80ae82fc7ed38032 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Mar 2025 11:12:44 +0000 Subject: Fix typos --- src/path.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index 2217622c6..5a71c5463 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -79,14 +79,14 @@ String get_working_directory(gbAllocator allocator) { TEMPORARY_ALLOCATOR_GUARD(); auto buf = array_make(temporary_allocator()); - size_t size = PATH_MAX: + size_t size = PATH_MAX; char const *cwd; for (; cwd == nullptr; size *= 2) { array_resize(&buf, size); cwd = getcwd(buf.data, buf.count); - if cwd == nullptr && errno() != ERANGE { + if (cwd == nullptr && errno() != ERANGE) { return {}; } } -- cgit v1.2.3 From 9b3d381af048a0d12c45f4ea27ff435b3aeb698b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Mar 2025 12:55:41 +0000 Subject: Fix another typo --- src/path.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/path.cpp') diff --git a/src/path.cpp b/src/path.cpp index 5a71c5463..12f8d3d4e 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -86,7 +86,7 @@ String get_working_directory(gbAllocator allocator) { array_resize(&buf, size); cwd = getcwd(buf.data, buf.count); - if (cwd == nullptr && errno() != ERANGE) { + if (cwd == nullptr && errno != ERANGE) { return {}; } } -- cgit v1.2.3