summaryrefslogtreecommitdiff
path: root/src/parser.zig
diff options
context:
space:
mode:
authorLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 05:53:37 +0000
committerLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 05:53:37 +0000
commit2515de92a5ae28edda56deba40c852f36928b294 (patch)
treecc048d51ba7dd6fc78376f02e1c12af1161c7d38 /src/parser.zig
parent695b1fa1dc95d62016978a517b8e8544e486d9b2 (diff)
downloadshell-zig-2515de92a5ae28edda56deba40c852f36928b294.tar.gz
shell-zig-2515de92a5ae28edda56deba40c852f36928b294.zip
codecrafters submit [skip ci]
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig31
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);
+}