summaryrefslogtreecommitdiff
path: root/src/CompatData.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/CompatData.zig')
-rw-r--r--src/CompatData.zig20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/CompatData.zig b/src/CompatData.zig
index d787103..794abca 100644
--- a/src/CompatData.zig
+++ b/src/CompatData.zig
@@ -1,6 +1,7 @@
1//! Compatibility Data 1//! Compatibility Data
2 2
3nfkd: [][]u21 = undefined, 3nfkd: [][]u21 = undefined,
4cps: []u21 = undefined,
4 5
5const CompatData = @This(); 6const CompatData = @This();
6 7
@@ -15,27 +16,35 @@ pub fn init(allocator: mem.Allocator) !CompatData {
15 var cpdata = CompatData{ 16 var cpdata = CompatData{
16 .nfkd = try allocator.alloc([]u21, 0x110000), 17 .nfkd = try allocator.alloc([]u21, 0x110000),
17 }; 18 };
19 {
20 errdefer allocator.free(cpdata.nfkd);
21 cpdata.cps = try allocator.alloc(u21, magic.compat_size);
22 }
18 errdefer cpdata.deinit(allocator); 23 errdefer cpdata.deinit(allocator);
19 24
20 @memset(cpdata.nfkd, &.{}); 25 @memset(cpdata.nfkd, &.{});
21 26
27 var total_len: usize = 0;
28
22 while (true) { 29 while (true) {
23 const len: u8 = try reader.readInt(u8, endian); 30 const len: u8 = try reader.readInt(u8, endian);
24 if (len == 0) break; 31 if (len == 0) break;
25 const cp = try reader.readInt(u24, endian); 32 const cp = try reader.readInt(u24, endian);
26 cpdata.nfkd[cp] = try allocator.alloc(u21, len - 1); 33 const nk_s = cpdata.cps[total_len..][0 .. len - 1];
27 for (0..len - 1) |i| { 34 for (0..len - 1) |i| {
28 cpdata.nfkd[cp][i] = @intCast(try reader.readInt(u24, endian)); 35 nk_s[i] = @intCast(try reader.readInt(u24, endian));
29 } 36 }
37 cpdata.nfkd[cp] = nk_s;
38 total_len += len - 1;
30 } 39 }
31 40
41 if (comptime magic.print) std.debug.print("CompatData magic number: {d}", .{total_len});
42
32 return cpdata; 43 return cpdata;
33} 44}
34 45
35pub fn deinit(cpdata: *const CompatData, allocator: mem.Allocator) void { 46pub fn deinit(cpdata: *const CompatData, allocator: mem.Allocator) void {
36 for (cpdata.nfkd) |slice| { 47 allocator.free(cpdata.cps);
37 if (slice.len != 0) allocator.free(slice);
38 }
39 allocator.free(cpdata.nfkd); 48 allocator.free(cpdata.nfkd);
40} 49}
41 50
@@ -48,3 +57,4 @@ const std = @import("std");
48const builtin = @import("builtin"); 57const builtin = @import("builtin");
49const compress = std.compress; 58const compress = std.compress;
50const mem = std.mem; 59const mem = std.mem;
60const magic = @import("magic");