From 2803d94dc4a4d3445986da484897a9d7d9b0a93a Mon Sep 17 00:00:00 2001 From: Lucas Faria Mendes Date: Fri, 5 Dec 2025 03:08:15 -0300 Subject: codecrafters submit [skip ci] --- src/builtins.zig | 28 +++++++++++++++++++++++++++- src/parser.zig | 23 +++++++++++++++++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/builtins.zig b/src/builtins.zig index 3686c61..1326b98 100644 --- a/src/builtins.zig +++ b/src/builtins.zig @@ -21,7 +21,33 @@ pub fn executeExit() CommandResult { pub fn executeEcho(stdout: anytype, args: ?[]const u8) !void { if (args) |a| { - try stdout.print("{s}\n", .{a}); + var i: usize = 0; + var in_quote = false; + var quote_char: u8 = 0; + var unquoted = std.ArrayList(u8){}; + defer unquoted.deinit(std.heap.page_allocator); + var last_was_space = false; + + while (i < a.len) : (i += 1) { + if (!in_quote and (a[i] == '\'' or a[i] == '"')) { + in_quote = true; + quote_char = a[i]; + last_was_space = false; + } else if (in_quote and a[i] == quote_char) { + in_quote = false; + last_was_space = false; + } else if (!in_quote and a[i] == ' ') { + if (!last_was_space) { + _ = unquoted.append(std.heap.page_allocator, ' ') catch {}; + last_was_space = true; + } + } else { + _ = unquoted.append(std.heap.page_allocator, a[i]) catch {}; + last_was_space = false; + } + } + + try stdout.print("{s}\n", .{unquoted.items}); } else { try stdout.print("\n", .{}); } 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; + } } } -- cgit v1.2.3