diff options
| author | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 05:53:37 +0000 |
|---|---|---|
| committer | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 05:53:37 +0000 |
| commit | 2515de92a5ae28edda56deba40c852f36928b294 (patch) | |
| tree | cc048d51ba7dd6fc78376f02e1c12af1161c7d38 /src/parser.zig | |
| parent | 695b1fa1dc95d62016978a517b8e8544e486d9b2 (diff) | |
| download | shell-zig-2515de92a5ae28edda56deba40c852f36928b294.tar.gz shell-zig-2515de92a5ae28edda56deba40c852f36928b294.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'src/parser.zig')
| -rw-r--r-- | src/parser.zig | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/parser.zig b/src/parser.zig new file mode 100644 index 0000000..4909464 --- /dev/null +++ b/src/parser.zig @@ -0,0 +1,31 @@ +const std = @import("std"); + +pub const ParsedCommand = struct { + name: []const u8, + args: ?[]const u8, +}; + +pub fn parseCommand(input: []const u8) ParsedCommand { + const space_pos = std.mem.indexOfScalar(u8, input, ' '); + if (space_pos) |pos| { + return .{ .name = input[0..pos], .args = input[pos + 1 ..] }; + } + return .{ .name = input, .args = null }; +} + +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); + 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); + } + } + + return args_list.toOwnedSlice(allocator); +} |