diff options
| author | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 06:16:30 +0000 |
|---|---|---|
| committer | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 06:16:30 +0000 |
| commit | b7b730364ca00b95b3c4c46422dbc0a16317df27 (patch) | |
| tree | aa42d7c4ac5b424ae9266254cb5cd61a4b5da9e8 /src | |
| parent | 8f90c47b28b235cc4292342900765987af5bf768 (diff) | |
| download | shell-zig-b7b730364ca00b95b3c4c46422dbc0a16317df27.tar.gz shell-zig-b7b730364ca00b95b3c4c46422dbc0a16317df27.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'src')
| -rw-r--r-- | src/builtins.zig | 6 | ||||
| -rw-r--r-- | src/parser.zig | 29 |
2 files changed, 25 insertions, 10 deletions
diff --git a/src/builtins.zig b/src/builtins.zig index 1326b98..409b57d 100644 --- a/src/builtins.zig +++ b/src/builtins.zig @@ -29,7 +29,11 @@ pub fn executeEcho(stdout: anytype, args: ?[]const u8) !void { var last_was_space = false; while (i < a.len) : (i += 1) { - if (!in_quote and (a[i] == '\'' or a[i] == '"')) { + if (!in_quote and a[i] == '\\' and i + 1 < a.len) { + i += 1; + _ = unquoted.append(std.heap.page_allocator, a[i]) catch {}; + last_was_space = false; + } else if (!in_quote and (a[i] == '\'' or a[i] == '"')) { in_quote = true; quote_char = a[i]; last_was_space = false; diff --git a/src/parser.zig b/src/parser.zig index ba1655a..de42f31 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -22,24 +22,35 @@ pub fn parseArgs(allocator: std.mem.Allocator, cmd_name: []const u8, args_str: ? if (args_str) |args| { var i: usize = 0; + var arg_buf = std.ArrayList(u8){}; + defer arg_buf.deinit(allocator); + while (i < args.len) { if (args[i] == '\'' or args[i] == '"') { const quote = args[i]; i += 1; - const start = i; - while (i < args.len and args[i] != quote) : (i += 1) {} - if (i <= args.len) { - try args_list.append(allocator, args[start..i]); - i += 1; + while (i < args.len and args[i] != quote) : (i += 1) { + try arg_buf.append(allocator, args[i]); + } + if (i < args.len) i += 1; + } else if (args[i] == '\\' and i + 1 < args.len) { + i += 1; + try arg_buf.append(allocator, args[i]); + i += 1; + } else if (args[i] == ' ') { + if (arg_buf.items.len > 0) { + try args_list.append(allocator, try arg_buf.toOwnedSlice(allocator)); } - } else if (args[i] != ' ') { - const start = i; - while (i < args.len and args[i] != ' ' and args[i] != '\'' and args[i] != '"') : (i += 1) {} - try args_list.append(allocator, args[start..i]); + i += 1; } else { + try arg_buf.append(allocator, args[i]); i += 1; } } + + if (arg_buf.items.len > 0) { + try args_list.append(allocator, try arg_buf.toOwnedSlice(allocator)); + } } return args_list.toOwnedSlice(allocator); |