summaryrefslogtreecommitdiff
path: root/src/builtins.zig
diff options
context:
space:
mode:
authorLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 06:04:05 +0000
committerLucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br>2025-12-05 06:04:05 +0000
commit2fdd42785cc0bd12971f2c475171f4fb7e56527b (patch)
tree6e80f1d43dbdb9506ecec468465fab228872b247 /src/builtins.zig
parent05a0a6e2fc2eed8eca048322d5e4384f3c4050dc (diff)
downloadshell-zig-2fdd42785cc0bd12971f2c475171f4fb7e56527b.tar.gz
shell-zig-2fdd42785cc0bd12971f2c475171f4fb7e56527b.zip
codecrafters submit [skip ci]
Diffstat (limited to 'src/builtins.zig')
-rw-r--r--src/builtins.zig25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/builtins.zig b/src/builtins.zig
index 07c278b..3686c61 100644
--- a/src/builtins.zig
+++ b/src/builtins.zig
@@ -33,15 +33,34 @@ pub fn executePwd(allocator: std.mem.Allocator, stdout: anytype) !void {
try stdout.print("{s}\n", .{cwd});
}
-pub fn executeCd(stdout: anytype, args: ?[]const u8) !void {
+pub fn executeCd(allocator: std.mem.Allocator, stdout: anytype, args: ?[]const u8) !void {
if (args == null or args.?.len == 0) {
try stdout.print("cd: missing argument\n", .{});
return;
}
- const dir = std.mem.trim(u8, args.?, " ");
+ const arg = std.mem.trim(u8, args.?, " ");
+ var path_buf: [512]u8 = undefined;
+ var dir: []const u8 = arg;
+
+ if (std.mem.eql(u8, arg, "~")) {
+ const home = std.process.getEnvVarOwned(allocator, "HOME") catch {
+ try stdout.print("cd: HOME not set\n", .{});
+ return;
+ };
+ defer allocator.free(home);
+ dir = try std.fmt.bufPrint(&path_buf, "{s}", .{home});
+ } else if (std.mem.startsWith(u8, arg, "~/")) {
+ const home = std.process.getEnvVarOwned(allocator, "HOME") catch {
+ try stdout.print("cd: HOME not set\n", .{});
+ return;
+ };
+ defer allocator.free(home);
+ dir = try std.fmt.bufPrint(&path_buf, "{s}/{s}", .{ home, arg[2..] });
+ }
+
std.posix.chdir(dir) catch {
- try stdout.print("cd: {s}: No such file or directory\n", .{dir});
+ try stdout.print("cd: {s}: No such file or directory\n", .{arg});
};
}