From ae5d7a0c310c7b0acd7a51e97ee46893f3d5b79e Mon Sep 17 00:00:00 2001 From: Jose Colon Rodriguez Date: Sat, 17 Feb 2024 13:31:45 -0400 Subject: Fixed isAsciiOnly and CodePointIterator ASCII bugs --- src/CodePoint.zig | 6 +++--- src/display_width.zig | 9 +++++---- src/main.zig | 6 +++--- 3 files changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/CodePoint.zig b/src/CodePoint.zig index 1c1bec1..62dd793 100644 --- a/src/CodePoint.zig +++ b/src/CodePoint.zig @@ -18,11 +18,11 @@ pub const CodePointIterator = struct { if (self.bytes[self.i] < 128) { // ASCII fast path - defer self.i += 1; + self.i += 1; return .{ - .code = self.bytes[self.i], + .code = self.bytes[self.i - 1], .len = 1, - .offset = self.i, + .offset = self.i - 1, }; } diff --git a/src/display_width.zig b/src/display_width.zig index 2ac7093..ba76052 100644 --- a/src/display_width.zig +++ b/src/display_width.zig @@ -22,16 +22,17 @@ fn isAsciiOnly(str: []const u8) bool { } else true; const Vec = @Vector(vec_len, u8); - var i: usize = 0; + var remaining = str; - while (i < str.len) : (i += vec_len) { - if (str[i..].len < vec_len) return for (str[i..]) |b| { + while (true) { + if (remaining.len < vec_len) return for (remaining) |b| { if (b > 127) break false; } else true; - const v1 = str[0..vec_len].*; + const v1 = remaining[0..vec_len].*; const v2: Vec = @splat(127); if (@reduce(.Or, v1 > v2)) return false; + remaining = remaining[vec_len..]; } return true; diff --git a/src/main.zig b/src/main.zig index 38ba343..7ff07ee 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6,7 +6,7 @@ const std = @import("std"); // const codePointWidth = @import("display_width").codePointWidth; // const strWidth = @import("ziglyph").display_width.strWidth; const strWidth = @import("display_width").strWidth; -const CodePointIterator = @import("CodePoint").CodePointIterator; +// const CodePointIterator = @import("CodePoint").CodePointIterator; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; @@ -16,12 +16,12 @@ pub fn main() !void { const input = try std.fs.cwd().readFileAlloc(allocator, "lang_mix.txt", std.math.maxInt(u32)); defer allocator.free(input); - var result: usize = 0; - // var result: isize = 0; // var iter = GraphemeIterator.init(input); // var iter = CodePointIterator{ .bytes = input }; var iter = std.mem.splitScalar(u8, input, '\n'); + var result: usize = 0; + // var result: isize = 0; var timer = try std.time.Timer.start(); // for (0..50) |_| { -- cgit v1.2.3