summaryrefslogtreecommitdiff
path: root/src/gbp_gen.zig
diff options
context:
space:
mode:
authorGravatar Jose Colon Rodriguez2024-02-12 19:46:12 -0400
committerGravatar Jose Colon Rodriguez2024-02-12 19:46:12 -0400
commita6f8b3ffd8a6bbd57462e1c8fb4d922c2f93ac32 (patch)
tree14276a650dc7c40c68b7cdb7a7efdf4fa7148804 /src/gbp_gen.zig
parentinit (diff)
downloadzg-a6f8b3ffd8a6bbd57462e1c8fb4d922c2f93ac32.tar.gz
zg-a6f8b3ffd8a6bbd57462e1c8fb4d922c2f93ac32.tar.xz
zg-a6f8b3ffd8a6bbd57462e1c8fb4d922c2f93ac32.zip
Using Ghostty's table gen
Diffstat (limited to 'src/gbp_gen.zig')
-rw-r--r--src/gbp_gen.zig118
1 files changed, 72 insertions, 46 deletions
diff --git a/src/gbp_gen.zig b/src/gbp_gen.zig
index 578543d..fcc7aa4 100644
--- a/src/gbp_gen.zig
+++ b/src/gbp_gen.zig
@@ -2,26 +2,6 @@ const std = @import("std");
2 2
3const gbp = @import("ziglyph").grapheme_break; 3const gbp = @import("ziglyph").grapheme_break;
4 4
5const Map = struct {
6 store: [12]Prop = [_]Prop{.none} ** 12,
7 len: u8 = 0,
8
9 fn getOrPut(self: *Map, prop: Prop) usize {
10 var index: ?usize = null;
11 for (0..self.store.len) |i| {
12 if (self.store[i] == prop) index = i;
13 }
14
15 if (index) |idx| {
16 return idx;
17 } else {
18 self.store[self.len] = prop;
19 self.len += 1;
20 return self.len - 1;
21 }
22 }
23};
24
25const Prop = enum { 5const Prop = enum {
26 none, 6 none,
27 7
@@ -54,21 +34,70 @@ const Prop = enum {
54 } 34 }
55}; 35};
56 36
37const block_size = 256;
38const Block = [block_size]u4;
39
40const BlockMap = std.HashMap(
41 Block,
42 u16,
43 struct {
44 pub fn hash(_: @This(), k: Block) u64 {
45 var hasher = std.hash.Wyhash.init(0);
46 std.hash.autoHashStrat(&hasher, k, .DeepRecursive);
47 return hasher.final();
48 }
49
50 pub fn eql(_: @This(), a: Block, b: Block) bool {
51 return std.mem.eql(u4, &a, &b);
52 }
53 },
54 std.hash_map.default_max_load_percentage,
55);
56
57pub fn main() !void { 57pub fn main() !void {
58 var stage_1: [4352]u21 = undefined; 58 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
59 var stage_2: [1_114_112]u4 = undefined; 59 defer arena.deinit();
60 var stage_3 = Map{}; 60 const allocator = arena.allocator();
61 61
62 var current_block_offset: u21 = 0; 62 var blocks_map = BlockMap.init(allocator);
63 63 defer blocks_map.deinit();
64 for (0..0x10ffff + 1) |i| { 64
65 const cp: u21 = @intCast(i); 65 var stage1 = std.ArrayList(u16).init(allocator);
66 const stage_1_index = cp >> 8; 66 defer stage1.deinit();
67 const stage_2_index = current_block_offset + (cp & 0xff); 67 var stage2 = std.ArrayList(u4).init(allocator);
68 const stage_3_index = stage_3.getOrPut(Prop.forCodePoint(cp)); 68 defer stage2.deinit();
69 stage_1[stage_1_index] = current_block_offset; 69 var stage3 = std.ArrayList(Prop).init(allocator);
70 stage_2[stage_2_index] = @intCast(stage_3_index); 70 defer stage3.deinit();
71 if (cp & 0xff == 255) current_block_offset += 256; 71
72 var block: Block = undefined;
73 var block_len: u16 = 0;
74 for (0..0x10ffff + 1) |cp| {
75 const prop = Prop.forCodePoint(@intCast(cp));
76
77 const block_idx = blk: {
78 for (stage3.items, 0..) |item, i| {
79 if (item == prop) break :blk i;
80 }
81
82 const idx = stage3.items.len;
83 try stage3.append(prop);
84 break :blk idx;
85 };
86
87 block[block_len] = @intCast(block_idx);
88 block_len += 1;
89
90 if (block_len < block_size and cp != 0x10ffff) continue;
91 if (block_len < block_size) @memset(block[block_len..block_size], 0);
92
93 const gop = try blocks_map.getOrPut(block);
94 if (!gop.found_existing) {
95 gop.value_ptr.* = @intCast(stage2.items.len);
96 try stage2.appendSlice(block[0..block_len]);
97 }
98
99 try stage1.append(gop.value_ptr.*);
100 block_len = 0;
72 } 101 }
73 102
74 var args_iter = std.process.args(); 103 var args_iter = std.process.args();
@@ -101,24 +130,21 @@ pub fn main() !void {
101 130
102 try writer.writeAll(prop_code); 131 try writer.writeAll(prop_code);
103 132
104 try writer.writeAll("const stage_1 = [_]u21{"); 133 try writer.print("const stage_1 = [{}]u16{{", .{stage1.items.len});
105 for (stage_1, 0..) |v, i| { 134 for (stage1.items) |v| {
106 if (i != 0) try writer.writeByte(','); 135 _ = try writer.print("{},", .{v});
107 _ = try writer.print("{}", .{v});
108 } 136 }
109 try writer.writeAll("};\n"); 137 try writer.writeAll("};\n");
110 138
111 try writer.writeAll("const stage_2 = [_]u4{"); 139 try writer.print("const stage_2 = [{}]u4{{", .{stage2.items.len});
112 for (stage_2, 0..) |v, i| { 140 for (stage2.items) |v| {
113 if (i != 0) try writer.writeByte(','); 141 _ = try writer.print("{},", .{v});
114 _ = try writer.print("{}", .{v});
115 } 142 }
116 try writer.writeAll("};\n"); 143 try writer.writeAll("};\n");
117 144
118 try writer.writeAll("const stage_3 = [_]Prop{"); 145 try writer.print("const stage_3 = [{}]Prop{{", .{stage3.items.len});
119 for (stage_3.store, 0..) |v, i| { 146 for (stage3.items) |v| {
120 if (i != 0) try writer.writeByte(','); 147 _ = try writer.print(".{s},", .{@tagName(v)});
121 _ = try writer.print(".{s}", .{@tagName(v)});
122 } 148 }
123 try writer.writeAll("};\n"); 149 try writer.writeAll("};\n");
124 150