diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/builtins.zig | 17 | ||||
| -rw-r--r-- | src/shell.zig | 2 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/builtins.zig b/src/builtins.zig index 011a923..18e1840 100644 --- a/src/builtins.zig +++ b/src/builtins.zig @@ -116,8 +116,21 @@ pub fn executeType(allocator: std.mem.Allocator, stdout: anytype, args: ?[]const } } -pub fn executeHistory(stdout: anytype, history_list: []const []const u8) !void { - for (history_list, 1..) |cmd, idx| { +pub fn executeHistory(stdout: anytype, history_list: []const []const u8, args: ?[]const u8) !void { + var limit: usize = history_list.len; + + if (args) |a| { + const trimmed = std.mem.trim(u8, a, " "); + if (trimmed.len > 0) { + limit = std.fmt.parseInt(usize, trimmed, 10) catch { + try stdout.print("history: invalid argument\n", .{}); + return; + }; + } + } + + const start = if (limit < history_list.len) history_list.len - limit else 0; + for (history_list[start..], start + 1..) |cmd, idx| { try stdout.print(" {d} {s}\n", .{ idx, cmd }); } } diff --git a/src/shell.zig b/src/shell.zig index 6f8bfef..bd50ff1 100644 --- a/src/shell.zig +++ b/src/shell.zig @@ -24,7 +24,7 @@ pub fn executeCommand( if (std.mem.eql(u8, cmd_name, "exit")) return builtins.executeExit(); if (std.mem.eql(u8, cmd_name, "history")) { - try builtins.executeHistory(stdout, history_list); + try builtins.executeHistory(stdout, history_list, args); return .continue_loop; } |