diff options
| author | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 06:08:15 +0000 |
|---|---|---|
| committer | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 06:08:15 +0000 |
| commit | 2803d94dc4a4d3445986da484897a9d7d9b0a93a (patch) | |
| tree | f4e28422a8d80dcbf8f3b606f87973c5bfe46da0 /src/parser.zig | |
| parent | 2fdd42785cc0bd12971f2c475171f4fb7e56527b (diff) | |
| download | shell-zig-2803d94dc4a4d3445986da484897a9d7d9b0a93a.tar.gz shell-zig-2803d94dc4a4d3445986da484897a9d7d9b0a93a.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'src/parser.zig')
| -rw-r--r-- | src/parser.zig | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/parser.zig b/src/parser.zig index 4909464..ba1655a 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -15,15 +15,30 @@ pub fn parseCommand(input: []const u8) ParsedCommand { pub fn parseArgs(allocator: std.mem.Allocator, cmd_name: []const u8, args_str: ?[]const u8) ![]const []const u8 { var args_list = std.ArrayList([]const u8){}; - try args_list.ensureTotalCapacity(allocator, 8); + try args_list.ensureTotalCapacity(allocator, 16); errdefer args_list.deinit(allocator); try args_list.append(allocator, cmd_name); if (args_str) |args| { - var it = std.mem.tokenizeScalar(u8, args, ' '); - while (it.next()) |arg| { - try args_list.append(allocator, arg); + var i: usize = 0; + 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; + } + } 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]); + } else { + i += 1; + } } } |