summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 07:57:40 +0000
committerLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 07:57:40 +0000
commit16c43f33f8f7302a07778153aff59f565592bad8 (patch)
tree87f27926a1c64bcafa0cfc07c89821ef657e8b35 /src/main.zig
parenteef2bd90f9549858ab61d0bb697906fa1e41a373 (diff)
downloadshell-zig-16c43f33f8f7302a07778153aff59f565592bad8.tar.gz
shell-zig-16c43f33f8f7302a07778153aff59f565592bad8.zip
codecrafters submit [skip ci]
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/main.zig b/src/main.zig
index 46bee15..20acf0f 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -294,15 +294,30 @@ pub fn main() !void {
if (command) |cmd| {
defer allocator.free(cmd);
try stdout.writeAll("\n");
-
- const parsed = parser.parseCommand(cmd);
-
var stdout_writer = std.fs.File.stdout().writerStreaming(&.{});
const stdout_iface = &stdout_writer.interface;
- 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 (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 (result == .exit_shell) break;
+ if (left.len == 0 or right.len == 0) {
+ try stdout.writeAll("pipe: command not found\n");
+ } else {
+ const result = try shell.executePipeline(allocator, stdout_iface, left, right);
+ if (result == .exit_shell) break;
+ }
+ } else {
+ 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 {
break;
}