summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 08:12:42 +0000
committerLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 08:12:42 +0000
commit1fe2527050761776206110c4da83b57a33b1e18a (patch)
treec0f7b51326b478690a5e020657d855e6e5989a6c /src/main.zig
parent6430308cdfd85ebad6819e5c87fe3036b8f21435 (diff)
downloadshell-zig-1fe2527050761776206110c4da83b57a33b1e18a.tar.gz
shell-zig-1fe2527050761776206110c4da83b57a33b1e18a.zip
codecrafters submit [skip ci]
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig41
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 {