mirror of
https://github.com/odin-lang/Odin.git
synced 2026-08-02 04:08:54 +00:00
handle spaces in args for 'odin run . -- <args>' on Windows
This commit is contained in:
@@ -640,7 +640,7 @@ gb_internal gb_inline f64 gb_sqrt(f64 x) {
|
||||
|
||||
#if defined(GB_SYSTEM_WINDOWS)
|
||||
|
||||
gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc, wchar_t **_after_double_dash_raw) {
|
||||
u32 i, j;
|
||||
|
||||
u32 len = cast(u32)string16_len(cast(u16 *)cmd_line);
|
||||
@@ -649,6 +649,8 @@ gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
wchar_t **argv = cast(wchar_t **)GlobalAlloc(GMEM_FIXED, i + (len+2)*gb_size_of(wchar_t));
|
||||
wchar_t *_argv = cast(wchar_t *)((cast(u8 *)argv)+i);
|
||||
|
||||
wchar_t *after_double_dash_raw = nullptr;
|
||||
|
||||
u32 argc = 0;
|
||||
argv[argc] = _argv;
|
||||
bool in_quote = false;
|
||||
@@ -657,6 +659,17 @@ gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
i = 0;
|
||||
j = 0;
|
||||
|
||||
auto const check_double_dash = [&]() {
|
||||
if (!after_double_dash_raw &&
|
||||
argc >= 1 &&
|
||||
argv[argc - 1][0] == '-' &&
|
||||
argv[argc - 1][1] == '-' &&
|
||||
argv[argc - 1][2] == '\0') {
|
||||
|
||||
after_double_dash_raw = cmd_line + i;
|
||||
}
|
||||
};
|
||||
|
||||
for (;;) {
|
||||
wchar_t a = cmd_line[i];
|
||||
if (a == 0) {
|
||||
@@ -673,7 +686,10 @@ gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
case '\"':
|
||||
in_quote = true;
|
||||
in_text = true;
|
||||
if (in_space) argv[argc++] = _argv+j;
|
||||
if (in_space) {
|
||||
check_double_dash();
|
||||
argv[argc++] = _argv + j;
|
||||
}
|
||||
in_space = false;
|
||||
break;
|
||||
case ' ':
|
||||
@@ -686,7 +702,10 @@ gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
break;
|
||||
default:
|
||||
in_text = true;
|
||||
if (in_space) argv[argc++] = _argv+j;
|
||||
if (in_space) {
|
||||
check_double_dash();
|
||||
argv[argc++] = _argv + j;
|
||||
}
|
||||
_argv[j++] = a;
|
||||
in_space = false;
|
||||
break;
|
||||
@@ -696,8 +715,10 @@ gb_internal wchar_t **command_line_to_wargv(wchar_t *cmd_line, int *_argc) {
|
||||
}
|
||||
_argv[j] = '\0';
|
||||
argv[argc] = nullptr;
|
||||
check_double_dash();
|
||||
|
||||
if (_argc) *_argc = argc;
|
||||
if (_after_double_dash_raw) *_after_double_dash_raw = after_double_dash_raw;
|
||||
return argv;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user