summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/builtins.zig6
-rw-r--r--src/parser.zig29
2 files changed, 25 insertions, 10 deletions
diff --git a/src/builtins.zig b/src/builtins.zig
index 1326b98..409b57d 100644
--- a/src/builtins.zig
+++ b/src/builtins.zig
@@ -29,7 +29,11 @@ pub fn executeEcho(stdout: anytype, args: ?[]const u8) !void {
var last_was_space = false;
while (i < a.len) : (i += 1) {
- if (!in_quote and (a[i] == '\'' or a[i] == '"')) {
+ if (!in_quote and a[i] == '\\' and i + 1 < a.len) {
+ i += 1;
+ _ = unquoted.append(std.heap.page_allocator, a[i]) catch {};
+ last_was_space = false;
+ } else if (!in_quote and (a[i] == '\'' or a[i] == '"')) {
in_quote = true;
quote_char = a[i];
last_was_space = false;
diff --git a/src/parser.zig b/src/parser.zig
index ba1655a..de42f31 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -22,24 +22,35 @@ pub fn parseArgs(allocator: std.mem.Allocator, cmd_name: []const u8, args_str: ?
if (args_str) |args| {
var i: usize = 0;
+ var arg_buf = std.ArrayList(u8){};
+ defer arg_buf.deinit(allocator);
+
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;
+ while (i < args.len and args[i] != quote) : (i += 1) {
+ try arg_buf.append(allocator, args[i]);
+ }
+ if (i < args.len) i += 1;
+ } else if (args[i] == '\\' and i + 1 < args.len) {
+ i += 1;
+ try arg_buf.append(allocator, args[i]);
+ i += 1;
+ } else if (args[i] == ' ') {
+ if (arg_buf.items.len > 0) {
+ try args_list.append(allocator, try arg_buf.toOwnedSlice(allocator));
}
- } 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]);
+ i += 1;
} else {
+ try arg_buf.append(allocator, args[i]);
i += 1;
}
}
+
+ if (arg_buf.items.len > 0) {
+ try args_list.append(allocator, try arg_buf.toOwnedSlice(allocator));
+ }
}
return args_list.toOwnedSlice(allocator);