diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-03-16 16:54:27 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-03-16 16:54:27 -0400 |
| commit | 67191b70789de3ef723561f26587903dc1dc698f (patch) | |
| tree | 6f5428c8d6c5ea8e52e83fab17c875035d8ea7de | |
| parent | b4a0fda409f49c44c3aaee40575b438f0dfbbbe4 (diff) | |
Fix shell escaping for arrays of paths
| -rw-r--r-- | environment.c | 2 | ||||
| -rw-r--r-- | stdlib/shell.c | 11 | ||||
| -rw-r--r-- | stdlib/shell.h | 1 |
3 files changed, 13 insertions, 1 deletions
diff --git a/environment.c b/environment.c index 9b39caa5..6dd82f81 100644 --- a/environment.c +++ b/environment.c @@ -583,7 +583,7 @@ env_t *new_compilation_unit(CORD libname) {"Shell$escape_text", "func(text:Text -> Shell)"}, {"Shell$escape_path", "func(path:Path -> Shell)"}, {"Shell$escape_text_array", "func(texts:[Text] -> Shell)"}, - {"Shell$escape_text_array", "func(paths:[Path] -> Shell)"}, + {"Shell$escape_path_array", "func(paths:[Path] -> Shell)"}, {"Int$value_as_text", "func(i:Int -> Shell)"}); ADD_CONSTRUCTORS("CString", {"Text$as_c_string", "func(text:Text -> CString)"}); ADD_CONSTRUCTORS("Moment", diff --git a/stdlib/shell.c b/stdlib/shell.c index 7dcc9a0a..30dc7c6f 100644 --- a/stdlib/shell.c +++ b/stdlib/shell.c @@ -34,6 +34,17 @@ public Shell_t Shell$escape_text_array(Array_t texts) return Text$join(Text(" "), all_escaped); } +public Shell_t Shell$escape_path_array(Array_t paths) +{ + Array_t all_escaped = {}; + for (int64_t i = 0; i < paths.length; i++) { + Path_t path = *(Path_t*)(paths.data + i*paths.stride); + Text_t escaped = Shell$escape_path(path); + Array$insert(&all_escaped, &escaped, I(0), sizeof(Text_t)); + } + return Text$join(Text(" "), all_escaped); +} + public OptionalArray_t Shell$run_bytes(Shell_t command) { const char *cmd_str = Text$as_c_string(command); diff --git a/stdlib/shell.h b/stdlib/shell.h index c20c809d..517a3609 100644 --- a/stdlib/shell.h +++ b/stdlib/shell.h @@ -20,6 +20,7 @@ OptionalClosure_t Shell$by_line(Shell_t command); Shell_t Shell$escape_text(Text_t text); Shell_t Shell$escape_path(Path_t path); Shell_t Shell$escape_text_array(Array_t texts); +Shell_t Shell$escape_path_array(Array_t paths); OptionalArray_t Shell$run_bytes(Shell_t command); OptionalText_t Shell$run(Shell_t command); OptionalInt32_t Shell$execute(Shell_t command); |
