~ chicken-core (master) f4d03539ed064e8e2a68b7d2788e6b9544262cbf
commit f4d03539ed064e8e2a68b7d2788e6b9544262cbf
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Jul 2 15:40:19 2025 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Wed Jul 2 15:40:19 2025 +0100
smarter argument parsing on windows
diff --git a/runtime.c b/runtime.c
index b5409600..d1d08ee8 100644
--- a/runtime.c
+++ b/runtime.c
@@ -630,7 +630,7 @@ int CHICKEN_main(int argc, char *argv[], void *toplevel)
void parse_argv(C_char *cmds)
{
C_char *ptr = cmds, *bptr0, *bptr, *aptr;
- int n = 0;
+ int n = 0, delim = 0;
C_main_argv = (C_char **)malloc((MAXIMAL_NUMBER_OF_COMMAND_LINE_ARGUMENTS + 1) * sizeof(C_char *));
if(C_main_argv == NULL)
@@ -645,11 +645,18 @@ void parse_argv(C_char *cmds)
bptr0 = bptr = buffer;
n = 0;
- while(!C_utf_isspace((int)(*ptr)) && *ptr != '\0') {
+ if(*ptr == '\"' || *ptr == '\'') delim = *(ptr++);
+ else delim = 0;
+
+ while(*ptr != '\0') {
+ if(*ptr == delim || (C_utf_isspace((int)(*ptr)) && !delim)) break;
+ if(delim && *ptr == '\\') ++ptr;
*(bptr++) = *(ptr++);
++n;
}
+ if(delim) ++ptr;
+
*bptr = '\0';
aptr = (C_char*)malloc(n + 1);
if(!aptr) panic(C_text("cannot allocate argument buffer"));
Trap