summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jose Colon Rodriguez2024-03-27 21:52:02 -0400
committerGravatar Jose Colon Rodriguez2024-03-27 21:52:02 -0400
commit4ce891a8ce5336da39180964792110e131756cdd (patch)
treeb4ff0180157bb49e15d2c36f2cf0cdaab1a24535 /src
parentFriendly general category methods (diff)
downloadzg-4ce891a8ce5336da39180964792110e131756cdd.tar.gz
zg-4ce891a8ce5336da39180964792110e131756cdd.tar.xz
zg-4ce891a8ce5336da39180964792110e131756cdd.zip
ScriptsData and made all Datas const
Diffstat (limited to 'src')
-rw-r--r--src/CanonData.zig2
-rw-r--r--src/CaseData.zig10
-rw-r--r--src/CaseFold.zig8
-rw-r--r--src/CombiningData.zig2
-rw-r--r--src/CompatData.zig2
-rw-r--r--src/DisplayWidth.zig10
-rw-r--r--src/FoldData.zig2
-rw-r--r--src/GenCatData.zig2
-rw-r--r--src/GraphemeData.zig2
-rw-r--r--src/HangulData.zig2
-rw-r--r--src/NormData.zig2
-rw-r--r--src/NormPropsData.zig2
-rw-r--r--src/Normalize.zig58
-rw-r--r--src/NumericData.zig4
-rw-r--r--src/ScriptsData.zig226
-rw-r--r--src/WidthData.zig2
-rw-r--r--src/grapheme.zig4
17 files changed, 283 insertions, 57 deletions
diff --git a/src/CanonData.zig b/src/CanonData.zig
index 36895ff..9f1deb8 100644
--- a/src/CanonData.zig
+++ b/src/CanonData.zig
@@ -42,7 +42,7 @@ pub fn init(allocator: mem.Allocator) !Self {
42 return self; 42 return self;
43} 43}
44 44
45pub fn deinit(self: *Self) void { 45pub fn deinit(self: *const Self) void {
46 self.nfc.deinit(); 46 self.nfc.deinit();
47 for (self.nfd) |slice| self.allocator.free(slice); 47 for (self.nfd) |slice| self.allocator.free(slice);
48 self.allocator.free(self.nfd); 48 self.allocator.free(self.nfd);
diff --git a/src/CaseData.zig b/src/CaseData.zig
index 4f06636..c9ccc1e 100644
--- a/src/CaseData.zig
+++ b/src/CaseData.zig
@@ -77,7 +77,7 @@ pub fn init(allocator: mem.Allocator) !Self {
77 return self; 77 return self;
78} 78}
79 79
80pub fn deinit(self: *Self) void { 80pub fn deinit(self: *const Self) void {
81 self.allocator.free(self.case_map); 81 self.allocator.free(self.case_map);
82 self.allocator.free(self.prop_s1); 82 self.allocator.free(self.prop_s1);
83 self.allocator.free(self.prop_s2); 83 self.allocator.free(self.prop_s2);
@@ -103,7 +103,7 @@ pub fn isUpperStr(self: Self, str: []const u8) bool {
103} 103}
104 104
105test "isUpperStr" { 105test "isUpperStr" {
106 var cd = try init(testing.allocator); 106 const cd = try init(testing.allocator);
107 defer cd.deinit(); 107 defer cd.deinit();
108 108
109 try testing.expect(cd.isUpperStr("HELLO, WORLD 2112!")); 109 try testing.expect(cd.isUpperStr("HELLO, WORLD 2112!"));
@@ -138,7 +138,7 @@ pub fn toUpperStr(
138} 138}
139 139
140test "toUpperStr" { 140test "toUpperStr" {
141 var cd = try init(testing.allocator); 141 const cd = try init(testing.allocator);
142 defer cd.deinit(); 142 defer cd.deinit();
143 143
144 const uppered = try cd.toUpperStr(testing.allocator, "Hello, World 2112!"); 144 const uppered = try cd.toUpperStr(testing.allocator, "Hello, World 2112!");
@@ -161,7 +161,7 @@ pub fn isLowerStr(self: Self, str: []const u8) bool {
161} 161}
162 162
163test "isLowerStr" { 163test "isLowerStr" {
164 var cd = try init(testing.allocator); 164 const cd = try init(testing.allocator);
165 defer cd.deinit(); 165 defer cd.deinit();
166 166
167 try testing.expect(cd.isLowerStr("hello, world 2112!")); 167 try testing.expect(cd.isLowerStr("hello, world 2112!"));
@@ -196,7 +196,7 @@ pub fn toLowerStr(
196} 196}
197 197
198test "toLowerStr" { 198test "toLowerStr" {
199 var cd = try init(testing.allocator); 199 const cd = try init(testing.allocator);
200 defer cd.deinit(); 200 defer cd.deinit();
201 201
202 const lowered = try cd.toLowerStr(testing.allocator, "Hello, World 2112!"); 202 const lowered = try cd.toLowerStr(testing.allocator, "Hello, World 2112!");
diff --git a/src/CaseFold.zig b/src/CaseFold.zig
index e00d03b..9b10e16 100644
--- a/src/CaseFold.zig
+++ b/src/CaseFold.zig
@@ -90,11 +90,11 @@ pub fn compatCaselessMatch(
90test "compatCaselessMatch" { 90test "compatCaselessMatch" {
91 const allocator = testing.allocator; 91 const allocator = testing.allocator;
92 92
93 var norm_data = try Normalize.NormData.init(allocator); 93 const norm_data = try Normalize.NormData.init(allocator);
94 defer norm_data.deinit(); 94 defer norm_data.deinit();
95 const n = Normalize{ .norm_data = &norm_data }; 95 const n = Normalize{ .norm_data = &norm_data };
96 96
97 var fold_data = try FoldData.init(allocator); 97 const fold_data = try FoldData.init(allocator);
98 defer fold_data.deinit(); 98 defer fold_data.deinit();
99 const caser = Self{ .fold_data = &fold_data }; 99 const caser = Self{ .fold_data = &fold_data };
100 100
@@ -163,11 +163,11 @@ pub fn canonCaselessMatch(
163test "canonCaselessMatch" { 163test "canonCaselessMatch" {
164 const allocator = testing.allocator; 164 const allocator = testing.allocator;
165 165
166 var norm_data = try Normalize.NormData.init(allocator); 166 const norm_data = try Normalize.NormData.init(allocator);
167 defer norm_data.deinit(); 167 defer norm_data.deinit();
168 const n = Normalize{ .norm_data = &norm_data }; 168 const n = Normalize{ .norm_data = &norm_data };
169 169
170 var fold_data = try FoldData.init(allocator); 170 const fold_data = try FoldData.init(allocator);
171 defer fold_data.deinit(); 171 defer fold_data.deinit();
172 const caser = Self{ .fold_data = &fold_data }; 172 const caser = Self{ .fold_data = &fold_data };
173 173
diff --git a/src/CombiningData.zig b/src/CombiningData.zig
index 95c947d..c67638c 100644
--- a/src/CombiningData.zig
+++ b/src/CombiningData.zig
@@ -32,7 +32,7 @@ pub fn init(allocator: mem.Allocator) !Self {
32 return self; 32 return self;
33} 33}
34 34
35pub fn deinit(self: *Self) void { 35pub fn deinit(self: *const Self) void {
36 self.allocator.free(self.s1); 36 self.allocator.free(self.s1);
37 self.allocator.free(self.s2); 37 self.allocator.free(self.s2);
38} 38}
diff --git a/src/CompatData.zig b/src/CompatData.zig
index fd7f678..67c43e6 100644
--- a/src/CompatData.zig
+++ b/src/CompatData.zig
@@ -37,7 +37,7 @@ pub fn init(allocator: mem.Allocator) !Self {
37 return self; 37 return self;
38} 38}
39 39
40pub fn deinit(self: *Self) void { 40pub fn deinit(self: *const Self) void {
41 for (self.nfkd) |slice| { 41 for (self.nfkd) |slice| {
42 if (slice.len != 0) self.allocator.free(slice); 42 if (slice.len != 0) self.allocator.free(slice);
43 } 43 }
diff --git a/src/DisplayWidth.zig b/src/DisplayWidth.zig
index 8d5eb0f..e547adf 100644
--- a/src/DisplayWidth.zig
+++ b/src/DisplayWidth.zig
@@ -56,7 +56,7 @@ pub fn strWidth(self: Self, str: []const u8) usize {
56} 56}
57 57
58test "strWidth" { 58test "strWidth" {
59 var data = try DisplayWidthData.init(testing.allocator); 59 const data = try DisplayWidthData.init(testing.allocator);
60 defer data.deinit(); 60 defer data.deinit();
61 const self = Self{ .data = &data }; 61 const self = Self{ .data = &data };
62 62
@@ -157,7 +157,7 @@ pub fn center(
157 157
158test "center" { 158test "center" {
159 const allocator = testing.allocator; 159 const allocator = testing.allocator;
160 var data = try DisplayWidthData.init(allocator); 160 const data = try DisplayWidthData.init(allocator);
161 defer data.deinit(); 161 defer data.deinit();
162 const self = Self{ .data = &data }; 162 const self = Self{ .data = &data };
163 163
@@ -236,7 +236,7 @@ pub fn padLeft(
236 236
237test "padLeft" { 237test "padLeft" {
238 const allocator = testing.allocator; 238 const allocator = testing.allocator;
239 var data = try DisplayWidthData.init(allocator); 239 const data = try DisplayWidthData.init(allocator);
240 defer data.deinit(); 240 defer data.deinit();
241 const self = Self{ .data = &data }; 241 const self = Self{ .data = &data };
242 242
@@ -286,7 +286,7 @@ pub fn padRight(
286 286
287test "padRight" { 287test "padRight" {
288 const allocator = testing.allocator; 288 const allocator = testing.allocator;
289 var data = try DisplayWidthData.init(allocator); 289 const data = try DisplayWidthData.init(allocator);
290 defer data.deinit(); 290 defer data.deinit();
291 const self = Self{ .data = &data }; 291 const self = Self{ .data = &data };
292 292
@@ -339,7 +339,7 @@ pub fn wrap(
339 339
340test "wrap" { 340test "wrap" {
341 const allocator = testing.allocator; 341 const allocator = testing.allocator;
342 var data = try DisplayWidthData.init(allocator); 342 const data = try DisplayWidthData.init(allocator);
343 defer data.deinit(); 343 defer data.deinit();
344 const self = Self{ .data = &data }; 344 const self = Self{ .data = &data };
345 345
diff --git a/src/FoldData.zig b/src/FoldData.zig
index 2a9a1f5..e387447 100644
--- a/src/FoldData.zig
+++ b/src/FoldData.zig
@@ -41,7 +41,7 @@ pub fn init(allocator: mem.Allocator) !Self {
41 return self; 41 return self;
42} 42}
43 43
44pub fn deinit(self: *Self) void { 44pub fn deinit(self: *const Self) void {
45 for (self.fold) |slice| self.allocator.free(slice); 45 for (self.fold) |slice| self.allocator.free(slice);
46 self.allocator.free(self.fold); 46 self.allocator.free(self.fold);
47 self.allocator.free(self.cwcf); 47 self.allocator.free(self.cwcf);
diff --git a/src/GenCatData.zig b/src/GenCatData.zig
index b45135b..37ae037 100644
--- a/src/GenCatData.zig
+++ b/src/GenCatData.zig
@@ -71,7 +71,7 @@ pub fn init(allocator: mem.Allocator) !Self {
71 return self; 71 return self;
72} 72}
73 73
74pub fn deinit(self: *Self) void { 74pub fn deinit(self: *const Self) void {
75 self.allocator.free(self.s1); 75 self.allocator.free(self.s1);
76 self.allocator.free(self.s2); 76 self.allocator.free(self.s2);
77 self.allocator.free(self.s3); 77 self.allocator.free(self.s3);
diff --git a/src/GraphemeData.zig b/src/GraphemeData.zig
index e418dea..971929a 100644
--- a/src/GraphemeData.zig
+++ b/src/GraphemeData.zig
@@ -64,7 +64,7 @@ pub fn init(allocator: mem.Allocator) !Self {
64 return self; 64 return self;
65} 65}
66 66
67pub fn deinit(self: *Self) void { 67pub fn deinit(self: *const Self) void {
68 self.allocator.free(self.s1); 68 self.allocator.free(self.s1);
69 self.allocator.free(self.s2); 69 self.allocator.free(self.s2);
70 self.allocator.free(self.s3); 70 self.allocator.free(self.s3);
diff --git a/src/HangulData.zig b/src/HangulData.zig
index b97424c..ec360e9 100644
--- a/src/HangulData.zig
+++ b/src/HangulData.zig
@@ -41,7 +41,7 @@ pub fn init(allocator: mem.Allocator) !Self {
41 return self; 41 return self;
42} 42}
43 43
44pub fn deinit(self: *Self) void { 44pub fn deinit(self: *const Self) void {
45 self.allocator.free(self.s1); 45 self.allocator.free(self.s1);
46 self.allocator.free(self.s2); 46 self.allocator.free(self.s2);
47} 47}
diff --git a/src/NormData.zig b/src/NormData.zig
index 8a7fa49..413619a 100644
--- a/src/NormData.zig
+++ b/src/NormData.zig
@@ -26,7 +26,7 @@ pub fn init(allocator: std.mem.Allocator) !Self {
26 }; 26 };
27} 27}
28 28
29pub fn deinit(self: *Self) void { 29pub fn deinit(self: *const Self) void {
30 self.canon_data.deinit(); 30 self.canon_data.deinit();
31 self.ccc_data.deinit(); 31 self.ccc_data.deinit();
32 self.compat_data.deinit(); 32 self.compat_data.deinit();
diff --git a/src/NormPropsData.zig b/src/NormPropsData.zig
index 3c49712..893a8d0 100644
--- a/src/NormPropsData.zig
+++ b/src/NormPropsData.zig
@@ -32,7 +32,7 @@ pub fn init(allocator: mem.Allocator) !Self {
32 return self; 32 return self;
33} 33}
34 34
35pub fn deinit(self: *Self) void { 35pub fn deinit(self: *const Self) void {
36 self.allocator.free(self.s1); 36 self.allocator.free(self.s1);
37 self.allocator.free(self.s2); 37 self.allocator.free(self.s2);
38} 38}
diff --git a/src/Normalize.zig b/src/Normalize.zig
index 6ef7c90..daf774d 100644
--- a/src/Normalize.zig
+++ b/src/Normalize.zig
@@ -177,7 +177,7 @@ fn decompose(
177 177
178test "decompose" { 178test "decompose" {
179 const allocator = testing.allocator; 179 const allocator = testing.allocator;
180 var data = try NormData.init(allocator); 180 const data = try NormData.init(allocator);
181 defer data.deinit(); 181 defer data.deinit();
182 var n = Self{ .norm_data = &data }; 182 var n = Self{ .norm_data = &data };
183 183
@@ -225,7 +225,7 @@ pub const Result = struct {
225 allocator: ?mem.Allocator = null, 225 allocator: ?mem.Allocator = null,
226 slice: []const u8, 226 slice: []const u8,
227 227
228 pub fn deinit(self: *Result) void { 228 pub fn deinit(self: *const Result) void {
229 if (self.allocator) |allocator| allocator.free(self.slice); 229 if (self.allocator) |allocator| allocator.free(self.slice);
230 } 230 }
231}; 231};
@@ -297,11 +297,11 @@ fn nfxd(self: Self, allocator: mem.Allocator, str: []const u8, form: Form) !Resu
297 297
298test "nfd ASCII / no-alloc" { 298test "nfd ASCII / no-alloc" {
299 const allocator = testing.allocator; 299 const allocator = testing.allocator;
300 var data = try NormData.init(allocator); 300 const data = try NormData.init(allocator);
301 defer data.deinit(); 301 defer data.deinit();
302 var n = Self{ .norm_data = &data }; 302 const n = Self{ .norm_data = &data };
303 303
304 var result = try n.nfd(allocator, "Hello World!"); 304 const result = try n.nfd(allocator, "Hello World!");
305 defer result.deinit(); 305 defer result.deinit();
306 306
307 try testing.expectEqualStrings("Hello World!", result.slice); 307 try testing.expectEqualStrings("Hello World!", result.slice);
@@ -309,11 +309,11 @@ test "nfd ASCII / no-alloc" {
309 309
310test "nfd !ASCII / alloc" { 310test "nfd !ASCII / alloc" {
311 const allocator = testing.allocator; 311 const allocator = testing.allocator;
312 var data = try NormData.init(allocator); 312 const data = try NormData.init(allocator);
313 defer data.deinit(); 313 defer data.deinit();
314 var n = Self{ .norm_data = &data }; 314 const n = Self{ .norm_data = &data };
315 315
316 var result = try n.nfd(allocator, "Héllo World! \u{3d3}"); 316 const result = try n.nfd(allocator, "Héllo World! \u{3d3}");
317 defer result.deinit(); 317 defer result.deinit();
318 318
319 try testing.expectEqualStrings("He\u{301}llo World! \u{3d2}\u{301}", result.slice); 319 try testing.expectEqualStrings("He\u{301}llo World! \u{3d2}\u{301}", result.slice);
@@ -321,11 +321,11 @@ test "nfd !ASCII / alloc" {
321 321
322test "nfkd ASCII / no-alloc" { 322test "nfkd ASCII / no-alloc" {
323 const allocator = testing.allocator; 323 const allocator = testing.allocator;
324 var data = try NormData.init(allocator); 324 const data = try NormData.init(allocator);
325 defer data.deinit(); 325 defer data.deinit();
326 var n = Self{ .norm_data = &data }; 326 const n = Self{ .norm_data = &data };
327 327
328 var result = try n.nfkd(allocator, "Hello World!"); 328 const result = try n.nfkd(allocator, "Hello World!");
329 defer result.deinit(); 329 defer result.deinit();
330 330
331 try testing.expectEqualStrings("Hello World!", result.slice); 331 try testing.expectEqualStrings("Hello World!", result.slice);
@@ -333,11 +333,11 @@ test "nfkd ASCII / no-alloc" {
333 333
334test "nfkd !ASCII / alloc" { 334test "nfkd !ASCII / alloc" {
335 const allocator = testing.allocator; 335 const allocator = testing.allocator;
336 var data = try NormData.init(allocator); 336 const data = try NormData.init(allocator);
337 defer data.deinit(); 337 defer data.deinit();
338 var n = Self{ .norm_data = &data }; 338 const n = Self{ .norm_data = &data };
339 339
340 var result = try n.nfkd(allocator, "Héllo World! \u{3d3}"); 340 const result = try n.nfkd(allocator, "Héllo World! \u{3d3}");
341 defer result.deinit(); 341 defer result.deinit();
342 342
343 try testing.expectEqualStrings("He\u{301}llo World! \u{3a5}\u{301}", result.slice); 343 try testing.expectEqualStrings("He\u{301}llo World! \u{3a5}\u{301}", result.slice);
@@ -532,11 +532,11 @@ fn nfxc(self: Self, allocator: mem.Allocator, str: []const u8, form: Form) !Resu
532 532
533test "nfc" { 533test "nfc" {
534 const allocator = testing.allocator; 534 const allocator = testing.allocator;
535 var data = try NormData.init(allocator); 535 const data = try NormData.init(allocator);
536 defer data.deinit(); 536 defer data.deinit();
537 var n = Self{ .norm_data = &data }; 537 const n = Self{ .norm_data = &data };
538 538
539 var result = try n.nfc(allocator, "Complex char: \u{3D2}\u{301}"); 539 const result = try n.nfc(allocator, "Complex char: \u{3D2}\u{301}");
540 defer result.deinit(); 540 defer result.deinit();
541 541
542 try testing.expectEqualStrings("Complex char: \u{3D3}", result.slice); 542 try testing.expectEqualStrings("Complex char: \u{3D3}", result.slice);
@@ -544,11 +544,11 @@ test "nfc" {
544 544
545test "nfkc" { 545test "nfkc" {
546 const allocator = testing.allocator; 546 const allocator = testing.allocator;
547 var data = try NormData.init(allocator); 547 const data = try NormData.init(allocator);
548 defer data.deinit(); 548 defer data.deinit();
549 var n = Self{ .norm_data = &data }; 549 const n = Self{ .norm_data = &data };
550 550
551 var result = try n.nfkc(allocator, "Complex char: \u{03A5}\u{0301}"); 551 const result = try n.nfkc(allocator, "Complex char: \u{03A5}\u{0301}");
552 defer result.deinit(); 552 defer result.deinit();
553 553
554 try testing.expectEqualStrings("Complex char: \u{038E}", result.slice); 554 try testing.expectEqualStrings("Complex char: \u{038E}", result.slice);
@@ -556,9 +556,9 @@ test "nfkc" {
556 556
557/// Tests for equality of `a` and `b` after normalizing to NFC. 557/// Tests for equality of `a` and `b` after normalizing to NFC.
558pub fn eql(self: Self, allocator: mem.Allocator, a: []const u8, b: []const u8) !bool { 558pub fn eql(self: Self, allocator: mem.Allocator, a: []const u8, b: []const u8) !bool {
559 var norm_result_a = try self.nfc(allocator, a); 559 const norm_result_a = try self.nfc(allocator, a);
560 defer norm_result_a.deinit(); 560 defer norm_result_a.deinit();
561 var norm_result_b = try self.nfc(allocator, b); 561 const norm_result_b = try self.nfc(allocator, b);
562 defer norm_result_b.deinit(); 562 defer norm_result_b.deinit();
563 563
564 return mem.eql(u8, norm_result_a.slice, norm_result_b.slice); 564 return mem.eql(u8, norm_result_a.slice, norm_result_b.slice);
@@ -566,9 +566,9 @@ pub fn eql(self: Self, allocator: mem.Allocator, a: []const u8, b: []const u8) !
566 566
567test "eql" { 567test "eql" {
568 const allocator = testing.allocator; 568 const allocator = testing.allocator;
569 var data = try NormData.init(allocator); 569 const data = try NormData.init(allocator);
570 defer data.deinit(); 570 defer data.deinit();
571 var n = Self{ .norm_data = &data }; 571 const n = Self{ .norm_data = &data };
572 572
573 try testing.expect(try n.eql(allocator, "foé", "foe\u{0301}")); 573 try testing.expect(try n.eql(allocator, "foé", "foe\u{0301}"));
574 try testing.expect(try n.eql(allocator, "foϓ", "fo\u{03D2}\u{0301}")); 574 try testing.expect(try n.eql(allocator, "foϓ", "fo\u{03D2}\u{0301}"));
@@ -601,9 +601,9 @@ fn isFcd(self: Self, str: []const u8) bool {
601 601
602test "isFcd" { 602test "isFcd" {
603 const allocator = testing.allocator; 603 const allocator = testing.allocator;
604 var data = try NormData.init(allocator); 604 const data = try NormData.init(allocator);
605 defer data.deinit(); 605 defer data.deinit();
606 var n = Self{ .norm_data = &data }; 606 const n = Self{ .norm_data = &data };
607 607
608 const is_nfc = "José \u{3D3}"; 608 const is_nfc = "José \u{3D3}";
609 try testing.expect(n.isFcd(is_nfc)); 609 try testing.expect(n.isFcd(is_nfc));
@@ -620,9 +620,9 @@ test "Unicode normalization tests" {
620 defer arena.deinit(); 620 defer arena.deinit();
621 var allocator = arena.allocator(); 621 var allocator = arena.allocator();
622 622
623 var data = try NormData.init(allocator); 623 const data = try NormData.init(allocator);
624 defer data.deinit(); 624 defer data.deinit();
625 var n = Self{ .norm_data = &data }; 625 const n = Self{ .norm_data = &data };
626 626
627 var file = try fs.cwd().openFile("data/unicode/NormalizationTest.txt", .{}); 627 var file = try fs.cwd().openFile("data/unicode/NormalizationTest.txt", .{});
628 defer file.close(); 628 defer file.close();
@@ -721,7 +721,7 @@ test "Unicode normalization tests" {
721 } 721 }
722 722
723 const want = w_buf.items; 723 const want = w_buf.items;
724 var got = try n.nfkd(allocator, input); 724 const got = try n.nfkd(allocator, input);
725 defer got.deinit(); 725 defer got.deinit();
726 726
727 try testing.expectEqualStrings(want, got.slice); 727 try testing.expectEqualStrings(want, got.slice);
diff --git a/src/NumericData.zig b/src/NumericData.zig
index baf8f11..210d623 100644
--- a/src/NumericData.zig
+++ b/src/NumericData.zig
@@ -33,7 +33,7 @@ pub fn init(allocator: mem.Allocator) !Self {
33 return self; 33 return self;
34} 34}
35 35
36pub fn deinit(self: *Self) void { 36pub fn deinit(self: *const Self) void {
37 self.allocator.free(self.s1); 37 self.allocator.free(self.s1);
38 self.allocator.free(self.s2); 38 self.allocator.free(self.s2);
39} 39}
@@ -59,7 +59,7 @@ pub inline fn isDecimal(self: Self, cp: u21) bool {
59} 59}
60 60
61test "isDecimal" { 61test "isDecimal" {
62 var self = try init(testing.allocator); 62 const self = try init(testing.allocator);
63 defer self.deinit(); 63 defer self.deinit();
64 64
65 try testing.expect(self.isNumber('\u{277f}')); 65 try testing.expect(self.isNumber('\u{277f}'));
diff --git a/src/ScriptsData.zig b/src/ScriptsData.zig
new file mode 100644
index 0000000..ac1c46a
--- /dev/null
+++ b/src/ScriptsData.zig
@@ -0,0 +1,226 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const compress = std.compress;
4const mem = std.mem;
5const testing = std.testing;
6
7/// Script
8pub const Script = enum {
9 none,
10 Adlam,
11 Ahom,
12 Anatolian_Hieroglyphs,
13 Arabic,
14 Armenian,
15 Avestan,
16 Balinese,
17 Bamum,
18 Bassa_Vah,
19 Batak,
20 Bengali,
21 Bhaiksuki,
22 Bopomofo,
23 Brahmi,
24 Braille,
25 Buginese,
26 Buhid,
27 Canadian_Aboriginal,
28 Carian,
29 Caucasian_Albanian,
30 Chakma,
31 Cham,
32 Cherokee,
33 Chorasmian,
34 Common,
35 Coptic,
36 Cuneiform,
37 Cypriot,
38 Cypro_Minoan,
39 Cyrillic,
40 Deseret,
41 Devanagari,
42 Dives_Akuru,
43 Dogra,
44 Duployan,
45 Egyptian_Hieroglyphs,
46 Elbasan,
47 Elymaic,
48 Ethiopic,
49 Georgian,
50 Glagolitic,
51 Gothic,
52 Grantha,
53 Greek,
54 Gujarati,
55 Gunjala_Gondi,
56 Gurmukhi,
57 Han,
58 Hangul,
59 Hanifi_Rohingya,
60 Hanunoo,
61 Hatran,
62 Hebrew,
63 Hiragana,
64 Imperial_Aramaic,
65 Inherited,
66 Inscriptional_Pahlavi,
67 Inscriptional_Parthian,
68 Javanese,
69 Kaithi,
70 Kannada,
71 Katakana,
72 Kawi,
73 Kayah_Li,
74 Kharoshthi,
75 Khitan_Small_Script,
76 Khmer,
77 Khojki,
78 Khudawadi,
79 Lao,
80 Latin,
81 Lepcha,
82 Limbu,
83 Linear_A,
84 Linear_B,
85 Lisu,
86 Lycian,
87 Lydian,
88 Mahajani,
89 Makasar,
90 Malayalam,
91 Mandaic,
92 Manichaean,
93 Marchen,
94 Masaram_Gondi,
95 Medefaidrin,
96 Meetei_Mayek,
97 Mende_Kikakui,
98 Meroitic_Cursive,
99 Meroitic_Hieroglyphs,
100 Miao,
101 Modi,
102 Mongolian,
103 Mro,
104 Multani,
105 Myanmar,
106 Nabataean,
107 Nag_Mundari,
108 Nandinagari,
109 New_Tai_Lue,
110 Newa,
111 Nko,
112 Nushu,
113 Nyiakeng_Puachue_Hmong,
114 Ogham,
115 Ol_Chiki,
116 Old_Hungarian,
117 Old_Italic,
118 Old_North_Arabian,
119 Old_Permic,
120 Old_Persian,
121 Old_Sogdian,
122 Old_South_Arabian,
123 Old_Turkic,
124 Old_Uyghur,
125 Oriya,
126 Osage,
127 Osmanya,
128 Pahawh_Hmong,
129 Palmyrene,
130 Pau_Cin_Hau,
131 Phags_Pa,
132 Phoenician,
133 Psalter_Pahlavi,
134 Rejang,
135 Runic,
136 Samaritan,
137 Saurashtra,
138 Sharada,
139 Shavian,
140 Siddham,
141 SignWriting,
142 Sinhala,
143 Sogdian,
144 Sora_Sompeng,
145 Soyombo,
146 Sundanese,
147 Syloti_Nagri,
148 Syriac,
149 Tagalog,
150 Tagbanwa,
151 Tai_Le,
152 Tai_Tham,
153 Tai_Viet,
154 Takri,
155 Tamil,
156 Tangsa,
157 Tangut,
158 Telugu,
159 Thaana,
160 Thai,
161 Tibetan,
162 Tifinagh,
163 Tirhuta,
164 Toto,
165 Ugaritic,
166 Vai,
167 Vithkuqi,
168 Wancho,
169 Warang_Citi,
170 Yezidi,
171 Yi,
172 Zanabazar_Square,
173};
174
175allocator: mem.Allocator,
176s1: []u16 = undefined,
177s2: []u8 = undefined,
178s3: []u8 = undefined,
179
180const Self = @This();
181
182pub fn init(allocator: mem.Allocator) !Self {
183 const decompressor = compress.deflate.decompressor;
184 const in_bytes = @embedFile("scripts");
185 var in_fbs = std.io.fixedBufferStream(in_bytes);
186 var in_decomp = try decompressor(allocator, in_fbs.reader(), null);
187 defer in_decomp.deinit();
188 var reader = in_decomp.reader();
189
190 const endian = builtin.cpu.arch.endian();
191
192 var self = Self{ .allocator = allocator };
193
194 const s1_len: u16 = try reader.readInt(u16, endian);
195 self.s1 = try allocator.alloc(u16, s1_len);
196 for (0..s1_len) |i| self.s1[i] = try reader.readInt(u16, endian);
197
198 const s2_len: u16 = try reader.readInt(u16, endian);
199 self.s2 = try allocator.alloc(u8, s2_len);
200 _ = try reader.readAll(self.s2);
201
202 const s3_len: u16 = try reader.readInt(u8, endian);
203 self.s3 = try allocator.alloc(u8, s3_len);
204 _ = try reader.readAll(self.s3);
205
206 return self;
207}
208
209pub fn deinit(self: *const Self) void {
210 self.allocator.free(self.s1);
211 self.allocator.free(self.s2);
212 self.allocator.free(self.s3);
213}
214
215/// Lookup the Script type for `cp`.
216pub fn script(self: Self, cp: u21) ?Script {
217 const byte = self.s3[self.s2[self.s1[cp >> 8] + (cp & 0xff)]];
218 if (byte == 0) return null;
219 return @enumFromInt(byte);
220}
221
222test "script" {
223 const self = try init(std.testing.allocator);
224 defer self.deinit();
225 try testing.expectEqual(Script.Latin, self.script('A').?);
226}
diff --git a/src/WidthData.zig b/src/WidthData.zig
index 32f8658..d17f0cd 100644
--- a/src/WidthData.zig
+++ b/src/WidthData.zig
@@ -39,7 +39,7 @@ pub fn init(allocator: mem.Allocator) !Self {
39 return self; 39 return self;
40} 40}
41 41
42pub fn deinit(self: *Self) void { 42pub fn deinit(self: *const Self) void {
43 self.allocator.free(self.s1); 43 self.allocator.free(self.s1);
44 self.allocator.free(self.s2); 44 self.allocator.free(self.s2);
45 self.g_data.deinit(); 45 self.g_data.deinit();
diff --git a/src/grapheme.zig b/src/grapheme.zig
index e55a6a4..ad43cfd 100644
--- a/src/grapheme.zig
+++ b/src/grapheme.zig
@@ -237,7 +237,7 @@ test "Segmentation GraphemeIterator" {
237 var buf_reader = std.io.bufferedReader(file.reader()); 237 var buf_reader = std.io.bufferedReader(file.reader());
238 var input_stream = buf_reader.reader(); 238 var input_stream = buf_reader.reader();
239 239
240 var data = try GraphemeData.init(allocator); 240 const data = try GraphemeData.init(allocator);
241 defer data.deinit(); 241 defer data.deinit();
242 242
243 var buf: [4096]u8 = undefined; 243 var buf: [4096]u8 = undefined;
@@ -302,7 +302,7 @@ test "Segmentation ZWJ and ZWSP emoji sequences" {
302 const with_zwsp = seq_1 ++ "\u{200B}" ++ seq_2; 302 const with_zwsp = seq_1 ++ "\u{200B}" ++ seq_2;
303 const no_joiner = seq_1 ++ seq_2; 303 const no_joiner = seq_1 ++ seq_2;
304 304
305 var data = try GraphemeData.init(std.testing.allocator); 305 const data = try GraphemeData.init(std.testing.allocator);
306 defer data.deinit(); 306 defer data.deinit();
307 307
308 var iter = Iterator.init(with_zwj, &data); 308 var iter = Iterator.init(with_zwj, &data);