diff options
Diffstat (limited to 'codegen/fold.zig')
| -rw-r--r-- | codegen/fold.zig | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/codegen/fold.zig b/codegen/fold.zig index cb73cca..cc381a8 100644 --- a/codegen/fold.zig +++ b/codegen/fold.zig | |||
| @@ -2,23 +2,21 @@ 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 | var line_buf: [4096]u8 = undefined; | ||
| 10 | // Process DerivedCoreProperties.txt | 11 | // Process DerivedCoreProperties.txt |
| 11 | var props_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); | 12 | var props_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); |
| 12 | defer props_file.close(); | 13 | defer props_file.close(); |
| 13 | var props_buf = std.io.bufferedReader(props_file.reader()); | 14 | var props_reader = props_file.reader(&line_buf); |
| 14 | const props_reader = props_buf.reader(); | ||
| 15 | 15 | ||
| 16 | var props_map = std.AutoHashMap(u21, void).init(allocator); | 16 | var props_map = std.AutoHashMap(u21, void).init(allocator); |
| 17 | defer props_map.deinit(); | 17 | defer props_map.deinit(); |
| 18 | 18 | ||
| 19 | var line_buf: [4096]u8 = undefined; | 19 | props_lines: while (props_reader.interface.takeDelimiterExclusive('\n')) |line| { |
| 20 | |||
| 21 | props_lines: while (try props_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { | ||
| 22 | if (line.len == 0 or line[0] == '#') continue; | 20 | if (line.len == 0 or line[0] == '#') continue; |
| 23 | 21 | ||
| 24 | const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; | 22 | const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; |
| @@ -49,18 +47,21 @@ pub fn main() !void { | |||
| 49 | else => {}, | 47 | else => {}, |
| 50 | } | 48 | } |
| 51 | } | 49 | } |
| 50 | } else |err| switch (err) { | ||
| 51 | error.EndOfStream => {}, | ||
| 52 | else => { | ||
| 53 | return err; | ||
| 54 | }, | ||
| 52 | } | 55 | } |
| 53 | |||
| 54 | var codepoint_mapping = std.AutoArrayHashMap(u21, [3]u21).init(allocator); | 56 | var codepoint_mapping = std.AutoArrayHashMap(u21, [3]u21).init(allocator); |
| 55 | defer codepoint_mapping.deinit(); | 57 | defer codepoint_mapping.deinit(); |
| 56 | 58 | ||
| 57 | // Process CaseFolding.txt | 59 | // Process CaseFolding.txt |
| 58 | var cp_file = try std.fs.cwd().openFile("data/unicode/CaseFolding.txt", .{}); | 60 | var cp_file = try std.fs.cwd().openFile("data/unicode/CaseFolding.txt", .{}); |
| 59 | defer cp_file.close(); | 61 | defer cp_file.close(); |
| 60 | var cp_buf = std.io.bufferedReader(cp_file.reader()); | 62 | var cp_reader = cp_file.reader(&line_buf); |
| 61 | const cp_reader = cp_buf.reader(); | ||
| 62 | 63 | ||
| 63 | while (try cp_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { | 64 | while (cp_reader.interface.takeDelimiterExclusive('\n')) |line| { |
| 64 | if (line.len == 0 or line[0] == '#') continue; | 65 | if (line.len == 0 or line[0] == '#') continue; |
| 65 | 66 | ||
| 66 | var field_it = std.mem.splitScalar(u8, line, ';'); | 67 | var field_it = std.mem.splitScalar(u8, line, ';'); |
| @@ -81,9 +82,14 @@ pub fn main() !void { | |||
| 81 | } | 82 | } |
| 82 | 83 | ||
| 83 | try codepoint_mapping.putNoClobber(codepoint, mapping_buf); | 84 | try codepoint_mapping.putNoClobber(codepoint, mapping_buf); |
| 85 | } else |err| switch (err) { | ||
| 86 | error.EndOfStream => {}, | ||
| 87 | else => { | ||
| 88 | return err; | ||
| 89 | }, | ||
| 84 | } | 90 | } |
| 85 | 91 | ||
| 86 | var changes_when_casefolded_exceptions = std.ArrayList(u21).init(allocator); | 92 | var changes_when_casefolded_exceptions = std.array_list.Managed(u21).init(allocator); |
| 87 | defer changes_when_casefolded_exceptions.deinit(); | 93 | defer changes_when_casefolded_exceptions.deinit(); |
| 88 | 94 | ||
| 89 | { | 95 | { |
| @@ -221,32 +227,31 @@ pub fn main() !void { | |||
| 221 | _ = args_iter.skip(); | 227 | _ = args_iter.skip(); |
| 222 | const output_path = args_iter.next() orelse @panic("No output file arg!"); | 228 | const output_path = args_iter.next() orelse @panic("No output file arg!"); |
| 223 | 229 | ||
| 224 | const compressor = std.compress.flate.deflate.compressor; | 230 | var write_buf: [4096]u8 = undefined; |
| 225 | var out_file = try std.fs.cwd().createFile(output_path, .{}); | 231 | var out_file = try std.fs.cwd().createFile(output_path, .{}); |
| 226 | defer out_file.close(); | 232 | defer out_file.close(); |
| 227 | var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); | 233 | var writer = out_file.writer(&write_buf); |
| 228 | const writer = out_comp.writer(); | ||
| 229 | 234 | ||
| 230 | const endian = builtin.cpu.arch.endian(); | 235 | const endian = builtin.cpu.arch.endian(); |
| 231 | // Table metadata. | 236 | // Table metadata. |
| 232 | try writer.writeInt(u24, @intCast(codepoint_cutoff), endian); | 237 | try writer.interface.writeInt(u24, @intCast(codepoint_cutoff), endian); |
| 233 | try writer.writeInt(u24, @intCast(multiple_codepoint_start), endian); | 238 | try writer.interface.writeInt(u24, @intCast(multiple_codepoint_start), endian); |
| 234 | // Stage 1 | 239 | // Stage 1 |
| 235 | try writer.writeInt(u16, @intCast(meaningful_stage1.len), endian); | 240 | try writer.interface.writeInt(u16, @intCast(meaningful_stage1.len), endian); |
| 236 | try writer.writeAll(meaningful_stage1); | 241 | try writer.interface.writeAll(meaningful_stage1); |
| 237 | // Stage 2 | 242 | // Stage 2 |
| 238 | try writer.writeInt(u16, @intCast(stage2.len), endian); | 243 | try writer.interface.writeInt(u16, @intCast(stage2.len), endian); |
| 239 | try writer.writeAll(stage2); | 244 | try writer.interface.writeAll(stage2); |
| 240 | // Stage 3 | 245 | // Stage 3 |
| 241 | try writer.writeInt(u16, @intCast(stage3.len), endian); | 246 | try writer.interface.writeInt(u16, @intCast(stage3.len), endian); |
| 242 | for (stage3) |offset| try writer.writeInt(i24, offset, endian); | 247 | for (stage3) |offset| try writer.interface.writeInt(i24, offset, endian); |
| 243 | // Changes when case folded | 248 | // Changes when case folded |
| 244 | // Min and max | 249 | // Min and max |
| 245 | try writer.writeInt(u24, std.mem.min(u21, changes_when_casefolded_exceptions.items), endian); | 250 | 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); | 251 | 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); | 252 | 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); | 253 | for (changes_when_casefolded_exceptions.items) |cp| try writer.interface.writeInt(u24, cp, endian); |
| 249 | 254 | ||
| 250 | try out_comp.flush(); | 255 | try writer.interface.flush(); |
| 251 | } | 256 | } |
| 252 | } | 257 | } |