From 340e7fe0bc6630f1cc60bcc6fc25f851b26c5387 Mon Sep 17 00:00:00 2001 From: Travis Cole <11240+kelp@users.noreply.github.com> Date: Mon, 30 Mar 2026 20:03:30 -0700 Subject: [PATCH] Fix seq, cut, tr exit codes and range parsing seq: return exit 2 (misuse) for invalid flags, matching POSIX convention for argument errors. cut: accept spaces as range list separators (e.g., -b '1 3 5'), matching GNU behavior. tr: return exit 1 (general_error) for extra operands, matching GNU behavior. --- src/cut.zig | 2 +- src/seq.zig | 2 +- src/tr.zig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cut.zig b/src/cut.zig index 9c25fec..ccd0cd2 100644 --- a/src/cut.zig +++ b/src/cut.zig @@ -63,7 +63,7 @@ fn parseRangeList(allocator: Allocator, list_str: []const u8) ![]Range { var ranges = std.ArrayListUnmanaged(Range){}; defer ranges.deinit(allocator); - var iter = std.mem.tokenizeScalar(u8, list_str, ','); + var iter = std.mem.tokenizeAny(u8, list_str, ", "); while (iter.next()) |token| { const trimmed = std.mem.trim(u8, token, " "); if (trimmed.len == 0) continue; diff --git a/src/seq.zig b/src/seq.zig index d075205..7b269fd 100644 --- a/src/seq.zig +++ b/src/seq.zig @@ -475,7 +475,7 @@ pub fn runSeq(allocator: Allocator, args: []const []const u8, stdout_writer: any switch (err) { error.UnknownFlag => { common.printErrorWithProgram(allocator, stderr_writer, "seq", "unrecognized option", .{}); - return @intFromEnum(common.ExitCode.general_error); + return @intFromEnum(common.ExitCode.misuse); }, error.MissingValue => { common.printErrorWithProgram(allocator, stderr_writer, "seq", "option missing required argument", .{}); diff --git a/src/tr.zig b/src/tr.zig index 0fefe74..3fd99bb 100644 --- a/src/tr.zig +++ b/src/tr.zig @@ -505,7 +505,7 @@ fn runTrWithInput( const max_positionals: usize = if (args.delete and !args.squeeze_repeats) 1 else 2; if (args.positionals.len > max_positionals) { common.printErrorWithProgram(allocator, stderr_writer, prog_name, "extra operand '{s}'", .{args.positionals[max_positionals]}); - return @intFromEnum(common.ExitCode.misuse); + return @intFromEnum(common.ExitCode.general_error); } // Parse SET1