summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/builtins.zig28
-rw-r--r--src/parser.zig23
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;
+ }
}
}