From 83fa0c87331115a7afbbac57cf0a4446dc2c4389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Sat, 2 Jul 2022 16:17:10 +0300 Subject: [PATCH] better char debugging experience --- src/Corpus.zig | 4 ++-- src/User.zig | 2 +- src/unix2db/main.zig | 2 +- src/validate.zig | 29 +++++++++++++++++++++-------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Corpus.zig b/src/Corpus.zig index 3c84dc2..edf9899 100644 --- a/src/Corpus.zig +++ b/src/Corpus.zig @@ -196,8 +196,8 @@ pub fn testCorpus(allocator: Allocator) !Corpus { .gid = math.maxInt(u32), .name = "Name" ** 8, .gecos = "Gecos" ** 51, - .home = "Home" ** 16, - .shell = "She.LllL" ** 8, + .home = "/Hom" ** 16, + .shell = "/She.Lll" ** 8, }, User{ .uid = 100000, .gid = 1002, diff --git a/src/User.zig b/src/User.zig index 199bf9e..150b448 100644 --- a/src/User.zig +++ b/src/User.zig @@ -184,7 +184,7 @@ test "User.fromLine" { }, .{ .line = "žemas:x:0:0:root:/root:/bin/bash", - .wantErr = "invalid name 'žemas': invalid character at position 0", + .wantErr = "invalid name 'žemas': invalid character 0xC5 at position 0", }, .{ .line = "root:x:-1:0:root:/root:/bin/bash", diff --git a/src/unix2db/main.zig b/src/unix2db/main.zig index 4d64452..40455b8 100644 --- a/src/unix2db/main.zig +++ b/src/unix2db/main.zig @@ -220,7 +220,7 @@ test "smoke test" { }; const exit_code = execute(allocator, stdout.writer(), stderr.writer(), args); - if (true) return error.SkipZigTest; + //if (true) return error.SkipZigTest; try testing.expectEqualStrings("", stderr.items); try testing.expectEqual(@as(u8, 0), exit_code); } diff --git a/src/validate.zig b/src/validate.zig index 71783c2..871a1a5 100644 --- a/src/validate.zig +++ b/src/validate.zig @@ -1,5 +1,6 @@ const std = @import("std"); const ascii = std.ascii; +const BoundedArray = std.BoundedArray; const ErrCtx = @import("ErrCtx.zig"); @@ -13,6 +14,14 @@ pub fn utf8(s: []const u8) error{InvalidRecord}!void { } } +fn debugChar(c: u8) BoundedArray(u8, 4) { + var res = BoundedArray(u8, 4).init(0) catch unreachable; + if (ascii.isPrint(c)) { + res.writer().print("'{c}'", .{c}) catch unreachable; + } else res.writer().print("0x{X}", .{c}) catch unreachable; + return res; +} + // # adduser žmogus // adduser: To avoid problems, the username should consist only of letters, // digits, underscores, periods, at signs and dashes, and not start with a dash @@ -24,13 +33,17 @@ pub fn name(s: []const u8, err: *ErrCtx) error{InvalidRecord}!void { const c0 = s[0]; if (!(ascii.isAlNum(c0) or c0 == '_' or c0 == '.' or c0 == '@')) - return err.returnf("invalid character at position 0", .{}, error.InvalidRecord); + return err.returnf( + "invalid character {s} at position 0", + .{debugChar(c0).constSlice()}, + error.InvalidRecord, + ); for (s[1..]) |c, i| { if (!(ascii.isAlNum(c) or c == '_' or c == '.' or c == '@' or c == '-')) return err.returnf( - "invalid character at position {d}", - .{i + 2}, + "invalid character {s} at position {d}", + .{ debugChar(c).constSlice(), i + 2 }, error.InvalidRecord, ); } @@ -59,7 +72,7 @@ pub fn path(s: []const u8, err: *ErrCtx) error{InvalidRecord}!void { for (s[1..]) |c, i| { if (!(ascii.isAlNum(c) or c == '/' or c == '_' or c == '.' or c == '@' or c == '-')) return err.returnf( - "invalid character at position {d}", + "invalid character 0xD at position {d}", .{i + 2}, error.InvalidRecord, ); @@ -76,8 +89,8 @@ test "validate name" { .{ .name = "all-good" }, .{ .name = "..." }, .{ .name = "", .wantErr = "cannot be empty" }, - .{ .name = "-no-start-dash", .wantErr = "invalid character at position 0" }, - .{ .name = "Herbasž", .wantErr = "invalid character at position 7" }, + .{ .name = "-no-start-dash", .wantErr = "invalid character '-' at position 0" }, + .{ .name = "Herbasž", .wantErr = "invalid character 0xC5 at position 7" }, }; for (examples) |tt| { var err = ErrCtx{}; @@ -130,8 +143,8 @@ test "validate path" { .{ .path = "/" }, .{ .path = "foo", .wantErr = "must start with /" }, .{ .path = "", .wantErr = "cannot be empty" }, - .{ .path = "/path:motiejus", .wantErr = "invalid character at position 6" }, - .{ .path = "/Herbasž", .wantErr = "invalid character at position 8" }, + .{ .path = "/path:motiejus", .wantErr = "invalid character 0xD at position 6" }, + .{ .path = "/Herbasž", .wantErr = "invalid character 0xD at position 8" }, }; for (examples) |tt| { var err = ErrCtx{};