diff options
Diffstat (limited to 'codegen/fold.zig')
| -rw-r--r-- | codegen/fold.zig | 64 |
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"); | |||
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | const mem = std.mem; | 3 | const mem = std.mem; |
| 4 | 4 | ||
| 5 | pub fn main() !void { | 5 | pub 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 | } |