summaryrefslogtreecommitdiff
path: root/src/NormPropsData.zig
diff options
context:
space:
mode:
authorGravatar Sam Atman2026-02-04 18:01:36 -0500
committerGravatar Sam Atman2026-02-04 18:01:36 -0500
commitba5d9081b479e95ffa7f3baf751beedd370cec14 (patch)
treec12041d8aab9f9ff68b25a2e2c9042073c3d5f61 /src/NormPropsData.zig
parentConvert Words module to no-allocation (diff)
downloadzg-ba5d9081b479e95ffa7f3baf751beedd370cec14.tar.gz
zg-ba5d9081b479e95ffa7f3baf751beedd370cec14.tar.xz
zg-ba5d9081b479e95ffa7f3baf751beedd370cec14.zip
Normalization and case folding
Both of which deserve some further attention.
Diffstat (limited to 'src/NormPropsData.zig')
-rw-r--r--src/NormPropsData.zig46
1 files changed, 15 insertions, 31 deletions
diff --git a/src/NormPropsData.zig b/src/NormPropsData.zig
index 7b53542..cca3556 100644
--- a/src/NormPropsData.zig
+++ b/src/NormPropsData.zig
@@ -1,48 +1,32 @@
1//! Normalization Properties Data 1//! Normalization Properties Data
2 2
3s1: []u16 = undefined, 3const Data = struct {
4s2: []u4 = undefined, 4 s1: []const u16 = undefined,
5 s2: []const u3 = undefined,
6};
7
8const norms = norm_props_data: {
9 const data = @import("normp");
10 break :norm_props_data Data{
11 .s1 = &data.s1,
12 .s2 = &data.s2,
13 };
14};
5 15
6const NormProps = @This(); 16const NormProps = @This();
7 17
8pub fn init(allocator: mem.Allocator) !NormProps {
9 const in_bytes = @embedFile("normp");
10 var in_fbs = std.io.fixedBufferStream(in_bytes);
11 var reader = in_fbs.reader();
12
13 const endian = builtin.cpu.arch.endian();
14 var norms = NormProps{};
15
16 const stage_1_len: u16 = try reader.readInt(u16, endian);
17 norms.s1 = try allocator.alloc(u16, stage_1_len);
18 errdefer allocator.free(norms.s1);
19 for (0..stage_1_len) |i| norms.s1[i] = try reader.readInt(u16, endian);
20
21 const stage_2_len: u16 = try reader.readInt(u16, endian);
22 norms.s2 = try allocator.alloc(u4, stage_2_len);
23 errdefer allocator.free(norms.s2);
24 for (0..stage_2_len) |i| norms.s2[i] = @intCast(try reader.readInt(u8, endian));
25
26 return norms;
27}
28
29pub fn deinit(norms: *const NormProps, allocator: mem.Allocator) void {
30 allocator.free(norms.s1);
31 allocator.free(norms.s2);
32}
33
34/// Returns true if `cp` is already in NFD form. 18/// Returns true if `cp` is already in NFD form.
35pub fn isNfd(norms: *const NormProps, cp: u21) bool { 19pub fn isNfd(cp: u21) bool {
36 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 1 == 0; 20 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 1 == 0;
37} 21}
38 22
39/// Returns true if `cp` is already in NFKD form. 23/// Returns true if `cp` is already in NFKD form.
40pub fn isNfkd(norms: *const NormProps, cp: u21) bool { 24pub fn isNfkd(cp: u21) bool {
41 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 2 == 0; 25 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 2 == 0;
42} 26}
43 27
44/// Returns true if `cp` is not allowed in any normalized form. 28/// Returns true if `cp` is not allowed in any normalized form.
45pub fn isFcx(norms: *const NormProps, cp: u21) bool { 29pub fn isFcx(cp: u21) bool {
46 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 4 == 4; 30 return norms.s2[norms.s1[cp >> 8] + (cp & 0xff)] & 4 == 4;
47} 31}
48 32