From 68b17301cd68e4a6149faff16b4d66ea896d167f Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 26 Nov 2025 09:33:04 +0100 Subject: [PATCH] refactor: use unchecked Utf8View in utf8 transformation Internally we use only validated utf8 and unchecked performs much better and reduces unused error values. --- src/buffer/unicode.zig | 21 +++++++-------------- src/tui/mode/mini/find.zig | 2 +- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/buffer/unicode.zig b/src/buffer/unicode.zig index 2da6d18..036cfd8 100644 --- a/src/buffer/unicode.zig +++ b/src/buffer/unicode.zig @@ -106,7 +106,6 @@ pub fn utf8_sanitize(allocator: std.mem.Allocator, input: []const u8) error{ } pub const TransformError = error{ - InvalidUtf8, OutOfMemory, Utf8CannotEncodeSurrogateHalf, CodepointTooLarge, @@ -114,7 +113,7 @@ pub const TransformError = error{ }; fn utf8_write_transform(comptime field: uucode.FieldEnum, writer: *std.Io.Writer, text: []const u8) TransformError!void { - const view: std.unicode.Utf8View = try .init(text); + const view: std.unicode.Utf8View = .initUnchecked(text); var it = view.iterator(); while (it.nextCodepoint()) |cp| { const cp_ = switch (field) { @@ -135,8 +134,8 @@ fn utf8_transform(comptime field: uucode.FieldEnum, allocator: std.mem.Allocator return result.toOwnedSlice(); } -fn utf8_predicate(comptime field: uucode.FieldEnum, text: []const u8) error{InvalidUtf8}!bool { - const view: std.unicode.Utf8View = try .init(text); +fn utf8_predicate(comptime field: uucode.FieldEnum, text: []const u8) bool { + const view: std.unicode.Utf8View = .initUnchecked(text); var it = view.iterator(); while (it.nextCodepoint()) |cp| { const result = switch (field) { @@ -148,13 +147,7 @@ fn utf8_predicate(comptime field: uucode.FieldEnum, text: []const u8) error{Inva return true; } -pub fn to_upper(allocator: std.mem.Allocator, text: []const u8) error{ - InvalidUtf8, - OutOfMemory, - Utf8CannotEncodeSurrogateHalf, - CodepointTooLarge, - WriteFailed, -}![]u8 { +pub fn to_upper(allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 { return utf8_transform(.simple_uppercase_mapping, allocator, text); } @@ -171,14 +164,14 @@ pub fn case_folded_write(writer: *std.Io.Writer, text: []const u8) TransformErro } pub fn switch_case(allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 { - return if (try utf8_predicate(.is_lowercase, text)) + return if (utf8_predicate(.is_lowercase, text)) to_upper(allocator, text) else to_lower(allocator, text); } -pub fn is_lowercase(text: []const u8) error{InvalidUtf8}!bool { - return try utf8_predicate(.is_lowercase, text); +pub fn is_lowercase(text: []const u8) bool { + return utf8_predicate(.is_lowercase, text); } const std = @import("std"); diff --git a/src/tui/mode/mini/find.zig b/src/tui/mode/mini/find.zig index 813a0e9..b5f05c4 100644 --- a/src/tui/mode/mini/find.zig +++ b/src/tui/mode/mini/find.zig @@ -119,7 +119,7 @@ fn flush_input(self: *Self) !void { } fn auto_detect_mode(self: *Self) Buffer.FindMode { - return if (Buffer.unicode.is_lowercase(self.input_.items) catch return .exact) .case_folded else .exact; + return if (Buffer.unicode.is_lowercase(self.input_.items)) .case_folded else .exact; } fn cmd(self: *Self, name_: []const u8, ctx: command.Context) tp.result {