~alva/moj

37fafd8f615d9a6993185e5b2e45dbd0e1421b1a — ugla 1 year, 5 months ago 04ea545
Handle codepoints that cannot be printed as UTF-8
1 files changed, 10 insertions(+), 5 deletions(-)

M src/main.zig
M src/main.zig => src/main.zig +10 -5
@@ 27,27 27,32 @@ fn writeMatches(writer: anytype, needle: []const u8) !void {
}

fn writeMatch(writer: anytype, line: []const u8, needle: []const u8) !void {
    var utf8_char: [8]u8 = undefined;
    var col_it = std.mem.split(u8, line, ";");
    const code = col_it.next() orelse return error.MissingCode;
    const name = col_it.next() orelse return error.MissingName;

    if (std.mem.indexOf(u8, name, needle)) |idx| {
        var buf: [1024]u8 = undefined;
        const category = col_it.next() orelse return error.MissingCategory;
        const cp = try std.fmt.parseInt(u21, code, 16);
        const len = try std.unicode.utf8Encode(cp, &utf8_char);
        var buf: [1024]u8 = undefined;
        const fancy_name = try std.fmt.bufPrint(&buf, "{s}\x1b[1m{s}\x1b[0m{s}", .{
            name[0..idx],
            name[idx .. idx + needle.len],
            name[idx + needle.len ..],
        });
        try writer.print("0x{x:<6} {s:<40} {s:<4} {s}\n", .{

        try writer.print("0x{x:<6} {s:<40} {s:<4} ", .{
            cp,
            fancy_name,
            category,
            utf8_char[0..len],
        });

        if (std.unicode.utf8ValidCodepoint(cp)) {
            const len = std.unicode.utf8Encode(cp, &buf) catch unreachable; // check has already been made
            try writer.print("{s}\n", .{buf[0..len]});
        } else {
            try writer.writeAll("<not printable>\n");
        }
    }
}