diff options
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/main.zig b/src/main.zig index 20acf0f..74140cd 100644 --- a/src/main.zig +++ b/src/main.zig @@ -297,18 +297,39 @@ pub fn main() !void { var stdout_writer = std.fs.File.stdout().writerStreaming(&.{}); const stdout_iface = &stdout_writer.interface; - if (std.mem.indexOfScalar(u8, cmd, '|')) |pipe_pos| { - var left = cmd[0..pipe_pos]; - var right = if (pipe_pos + 1 < cmd.len) cmd[pipe_pos + 1 ..] else cmd[pipe_pos..pipe_pos]; - while (left.len > 0 and left[0] == ' ') left = left[1..]; - while (left.len > 0 and left[left.len - 1] == ' ') left = left[0 .. left.len - 1]; - while (right.len > 0 and right[0] == ' ') right = right[1..]; - while (right.len > 0 and right[right.len - 1] == ' ') right = right[0 .. right.len - 1]; - - if (left.len == 0 or right.len == 0) { + if (std.mem.indexOfScalar(u8, cmd, '|')) |_| { + var segments = std.ArrayList([]const u8){}; + defer segments.deinit(allocator); + + var invalid = false; + var start: usize = 0; + for (cmd, 0..) |ch, i| { + if (ch == '|') { + const seg = std.mem.trim(u8, cmd[start..i], " "); + if (seg.len == 0) { + try stdout.writeAll("pipe: command not found\n"); + invalid = true; + break; + } + try segments.append(allocator, seg); + start = i + 1; + } + } + if (invalid) continue; + + const last_seg = std.mem.trim(u8, cmd[start..], " "); + if (last_seg.len == 0) { try stdout.writeAll("pipe: command not found\n"); + continue; + } + try segments.append(allocator, last_seg); + + if (segments.items.len == 1) { + const parsed = parser.parseCommand(cmd); + const result = try shell.executeCommand(allocator, stdout_iface, parsed.name, parsed.args, parsed.output_redirect, parsed.error_redirect, parsed.append_output, parsed.append_error); + if (result == .exit_shell) break; } else { - const result = try shell.executePipeline(allocator, stdout_iface, left, right); + const result = try shell.executePipeline(allocator, stdout_iface, segments.items); if (result == .exit_shell) break; } } else { |