diff options
Diffstat (limited to 'codegen/gbp.zig')
| -rw-r--r-- | codegen/gbp.zig | 57 |
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 | ||
| 50 | pub fn main() !void { | 50 | pub 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 | } |