summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jose Colon Rodriguez2024-02-15 10:22:18 -0400
committerGravatar Jose Colon Rodriguez2024-02-15 10:22:18 -0400
commit20cfd0ae7262df53e774f6ab82ef620e966476e3 (patch)
treeacf3d7f280a11ad8201d4713308f0e4b31f3be15
parentNew single byte props table (diff)
downloadzg-20cfd0ae7262df53e774f6ab82ef620e966476e3.tar.gz
zg-20cfd0ae7262df53e774f6ab82ef620e966476e3.tar.xz
zg-20cfd0ae7262df53e774f6ab82ef620e966476e3.zip
Removed codegen/indic.zig
-rw-r--r--codegen/indic.zig164
1 files changed, 0 insertions, 164 deletions
diff --git a/codegen/indic.zig b/codegen/indic.zig
deleted file mode 100644
index 07bcd92..0000000
--- a/codegen/indic.zig
+++ /dev/null
@@ -1,164 +0,0 @@
1const std = @import("std");
2
3const Prop = enum {
4 none,
5
6 Consonant,
7 Extend,
8 Linker,
9};
10
11const block_size = 256;
12const Block = [block_size]u3;
13
14const BlockMap = std.HashMap(
15 Block,
16 u16,
17 struct {
18 pub fn hash(_: @This(), k: Block) u64 {
19 var hasher = std.hash.Wyhash.init(0);
20 std.hash.autoHashStrat(&hasher, k, .DeepRecursive);
21 return hasher.final();
22 }
23
24 pub fn eql(_: @This(), a: Block, b: Block) bool {
25 return std.mem.eql(u3, &a, &b);
26 }
27 },
28 std.hash_map.default_max_load_percentage,
29);
30
31pub fn main() !void {
32 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
33 defer arena.deinit();
34 const allocator = arena.allocator();
35
36 var prop_map = std.AutoHashMap(u21, Prop).init(allocator);
37 defer prop_map.deinit();
38
39 var in_file = try std.fs.cwd().openFile("unicode/DerivedCoreProperties.txt", .{});
40 defer in_file.close();
41 var in_buf = std.io.bufferedReader(in_file.reader());
42 const reader = in_buf.reader();
43
44 var line_buf: [4096]u8 = undefined;
45
46 while (try reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| {
47 if (line.len == 0 or line[0] == '#') continue;
48 if (std.mem.indexOf(u8, line, "InCB") == null) continue;
49 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
50
51 var field_iter = std.mem.tokenizeAny(u8, no_comment, "; ");
52 var current_code: [2]u21 = undefined;
53
54 var i: usize = 0;
55 while (field_iter.next()) |field| : (i += 1) {
56 switch (i) {
57 0 => {
58 // Code point(s)
59 if (std.mem.indexOf(u8, field, "..")) |dots| {
60 current_code = .{
61 try std.fmt.parseInt(u21, field[0..dots], 16),
62 try std.fmt.parseInt(u21, field[dots + 2 ..], 16),
63 };
64 } else {
65 const code = try std.fmt.parseInt(u21, field, 16);
66 current_code = .{ code, code };
67 }
68 },
69 2 => {
70 // Prop
71 const prop = std.meta.stringToEnum(Prop, field) orelse return error.InvalidPorp;
72 for (current_code[0]..current_code[1] + 1) |cp| try prop_map.put(@intCast(cp), prop);
73 },
74 else => {},
75 }
76 }
77 }
78
79 var blocks_map = BlockMap.init(allocator);
80 defer blocks_map.deinit();
81
82 var stage1 = std.ArrayList(u16).init(allocator);
83 defer stage1.deinit();
84
85 var stage2 = std.ArrayList(u3).init(allocator);
86 defer stage2.deinit();
87
88 var stage3 = std.ArrayList(Prop).init(allocator);
89 defer stage3.deinit();
90
91 var block: Block = [_]u3{0} ** block_size;
92 var block_len: u16 = 0;
93
94 for (0..0x110000) |i| {
95 const cp: u21 = @intCast(i);
96 const prop = prop_map.get(cp) orelse .none;
97
98 const block_idx = blk: {
99 for (stage3.items, 0..) |item, j| {
100 if (item == prop) break :blk j;
101 }
102
103 const idx = stage3.items.len;
104 try stage3.append(prop);
105 break :blk idx;
106 };
107
108 block[block_len] = @intCast(block_idx);
109 block_len += 1;
110
111 if (block_len < block_size and cp != 0x10ffff) continue;
112
113 const gop = try blocks_map.getOrPut(block);
114 if (!gop.found_existing) {
115 gop.value_ptr.* = @intCast(stage2.items.len);
116 try stage2.appendSlice(&block);
117 }
118
119 try stage1.append(gop.value_ptr.*);
120 block_len = 0;
121 }
122
123 var args_iter = std.process.args();
124 _ = args_iter.skip();
125 const output_path = args_iter.next() orelse @panic("No output file arg!");
126
127 var out_file = try std.fs.cwd().createFile(output_path, .{});
128 defer out_file.close();
129 var out_buf = std.io.bufferedWriter(out_file.writer());
130 const writer = out_buf.writer();
131
132 const prop_code =
133 \\pub const Prop = enum {
134 \\ none,
135 \\
136 \\ Consonant,
137 \\ Extend,
138 \\ Linker,
139 \\};
140 \\
141 ;
142
143 try writer.writeAll(prop_code);
144
145 try writer.print("pub const stage_1 = [{}]u16{{", .{stage1.items.len});
146 for (stage1.items) |v| {
147 _ = try writer.print("{},", .{v});
148 }
149 try writer.writeAll("};\n");
150
151 try writer.print("pub const stage_2 = [{}]u3{{", .{stage2.items.len});
152 for (stage2.items) |v| {
153 _ = try writer.print("{},", .{v});
154 }
155 try writer.writeAll("};\n");
156
157 try writer.print("pub const stage_3 = [{}]Prop{{", .{stage3.items.len});
158 for (stage3.items) |v| {
159 _ = try writer.print(".{s},", .{@tagName(v)});
160 }
161 try writer.writeAll("};\n");
162
163 try out_buf.flush();
164}