summaryrefslogtreecommitdiff
path: root/codegen/gbp.zig
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/gbp.zig')
-rw-r--r--codegen/gbp.zig57
1 files changed, 33 insertions, 24 deletions
diff --git a/codegen/gbp.zig b/codegen/gbp.zig
index 3fc4461..d654cf1 100644
--- a/codegen/gbp.zig
+++ b/codegen/gbp.zig
@@ -47,7 +47,7 @@ const BlockMap = std.HashMap(
47 std.hash_map.default_max_load_percentage, 47 std.hash_map.default_max_load_percentage,
48); 48);
49 49
50pub fn main() !void { 50pub fn main() anyerror!void {
51 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 51 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
52 defer arena.deinit(); 52 defer arena.deinit();
53 const allocator = arena.allocator(); 53 const allocator = arena.allocator();
@@ -66,10 +66,9 @@ pub fn main() !void {
66 // Process Indic 66 // Process Indic
67 var indic_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); 67 var indic_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{});
68 defer indic_file.close(); 68 defer indic_file.close();
69 var indic_buf = std.io.bufferedReader(indic_file.reader()); 69 var indic_reader = indic_file.reader(&line_buf);
70 const indic_reader = indic_buf.reader();
71 70
72 while (try indic_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 71 while (indic_reader.interface.takeDelimiterExclusive('\n')) |line| {
73 if (line.len == 0 or line[0] == '#') continue; 72 if (line.len == 0 or line[0] == '#') continue;
74 if (std.mem.indexOf(u8, line, "InCB") == null) continue; 73 if (std.mem.indexOf(u8, line, "InCB") == null) continue;
75 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 74 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -100,15 +99,18 @@ pub fn main() !void {
100 else => {}, 99 else => {},
101 } 100 }
102 } 101 }
102 } else |err| switch (err) {
103 error.EndOfStream => {},
104 else => {
105 return err;
106 },
103 } 107 }
104
105 // Process GBP 108 // Process GBP
106 var gbp_file = try std.fs.cwd().openFile("data/unicode/auxiliary/GraphemeBreakProperty.txt", .{}); 109 var gbp_file = try std.fs.cwd().openFile("data/unicode/auxiliary/GraphemeBreakProperty.txt", .{});
107 defer gbp_file.close(); 110 defer gbp_file.close();
108 var gbp_buf = std.io.bufferedReader(gbp_file.reader()); 111 var gbp_reader = gbp_file.reader(&line_buf);
109 const gbp_reader = gbp_buf.reader();
110 112
111 while (try gbp_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 113 while (gbp_reader.interface.takeDelimiterExclusive('\n')) |line| {
112 if (line.len == 0 or line[0] == '#') continue; 114 if (line.len == 0 or line[0] == '#') continue;
113 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 115 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
114 116
@@ -138,15 +140,18 @@ pub fn main() !void {
138 else => {}, 140 else => {},
139 } 141 }
140 } 142 }
143 } else |err| switch (err) {
144 error.EndOfStream => {},
145 else => {
146 return err;
147 },
141 } 148 }
142
143 // Process Emoji 149 // Process Emoji
144 var emoji_file = try std.fs.cwd().openFile("data/unicode/emoji/emoji-data.txt", .{}); 150 var emoji_file = try std.fs.cwd().openFile("data/unicode/emoji/emoji-data.txt", .{});
145 defer emoji_file.close(); 151 defer emoji_file.close();
146 var emoji_buf = std.io.bufferedReader(emoji_file.reader()); 152 var emoji_reader = emoji_file.reader(&line_buf);
147 const emoji_reader = emoji_buf.reader();
148 153
149 while (try emoji_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 154 while (emoji_reader.interface.takeDelimiterExclusive('\n')) |line| {
150 if (line.len == 0 or line[0] == '#') continue; 155 if (line.len == 0 or line[0] == '#') continue;
151 if (std.mem.indexOf(u8, line, "Extended_Pictographic") == null) continue; 156 if (std.mem.indexOf(u8, line, "Extended_Pictographic") == null) continue;
152 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 157 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -170,15 +175,20 @@ pub fn main() !void {
170 else => {}, 175 else => {},
171 } 176 }
172 } 177 }
178 } else |err| switch (err) {
179 error.EndOfStream => {},
180 else => {
181 return err;
182 },
173 } 183 }
174 184
175 var blocks_map = BlockMap.init(allocator); 185 var blocks_map = BlockMap.init(allocator);
176 defer blocks_map.deinit(); 186 defer blocks_map.deinit();
177 187
178 var stage1 = std.ArrayList(u16).init(allocator); 188 var stage1 = std.array_list.Managed(u16).init(allocator);
179 defer stage1.deinit(); 189 defer stage1.deinit();
180 190
181 var stage2 = std.ArrayList(u16).init(allocator); 191 var stage2 = std.array_list.Managed(u16).init(allocator);
182 defer stage2.deinit(); 192 defer stage2.deinit();
183 193
184 var stage3 = std.AutoArrayHashMap(u8, u16).init(allocator); 194 var stage3 = std.AutoArrayHashMap(u8, u16).init(allocator);
@@ -227,22 +237,21 @@ pub fn main() !void {
227 _ = args_iter.skip(); 237 _ = args_iter.skip();
228 const output_path = args_iter.next() orelse @panic("No output file arg!"); 238 const output_path = args_iter.next() orelse @panic("No output file arg!");
229 239
230 const compressor = std.compress.flate.deflate.compressor; 240 var write_buf: [4096]u8 = undefined;
231 var out_file = try std.fs.cwd().createFile(output_path, .{}); 241 var out_file = try std.fs.cwd().createFile(output_path, .{});
232 defer out_file.close(); 242 defer out_file.close();
233 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 243 var writer = out_file.writer(&write_buf);
234 const writer = out_comp.writer();
235 244
236 const endian = builtin.cpu.arch.endian(); 245 const endian = builtin.cpu.arch.endian();
237 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 246 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
238 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 247 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
239 248
240 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 249 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
241 for (stage2.items) |i| try writer.writeInt(u16, i, endian); 250 for (stage2.items) |i| try writer.interface.writeInt(u16, i, endian);
242 251
243 const props_bytes = stage3.keys(); 252 const props_bytes = stage3.keys();
244 try writer.writeInt(u16, @intCast(props_bytes.len), endian); 253 try writer.interface.writeInt(u16, @intCast(props_bytes.len), endian);
245 try writer.writeAll(props_bytes); 254 try writer.interface.writeAll(props_bytes);
246 255
247 try out_comp.flush(); 256 try writer.interface.flush();
248} 257}