aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-11-06 13:08:55 +0000
committerGitHub <noreply@github.com>2024-11-06 13:08:55 +0000
commite8f231ee720548cc14db92e4eaf8fa7bc12fbf72 (patch)
treef1669c55208eb4e282395a28ff52ac3d28239050 /src
parent1419d0d295919a625ff75dfa9c3ffc6a4c7efc8b (diff)
parentf1de4804a5d816d2a65f6e1d3d4faf7d3f340f64 (diff)
Merge pull request #4437 from dpoetzschke/fix/windows-args-escaping
fix windows args parser problem from issue #4393
Diffstat (limited to 'src')
-rw-r--r--src/string.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/string.cpp b/src/string.cpp
index 190b69041..f8ee6c53e 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -412,6 +412,32 @@ gb_internal String concatenate4_strings(gbAllocator a, String const &x, String c
return make_string(data, len);
}
+#if defined(GB_SYSTEM_WINDOWS)
+gb_internal String escape_char(gbAllocator a, String s, char cte) {
+ isize buf_len = s.len;
+ isize cte_count = 0;
+ for (isize j = 0; j < s.len; j++) {
+ if (s.text[j] == cte) {
+ cte_count++;
+ }
+ }
+
+ u8 *buf = gb_alloc_array(a, u8, buf_len+cte_count);
+ isize i = 0;
+ for (isize j = 0; j < s.len; j++) {
+ u8 c = s.text[j];
+
+ if (c == cte) {
+ buf[i++] = '\\';
+ buf[i++] = c;
+ } else {
+ buf[i++] = c;
+ }
+ }
+ return make_string(buf, i);
+}
+#endif
+
gb_internal String string_join_and_quote(gbAllocator a, Array<String> strings) {
if (!strings.count) {
return make_string(nullptr, 0);
@@ -427,7 +453,11 @@ gb_internal String string_join_and_quote(gbAllocator a, Array<String> strings) {
if (i > 0) {
s = gb_string_append_fmt(s, " ");
}
+#if defined(GB_SYSTEM_WINDOWS)
+ s = gb_string_append_fmt(s, "\"%.*s\" ", LIT(escape_char(a, strings[i], '\\')));
+#else
s = gb_string_append_fmt(s, "\"%.*s\" ", LIT(strings[i]));
+#endif
}
return make_string(cast(u8 *) s, gb_string_length(s));