@@ 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");
+ }
}
}