summaryrefslogtreecommitdiff
path: root/codegen/fold.zig
diff options
context:
space:
mode:
authorGravatar Sam Atman2025-12-23 09:34:19 -0500
committerGravatar Sam Atman2025-12-23 09:34:19 -0500
commit79b133e5d88fe6cfce337dd401fc09999db08852 (patch)
tree8b3f9062edde82724c73147abf42143a885640fc /codegen/fold.zig
parentMerge branch 'develop-next' (diff)
parentUse takeDelimiterInclusive to support Zig 0.15.2 (diff)
downloadzg-79b133e5d88fe6cfce337dd401fc09999db08852.tar.gz
zg-79b133e5d88fe6cfce337dd401fc09999db08852.tar.xz
zg-79b133e5d88fe6cfce337dd401fc09999db08852.zip
Merge branch 'fifteen-two'
Close #90 Close #87 Close #83 Thanks everyone.
Diffstat (limited to 'codegen/fold.zig')
-rw-r--r--codegen/fold.zig64
1 files changed, 33 insertions, 31 deletions
diff --git a/codegen/fold.zig b/codegen/fold.zig
index cb73cca..366ed79 100644
--- a/codegen/fold.zig
+++ b/codegen/fold.zig
@@ -2,23 +2,19 @@ const std = @import("std");
2const builtin = @import("builtin"); 2const builtin = @import("builtin");
3const mem = std.mem; 3const mem = std.mem;
4 4
5pub fn main() !void { 5pub fn main() anyerror!void {
6 var gpa = std.heap.GeneralPurposeAllocator(.{}){}; 6 var gpa = std.heap.GeneralPurposeAllocator(.{}){};
7 defer std.debug.assert(gpa.deinit() == .ok); 7 defer std.debug.assert(gpa.deinit() == .ok);
8 const allocator = gpa.allocator(); 8 const allocator = gpa.allocator();
9 9
10 // Process DerivedCoreProperties.txt 10 // Process DerivedCoreProperties.txt
11 var props_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); 11 var props_reader = std.io.Reader.fixed(@embedFile("DerivedCoreProperties.txt"));
12 defer props_file.close();
13 var props_buf = std.io.bufferedReader(props_file.reader());
14 const props_reader = props_buf.reader();
15 12
16 var props_map = std.AutoHashMap(u21, void).init(allocator); 13 var props_map = std.AutoHashMap(u21, void).init(allocator);
17 defer props_map.deinit(); 14 defer props_map.deinit();
18 15
19 var line_buf: [4096]u8 = undefined; 16 props_lines: while (props_reader.takeDelimiterInclusive('\n')) |took| {
20 17 const line = std.mem.trimRight(u8, took, "\n");
21 props_lines: while (try props_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| {
22 if (line.len == 0 or line[0] == '#') continue; 18 if (line.len == 0 or line[0] == '#') continue;
23 19
24 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 20 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -49,18 +45,20 @@ pub fn main() !void {
49 else => {}, 45 else => {},
50 } 46 }
51 } 47 }
48 } else |err| switch (err) {
49 error.EndOfStream => {},
50 else => {
51 return err;
52 },
52 } 53 }
53
54 var codepoint_mapping = std.AutoArrayHashMap(u21, [3]u21).init(allocator); 54 var codepoint_mapping = std.AutoArrayHashMap(u21, [3]u21).init(allocator);
55 defer codepoint_mapping.deinit(); 55 defer codepoint_mapping.deinit();
56 56
57 // Process CaseFolding.txt 57 // Process CaseFolding.txt
58 var cp_file = try std.fs.cwd().openFile("data/unicode/CaseFolding.txt", .{});
59 defer cp_file.close();
60 var cp_buf = std.io.bufferedReader(cp_file.reader());
61 const cp_reader = cp_buf.reader();
62 58
63 while (try cp_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 59 var cp_reader = std.io.Reader.fixed(@embedFile("CaseFolding.txt"));
60 while (cp_reader.takeDelimiterInclusive('\n')) |took| {
61 const line = std.mem.trimRight(u8, took, "\n");
64 if (line.len == 0 or line[0] == '#') continue; 62 if (line.len == 0 or line[0] == '#') continue;
65 63
66 var field_it = std.mem.splitScalar(u8, line, ';'); 64 var field_it = std.mem.splitScalar(u8, line, ';');
@@ -81,9 +79,14 @@ pub fn main() !void {
81 } 79 }
82 80
83 try codepoint_mapping.putNoClobber(codepoint, mapping_buf); 81 try codepoint_mapping.putNoClobber(codepoint, mapping_buf);
82 } else |err| switch (err) {
83 error.EndOfStream => {},
84 else => {
85 return err;
86 },
84 } 87 }
85 88
86 var changes_when_casefolded_exceptions = std.ArrayList(u21).init(allocator); 89 var changes_when_casefolded_exceptions = std.array_list.Managed(u21).init(allocator);
87 defer changes_when_casefolded_exceptions.deinit(); 90 defer changes_when_casefolded_exceptions.deinit();
88 91
89 { 92 {
@@ -221,32 +224,31 @@ pub fn main() !void {
221 _ = args_iter.skip(); 224 _ = args_iter.skip();
222 const output_path = args_iter.next() orelse @panic("No output file arg!"); 225 const output_path = args_iter.next() orelse @panic("No output file arg!");
223 226
224 const compressor = std.compress.flate.deflate.compressor; 227 var write_buf: [4096]u8 = undefined;
225 var out_file = try std.fs.cwd().createFile(output_path, .{}); 228 var out_file = try std.fs.cwd().createFile(output_path, .{});
226 defer out_file.close(); 229 defer out_file.close();
227 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 230 var writer = out_file.writer(&write_buf);
228 const writer = out_comp.writer();
229 231
230 const endian = builtin.cpu.arch.endian(); 232 const endian = builtin.cpu.arch.endian();
231 // Table metadata. 233 // Table metadata.
232 try writer.writeInt(u24, @intCast(codepoint_cutoff), endian); 234 try writer.interface.writeInt(u24, @intCast(codepoint_cutoff), endian);
233 try writer.writeInt(u24, @intCast(multiple_codepoint_start), endian); 235 try writer.interface.writeInt(u24, @intCast(multiple_codepoint_start), endian);
234 // Stage 1 236 // Stage 1
235 try writer.writeInt(u16, @intCast(meaningful_stage1.len), endian); 237 try writer.interface.writeInt(u16, @intCast(meaningful_stage1.len), endian);
236 try writer.writeAll(meaningful_stage1); 238 try writer.interface.writeAll(meaningful_stage1);
237 // Stage 2 239 // Stage 2
238 try writer.writeInt(u16, @intCast(stage2.len), endian); 240 try writer.interface.writeInt(u16, @intCast(stage2.len), endian);
239 try writer.writeAll(stage2); 241 try writer.interface.writeAll(stage2);
240 // Stage 3 242 // Stage 3
241 try writer.writeInt(u16, @intCast(stage3.len), endian); 243 try writer.interface.writeInt(u16, @intCast(stage3.len), endian);
242 for (stage3) |offset| try writer.writeInt(i24, offset, endian); 244 for (stage3) |offset| try writer.interface.writeInt(i24, offset, endian);
243 // Changes when case folded 245 // Changes when case folded
244 // Min and max 246 // Min and max
245 try writer.writeInt(u24, std.mem.min(u21, changes_when_casefolded_exceptions.items), endian); 247 try writer.interface.writeInt(u24, std.mem.min(u21, changes_when_casefolded_exceptions.items), endian);
246 try writer.writeInt(u24, std.mem.max(u21, changes_when_casefolded_exceptions.items), endian); 248 try writer.interface.writeInt(u24, std.mem.max(u21, changes_when_casefolded_exceptions.items), endian);
247 try writer.writeInt(u16, @intCast(changes_when_casefolded_exceptions.items.len), endian); 249 try writer.interface.writeInt(u16, @intCast(changes_when_casefolded_exceptions.items.len), endian);
248 for (changes_when_casefolded_exceptions.items) |cp| try writer.writeInt(u24, cp, endian); 250 for (changes_when_casefolded_exceptions.items) |cp| try writer.interface.writeInt(u24, cp, endian);
249 251
250 try out_comp.flush(); 252 try writer.interface.flush();
251 } 253 }
252} 254}