summaryrefslogtreecommitdiff
path: root/src/HangulData.zig
diff options
context:
space:
mode:
authorGravatar Jose Colon Rodriguez2024-02-27 09:26:40 -0400
committerGravatar Jose Colon Rodriguez2024-02-27 09:26:40 -0400
commit32c68059a05dde8a57a330db6d14a32506081516 (patch)
treec2b3b9bbbf48330db3570135d371cb92b552f1cb /src/HangulData.zig
parentUsing NormData nfkd (diff)
downloadzg-32c68059a05dde8a57a330db6d14a32506081516.tar.gz
zg-32c68059a05dde8a57a330db6d14a32506081516.tar.xz
zg-32c68059a05dde8a57a330db6d14a32506081516.zip
Using HangulData in NormData
Diffstat (limited to 'src/HangulData.zig')
-rw-r--r--src/HangulData.zig52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/HangulData.zig b/src/HangulData.zig
new file mode 100644
index 0000000..4d80c99
--- /dev/null
+++ b/src/HangulData.zig
@@ -0,0 +1,52 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const compress = std.compress;
4const mem = std.mem;
5const testing = std.testing;
6
7pub const Syllable = enum {
8 none,
9 L,
10 LV,
11 LVT,
12 V,
13 T,
14};
15
16allocator: mem.Allocator,
17s1: []u16 = undefined,
18s2: []Syllable = undefined,
19
20const Self = @This();
21
22pub fn init(allocator: mem.Allocator) !Self {
23 const decompressor = compress.deflate.decompressor;
24 const in_bytes = @embedFile("hangul");
25 var in_fbs = std.io.fixedBufferStream(in_bytes);
26 var in_decomp = try decompressor(allocator, in_fbs.reader(), null);
27 defer in_decomp.deinit();
28 var reader = in_decomp.reader();
29
30 const endian = builtin.cpu.arch.endian();
31 var self = Self{ .allocator = allocator };
32
33 const stage_1_len: u16 = try reader.readInt(u16, endian);
34 self.s1 = try allocator.alloc(u16, stage_1_len);
35 for (0..stage_1_len) |i| self.s1[i] = try reader.readInt(u16, endian);
36
37 const stage_2_len: u16 = try reader.readInt(u16, endian);
38 self.s2 = try allocator.alloc(Syllable, stage_2_len);
39 for (0..stage_2_len) |i| self.s2[i] = @enumFromInt(try reader.readInt(u8, endian));
40
41 return self;
42}
43
44pub fn deinit(self: *Self) void {
45 self.allocator.free(self.s1);
46 self.allocator.free(self.s2);
47}
48
49/// Returns the Hangul syllable type for `cp`.
50pub inline fn syllable(self: Self, cp: u21) Syllable {
51 return self.s2[self.s1[cp >> 8] + (cp & 0xff)];
52}