summaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
authorGravatar Michael Chaten2025-09-13 08:38:24 -0700
committerGravatar Michael Chaten2025-09-14 01:48:41 -0700
commita3b5e884b12fdaa341010ef41bb9382fa0cd89f8 (patch)
tree8bdd22c1c54da0b56ef6b9fe0dc4c2ca667b71a3 /codegen
parentUpdate build to 0.15.0 (diff)
downloadzg-a3b5e884b12fdaa341010ef41bb9382fa0cd89f8.tar.gz
zg-a3b5e884b12fdaa341010ef41bb9382fa0cd89f8.tar.xz
zg-a3b5e884b12fdaa341010ef41bb9382fa0cd89f8.zip
Update codebase to Zig 0.15.1.
Removes compression support
Diffstat (limited to 'codegen')
-rw-r--r--codegen/canon.zig24
-rw-r--r--codegen/case_prop.zig31
-rw-r--r--codegen/ccc.zig31
-rw-r--r--codegen/compat.zig27
-rw-r--r--codegen/core_props.zig32
-rw-r--r--codegen/dwp.zig42
-rw-r--r--codegen/fold.zig59
-rw-r--r--codegen/gbp.zig57
-rw-r--r--codegen/gencat.zig35
-rw-r--r--codegen/hangul.zig32
-rw-r--r--codegen/lower.zig26
-rw-r--r--codegen/normp.zig32
-rw-r--r--codegen/numeric.zig31
-rw-r--r--codegen/props.zig32
-rw-r--r--codegen/scripts.zig38
-rw-r--r--codegen/upper.zig31
-rw-r--r--codegen/wbp.zig32
17 files changed, 324 insertions, 268 deletions
diff --git a/codegen/canon.zig b/codegen/canon.zig
index 28b7f28..89a9070 100644
--- a/codegen/canon.zig
+++ b/codegen/canon.zig
@@ -1,32 +1,30 @@
1const std = @import("std"); 1const std = @import("std");
2const builtin = @import("builtin"); 2const builtin = @import("builtin");
3 3
4pub fn main() !void { 4pub fn main() anyerror!void {
5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
6 defer arena.deinit(); 6 defer arena.deinit();
7 const allocator = arena.allocator(); 7 const allocator = arena.allocator();
8 8
9 var line_buf: [4096]u8 = undefined;
10 var write_buf: [4096]u8 = undefined;
9 // Process UnicodeData.txt 11 // Process UnicodeData.txt
10 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{}); 12 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{});
11 defer in_file.close(); 13 defer in_file.close();
12 var in_buf = std.io.bufferedReader(in_file.reader()); 14 var in_reader = in_file.reader(&line_buf);
13 const in_reader = in_buf.reader();
14 15
15 var args_iter = try std.process.argsWithAllocator(allocator); 16 var args_iter = try std.process.argsWithAllocator(allocator);
16 defer args_iter.deinit(); 17 defer args_iter.deinit();
17 _ = args_iter.skip(); 18 _ = args_iter.skip();
18 const output_path = args_iter.next() orelse @panic("No output file arg!"); 19 const output_path = args_iter.next() orelse @panic("No output file arg!");
19 20
20 const compressor = std.compress.flate.deflate.compressor;
21 var out_file = try std.fs.cwd().createFile(output_path, .{}); 21 var out_file = try std.fs.cwd().createFile(output_path, .{});
22 defer out_file.close(); 22 defer out_file.close();
23 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 23 var file_writer = out_file.writer(&write_buf);
24 const writer = out_comp.writer(); 24 var writer = &file_writer.interface;
25
26 const endian = builtin.cpu.arch.endian(); 25 const endian = builtin.cpu.arch.endian();
27 var line_buf: [4096]u8 = undefined;
28 26
29 lines: while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 27 lines: while (in_reader.interface.takeDelimiterInclusive('\n')) |line| {
30 if (line.len == 0) continue; 28 if (line.len == 0) continue;
31 29
32 var field_iter = std.mem.splitScalar(u8, line, ';'); 30 var field_iter = std.mem.splitScalar(u8, line, ';');
@@ -60,8 +58,12 @@ pub fn main() !void {
60 58
61 try writer.writeInt(u8, @intCast(len), endian); 59 try writer.writeInt(u8, @intCast(len), endian);
62 for (cps[0..len]) |cp| try writer.writeInt(u24, cp, endian); 60 for (cps[0..len]) |cp| try writer.writeInt(u24, cp, endian);
61 } else |err| switch (err) {
62 error.EndOfStream => {},
63 else => {
64 return err;
65 },
63 } 66 }
64
65 try writer.writeInt(u16, 0, endian); 67 try writer.writeInt(u16, 0, endian);
66 try out_comp.flush(); 68 try writer.flush();
67} 69}
diff --git a/codegen/case_prop.zig b/codegen/case_prop.zig
index 6c912a8..66eb62c 100644
--- a/codegen/case_prop.zig
+++ b/codegen/case_prop.zig
@@ -22,7 +22,7 @@ const BlockMap = std.HashMap(
22 std.hash_map.default_max_load_percentage, 22 std.hash_map.default_max_load_percentage,
23); 23);
24 24
25pub fn main() !void { 25pub fn main() anyerror!void {
26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
27 defer arena.deinit(); 27 defer arena.deinit();
28 const allocator = arena.allocator(); 28 const allocator = arena.allocator();
@@ -35,10 +35,9 @@ pub fn main() !void {
35 // Process DerivedCoreProperties.txt 35 // Process DerivedCoreProperties.txt
36 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); 36 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{});
37 defer in_file.close(); 37 defer in_file.close();
38 var in_buf = std.io.bufferedReader(in_file.reader()); 38 var in_reader = in_file.reader(&line_buf);
39 const in_reader = in_buf.reader();
40 39
41 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 40 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
42 if (line.len == 0 or line[0] == '#') continue; 41 if (line.len == 0 or line[0] == '#') continue;
43 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 42 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
44 43
@@ -79,15 +78,20 @@ pub fn main() !void {
79 else => {}, 78 else => {},
80 } 79 }
81 } 80 }
81 } else |err| switch (err) {
82 error.EndOfStream => {},
83 else => {
84 return err;
85 },
82 } 86 }
83 87
84 var blocks_map = BlockMap.init(allocator); 88 var blocks_map = BlockMap.init(allocator);
85 defer blocks_map.deinit(); 89 defer blocks_map.deinit();
86 90
87 var stage1 = std.ArrayList(u16).init(allocator); 91 var stage1 = std.array_list.Managed(u16).init(allocator);
88 defer stage1.deinit(); 92 defer stage1.deinit();
89 93
90 var stage2 = std.ArrayList(u8).init(allocator); 94 var stage2 = std.array_list.Managed(u8).init(allocator);
91 defer stage2.deinit(); 95 defer stage2.deinit();
92 96
93 var block: Block = [_]u8{0} ** block_size; 97 var block: Block = [_]u8{0} ** block_size;
@@ -118,18 +122,17 @@ pub fn main() !void {
118 _ = args_iter.skip(); 122 _ = args_iter.skip();
119 const output_path = args_iter.next() orelse @panic("No output file arg!"); 123 const output_path = args_iter.next() orelse @panic("No output file arg!");
120 124
121 const compressor = std.compress.flate.deflate.compressor; 125 var write_buf: [4096]u8 = undefined;
122 var out_file = try std.fs.cwd().createFile(output_path, .{}); 126 var out_file = try std.fs.cwd().createFile(output_path, .{});
123 defer out_file.close(); 127 defer out_file.close();
124 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 128 var writer = out_file.writer(&write_buf);
125 const writer = out_comp.writer();
126 129
127 const endian = builtin.cpu.arch.endian(); 130 const endian = builtin.cpu.arch.endian();
128 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 131 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
129 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 132 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
130 133
131 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 134 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
132 try writer.writeAll(stage2.items); 135 try writer.interface.writeAll(stage2.items);
133 136
134 try out_comp.flush(); 137 try writer.interface.flush();
135} 138}
diff --git a/codegen/ccc.zig b/codegen/ccc.zig
index a01c8d2..b9b2bc3 100644
--- a/codegen/ccc.zig
+++ b/codegen/ccc.zig
@@ -21,7 +21,7 @@ const BlockMap = std.HashMap(
21 std.hash_map.default_max_load_percentage, 21 std.hash_map.default_max_load_percentage,
22); 22);
23 23
24pub fn main() !void { 24pub fn main() anyerror!void {
25 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 25 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
26 defer arena.deinit(); 26 defer arena.deinit();
27 const allocator = arena.allocator(); 27 const allocator = arena.allocator();
@@ -34,10 +34,9 @@ pub fn main() !void {
34 // Process DerivedCombiningClass.txt 34 // Process DerivedCombiningClass.txt
35 var cc_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedCombiningClass.txt", .{}); 35 var cc_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedCombiningClass.txt", .{});
36 defer cc_file.close(); 36 defer cc_file.close();
37 var cc_buf = std.io.bufferedReader(cc_file.reader()); 37 var cc_reader = cc_file.reader(&line_buf);
38 const cc_reader = cc_buf.reader();
39 38
40 while (try cc_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 39 while (cc_reader.interface.takeDelimiterExclusive('\n')) |line| {
41 if (line.len == 0 or line[0] == '#') continue; 40 if (line.len == 0 or line[0] == '#') continue;
42 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 41 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
43 42
@@ -68,15 +67,20 @@ pub fn main() !void {
68 else => {}, 67 else => {},
69 } 68 }
70 } 69 }
70 } else |err| switch (err) {
71 error.EndOfStream => {},
72 else => {
73 return err;
74 },
71 } 75 }
72 76
73 var blocks_map = BlockMap.init(allocator); 77 var blocks_map = BlockMap.init(allocator);
74 defer blocks_map.deinit(); 78 defer blocks_map.deinit();
75 79
76 var stage1 = std.ArrayList(u16).init(allocator); 80 var stage1 = std.array_list.Managed(u16).init(allocator);
77 defer stage1.deinit(); 81 defer stage1.deinit();
78 82
79 var stage2 = std.ArrayList(u8).init(allocator); 83 var stage2 = std.array_list.Managed(u8).init(allocator);
80 defer stage2.deinit(); 84 defer stage2.deinit();
81 85
82 var block: Block = [_]u8{0} ** block_size; 86 var block: Block = [_]u8{0} ** block_size;
@@ -107,18 +111,17 @@ pub fn main() !void {
107 _ = args_iter.skip(); 111 _ = args_iter.skip();
108 const output_path = args_iter.next() orelse @panic("No output file arg!"); 112 const output_path = args_iter.next() orelse @panic("No output file arg!");
109 113
110 const compressor = std.compress.flate.deflate.compressor; 114 var write_buf: [4096]u8 = undefined;
111 var out_file = try std.fs.cwd().createFile(output_path, .{}); 115 var out_file = try std.fs.cwd().createFile(output_path, .{});
112 defer out_file.close(); 116 defer out_file.close();
113 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 117 var writer = out_file.writer(&write_buf);
114 const writer = out_comp.writer();
115 118
116 const endian = builtin.cpu.arch.endian(); 119 const endian = builtin.cpu.arch.endian();
117 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 120 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
118 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 121 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
119 122
120 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 123 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
121 try writer.writeAll(stage2.items); 124 try writer.interface.writeAll(stage2.items);
122 125
123 try out_comp.flush(); 126 try writer.interface.flush();
124} 127}
diff --git a/codegen/compat.zig b/codegen/compat.zig
index 07616fc..835a636 100644
--- a/codegen/compat.zig
+++ b/codegen/compat.zig
@@ -1,7 +1,7 @@
1const std = @import("std"); 1const std = @import("std");
2const builtin = @import("builtin"); 2const builtin = @import("builtin");
3 3
4pub fn main() !void { 4pub fn main() anyerror!void {
5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
6 defer arena.deinit(); 6 defer arena.deinit();
7 const allocator = arena.allocator(); 7 const allocator = arena.allocator();
@@ -9,24 +9,22 @@ pub fn main() !void {
9 // Process UnicodeData.txt 9 // Process UnicodeData.txt
10 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{}); 10 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{});
11 defer in_file.close(); 11 defer in_file.close();
12 var in_buf = std.io.bufferedReader(in_file.reader()); 12 var line_buf: [4096]u8 = undefined;
13 const in_reader = in_buf.reader(); 13 var write_buf: [4096]u8 = undefined;
14 var in_reader = in_file.reader(&line_buf);
14 15
15 var args_iter = try std.process.argsWithAllocator(allocator); 16 var args_iter = try std.process.argsWithAllocator(allocator);
16 defer args_iter.deinit(); 17 defer args_iter.deinit();
17 _ = args_iter.skip(); 18 _ = args_iter.skip();
18 const output_path = args_iter.next() orelse @panic("No output file arg!"); 19 const output_path = args_iter.next() orelse @panic("No output file arg!");
19 20
20 const compressor = std.compress.flate.deflate.compressor;
21 var out_file = try std.fs.cwd().createFile(output_path, .{}); 21 var out_file = try std.fs.cwd().createFile(output_path, .{});
22 defer out_file.close(); 22 defer out_file.close();
23 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 23 var writer = out_file.writer(&write_buf);
24 const writer = out_comp.writer();
25 24
26 const endian = builtin.cpu.arch.endian(); 25 const endian = builtin.cpu.arch.endian();
27 var line_buf: [4096]u8 = undefined;
28 26
29 lines: while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 27 lines: while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
30 if (line.len == 0) continue; 28 if (line.len == 0) continue;
31 29
32 var field_iter = std.mem.splitScalar(u8, line, ';'); 30 var field_iter = std.mem.splitScalar(u8, line, ';');
@@ -55,10 +53,15 @@ pub fn main() !void {
55 } 53 }
56 } 54 }
57 55
58 try writer.writeInt(u8, @intCast(len), endian); 56 try writer.interface.writeInt(u8, @intCast(len), endian);
59 for (cps[0..len]) |cp| try writer.writeInt(u24, cp, endian); 57 for (cps[0..len]) |cp| try writer.interface.writeInt(u24, cp, endian);
58 } else |err| switch (err) {
59 error.EndOfStream => {},
60 else => {
61 return err;
62 },
60 } 63 }
61 64
62 try writer.writeInt(u16, 0, endian); 65 try writer.interface.writeInt(u16, 0, endian);
63 try out_comp.flush(); 66 try writer.interface.flush();
64} 67}
diff --git a/codegen/core_props.zig b/codegen/core_props.zig
index f60c7a9..19063f6 100644
--- a/codegen/core_props.zig
+++ b/codegen/core_props.zig
@@ -22,7 +22,7 @@ const BlockMap = std.HashMap(
22 std.hash_map.default_max_load_percentage, 22 std.hash_map.default_max_load_percentage,
23); 23);
24 24
25pub fn main() !void { 25pub fn main() anyerror!void {
26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
27 defer arena.deinit(); 27 defer arena.deinit();
28 const allocator = arena.allocator(); 28 const allocator = arena.allocator();
@@ -35,10 +35,9 @@ pub fn main() !void {
35 // Process DerivedCoreProperties.txt 35 // Process DerivedCoreProperties.txt
36 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); 36 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{});
37 defer in_file.close(); 37 defer in_file.close();
38 var in_buf = std.io.bufferedReader(in_file.reader()); 38 var in_reader = in_file.reader(&line_buf);
39 const in_reader = in_buf.reader();
40 39
41 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 40 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
42 if (line.len == 0 or line[0] == '#') continue; 41 if (line.len == 0 or line[0] == '#') continue;
43 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 42 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
44 43
@@ -82,15 +81,19 @@ pub fn main() !void {
82 else => {}, 81 else => {},
83 } 82 }
84 } 83 }
84 } else |err| switch (err) {
85 error.EndOfStream => {},
86 else => {
87 return err;
88 },
85 } 89 }
86
87 var blocks_map = BlockMap.init(allocator); 90 var blocks_map = BlockMap.init(allocator);
88 defer blocks_map.deinit(); 91 defer blocks_map.deinit();
89 92
90 var stage1 = std.ArrayList(u16).init(allocator); 93 var stage1 = std.array_list.Managed(u16).init(allocator);
91 defer stage1.deinit(); 94 defer stage1.deinit();
92 95
93 var stage2 = std.ArrayList(u8).init(allocator); 96 var stage2 = std.array_list.Managed(u8).init(allocator);
94 defer stage2.deinit(); 97 defer stage2.deinit();
95 98
96 var block: Block = [_]u8{0} ** block_size; 99 var block: Block = [_]u8{0} ** block_size;
@@ -121,18 +124,17 @@ pub fn main() !void {
121 _ = args_iter.skip(); 124 _ = args_iter.skip();
122 const output_path = args_iter.next() orelse @panic("No output file arg!"); 125 const output_path = args_iter.next() orelse @panic("No output file arg!");
123 126
124 const compressor = std.compress.flate.deflate.compressor; 127 var out_buf: [4096]u8 = undefined;
125 var out_file = try std.fs.cwd().createFile(output_path, .{}); 128 var out_file = try std.fs.cwd().createFile(output_path, .{});
126 defer out_file.close(); 129 defer out_file.close();
127 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 130 var writer = out_file.writer(&out_buf);
128 const writer = out_comp.writer();
129 131
130 const endian = builtin.cpu.arch.endian(); 132 const endian = builtin.cpu.arch.endian();
131 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 133 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
132 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 134 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
133 135
134 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 136 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
135 try writer.writeAll(stage2.items); 137 try writer.interface.writeAll(stage2.items);
136 138
137 try out_comp.flush(); 139 try writer.interface.flush();
138} 140}
diff --git a/codegen/dwp.zig b/codegen/dwp.zig
index 5e5bf6a..fad08d1 100644
--- a/codegen/dwp.zig
+++ b/codegen/dwp.zig
@@ -23,7 +23,7 @@ const BlockMap = std.HashMap(
23 std.hash_map.default_max_load_percentage, 23 std.hash_map.default_max_load_percentage,
24); 24);
25 25
26pub fn main() !void { 26pub fn main() anyerror!void {
27 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 27 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
28 defer arena.deinit(); 28 defer arena.deinit();
29 const allocator = arena.allocator(); 29 const allocator = arena.allocator();
@@ -36,10 +36,9 @@ pub fn main() !void {
36 // Process DerivedEastAsianWidth.txt 36 // Process DerivedEastAsianWidth.txt
37 var deaw_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedEastAsianWidth.txt", .{}); 37 var deaw_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedEastAsianWidth.txt", .{});
38 defer deaw_file.close(); 38 defer deaw_file.close();
39 var deaw_buf = std.io.bufferedReader(deaw_file.reader()); 39 var deaw_reader = deaw_file.reader(&line_buf);
40 const deaw_reader = deaw_buf.reader();
41 40
42 while (try deaw_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 41 while (deaw_reader.interface.takeDelimiterExclusive('\n')) |line| {
43 if (line.len == 0) continue; 42 if (line.len == 0) continue;
44 43
45 // @missing ranges 44 // @missing ranges
@@ -88,15 +87,18 @@ pub fn main() !void {
88 else => {}, 87 else => {},
89 } 88 }
90 } 89 }
90 } else |err| switch (err) {
91 error.EndOfStream => {},
92 else => {
93 return err;
94 },
91 } 95 }
92
93 // Process DerivedGeneralCategory.txt 96 // Process DerivedGeneralCategory.txt
94 var dgc_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedGeneralCategory.txt", .{}); 97 var dgc_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedGeneralCategory.txt", .{});
95 defer dgc_file.close(); 98 defer dgc_file.close();
96 var dgc_buf = std.io.bufferedReader(dgc_file.reader()); 99 var dgc_reader = dgc_file.reader(&line_buf);
97 const dgc_reader = dgc_buf.reader();
98 100
99 while (try dgc_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 101 while (dgc_reader.interface.takeDelimiterExclusive('\n')) |line| {
100 if (line.len == 0 or line[0] == '#') continue; 102 if (line.len == 0 or line[0] == '#') continue;
101 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 103 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
102 104
@@ -139,15 +141,20 @@ pub fn main() !void {
139 else => {}, 141 else => {},
140 } 142 }
141 } 143 }
144 } else |err| switch (err) {
145 error.EndOfStream => {},
146 else => {
147 return err;
148 },
142 } 149 }
143 150
144 var blocks_map = BlockMap.init(allocator); 151 var blocks_map = BlockMap.init(allocator);
145 defer blocks_map.deinit(); 152 defer blocks_map.deinit();
146 153
147 var stage1 = std.ArrayList(u16).init(allocator); 154 var stage1 = std.array_list.Managed(u16).init(allocator);
148 defer stage1.deinit(); 155 defer stage1.deinit();
149 156
150 var stage2 = std.ArrayList(i4).init(allocator); 157 var stage2 = std.array_list.Managed(i4).init(allocator);
151 defer stage2.deinit(); 158 defer stage2.deinit();
152 159
153 var block: Block = [_]i4{0} ** block_size; 160 var block: Block = [_]i4{0} ** block_size;
@@ -227,18 +234,17 @@ pub fn main() !void {
227 _ = args_iter.skip(); 234 _ = args_iter.skip();
228 const output_path = args_iter.next() orelse @panic("No output file arg!"); 235 const output_path = args_iter.next() orelse @panic("No output file arg!");
229 236
230 const compressor = std.compress.flate.deflate.compressor; 237 var write_buf: [4096]u8 = undefined;
231 var out_file = try std.fs.cwd().createFile(output_path, .{}); 238 var out_file = try std.fs.cwd().createFile(output_path, .{});
232 defer out_file.close(); 239 defer out_file.close();
233 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 240 var writer = out_file.writer(&write_buf);
234 const writer = out_comp.writer();
235 241
236 const endian = builtin.cpu.arch.endian(); 242 const endian = builtin.cpu.arch.endian();
237 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 243 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
238 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 244 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
239 245
240 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 246 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
241 for (stage2.items) |i| try writer.writeInt(i8, i, endian); 247 for (stage2.items) |i| try writer.interface.writeInt(i8, i, endian);
242 248
243 try out_comp.flush(); 249 try writer.interface.flush();
244} 250}
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");
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 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}
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}
diff --git a/codegen/gencat.zig b/codegen/gencat.zig
index fe06bd7..7dedb5d 100644
--- a/codegen/gencat.zig
+++ b/codegen/gencat.zig
@@ -67,10 +67,9 @@ pub fn main() !void {
67 // Process DerivedGeneralCategory.txt 67 // Process DerivedGeneralCategory.txt
68 var in_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedGeneralCategory.txt", .{}); 68 var in_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedGeneralCategory.txt", .{});
69 defer in_file.close(); 69 defer in_file.close();
70 var in_buf = std.io.bufferedReader(in_file.reader()); 70 var in_reader = in_file.reader(&line_buf);
71 const in_reader = in_buf.reader();
72 71
73 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 72 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
74 if (line.len == 0 or line[0] == '#') continue; 73 if (line.len == 0 or line[0] == '#') continue;
75 74
76 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 75 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -101,18 +100,23 @@ pub fn main() !void {
101 else => {}, 100 else => {},
102 } 101 }
103 } 102 }
103 } else |err| switch (err) {
104 error.EndOfStream => {},
105 else => {
106 return err;
107 },
104 } 108 }
105 109
106 var blocks_map = BlockMap.init(allocator); 110 var blocks_map = BlockMap.init(allocator);
107 defer blocks_map.deinit(); 111 defer blocks_map.deinit();
108 112
109 var stage1 = std.ArrayList(u16).init(allocator); 113 var stage1 = std.array_list.Managed(u16).init(allocator);
110 defer stage1.deinit(); 114 defer stage1.deinit();
111 115
112 var stage2 = std.ArrayList(u5).init(allocator); 116 var stage2 = std.array_list.Managed(u5).init(allocator);
113 defer stage2.deinit(); 117 defer stage2.deinit();
114 118
115 var stage3 = std.ArrayList(u5).init(allocator); 119 var stage3 = std.array_list.Managed(u5).init(allocator);
116 defer stage3.deinit(); 120 defer stage3.deinit();
117 121
118 var block: Block = [_]u5{0} ** block_size; 122 var block: Block = [_]u5{0} ** block_size;
@@ -151,21 +155,20 @@ pub fn main() !void {
151 _ = args_iter.skip(); 155 _ = args_iter.skip();
152 const output_path = args_iter.next() orelse @panic("No output file arg!"); 156 const output_path = args_iter.next() orelse @panic("No output file arg!");
153 157
154 const compressor = std.compress.flate.deflate.compressor; 158 var write_buf: [4096]u8 = undefined;
155 var out_file = try std.fs.cwd().createFile(output_path, .{}); 159 var out_file = try std.fs.cwd().createFile(output_path, .{});
156 defer out_file.close(); 160 defer out_file.close();
157 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 161 var writer = out_file.writer(&write_buf);
158 const writer = out_comp.writer();
159 162
160 const endian = builtin.cpu.arch.endian(); 163 const endian = builtin.cpu.arch.endian();
161 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 164 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
162 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 165 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
163 166
164 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 167 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
165 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 168 for (stage2.items) |i| try writer.interface.writeInt(u8, i, endian);
166 169
167 try writer.writeInt(u8, @intCast(stage3.items.len), endian); 170 try writer.interface.writeInt(u8, @intCast(stage3.items.len), endian);
168 for (stage3.items) |i| try writer.writeInt(u8, i, endian); 171 for (stage3.items) |i| try writer.interface.writeInt(u8, i, endian);
169 172
170 try out_comp.flush(); 173 try writer.interface.flush();
171} 174}
diff --git a/codegen/hangul.zig b/codegen/hangul.zig
index 2c42bb7..6768b3f 100644
--- a/codegen/hangul.zig
+++ b/codegen/hangul.zig
@@ -30,7 +30,7 @@ const BlockMap = std.HashMap(
30 std.hash_map.default_max_load_percentage, 30 std.hash_map.default_max_load_percentage,
31); 31);
32 32
33pub fn main() !void { 33pub fn main() anyerror!void {
34 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 34 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
35 defer arena.deinit(); 35 defer arena.deinit();
36 const allocator = arena.allocator(); 36 const allocator = arena.allocator();
@@ -43,10 +43,9 @@ pub fn main() !void {
43 // Process HangulSyllableType.txt 43 // Process HangulSyllableType.txt
44 var in_file = try std.fs.cwd().openFile("data/unicode/HangulSyllableType.txt", .{}); 44 var in_file = try std.fs.cwd().openFile("data/unicode/HangulSyllableType.txt", .{});
45 defer in_file.close(); 45 defer in_file.close();
46 var in_buf = std.io.bufferedReader(in_file.reader()); 46 var in_reader = in_file.reader(&line_buf);
47 const in_reader = in_buf.reader();
48 47
49 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 48 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
50 if (line.len == 0 or line[0] == '#') continue; 49 if (line.len == 0 or line[0] == '#') continue;
51 50
52 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 51 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -77,15 +76,19 @@ pub fn main() !void {
77 else => {}, 76 else => {},
78 } 77 }
79 } 78 }
79 } else |err| switch (err) {
80 error.EndOfStream => {},
81 else => {
82 return err;
83 },
80 } 84 }
81
82 var blocks_map = BlockMap.init(allocator); 85 var blocks_map = BlockMap.init(allocator);
83 defer blocks_map.deinit(); 86 defer blocks_map.deinit();
84 87
85 var stage1 = std.ArrayList(u16).init(allocator); 88 var stage1 = std.array_list.Managed(u16).init(allocator);
86 defer stage1.deinit(); 89 defer stage1.deinit();
87 90
88 var stage2 = std.ArrayList(u3).init(allocator); 91 var stage2 = std.array_list.Managed(u3).init(allocator);
89 defer stage2.deinit(); 92 defer stage2.deinit();
90 93
91 var block: Block = [_]u3{0} ** block_size; 94 var block: Block = [_]u3{0} ** block_size;
@@ -116,18 +119,17 @@ pub fn main() !void {
116 _ = args_iter.skip(); 119 _ = args_iter.skip();
117 const output_path = args_iter.next() orelse @panic("No output file arg!"); 120 const output_path = args_iter.next() orelse @panic("No output file arg!");
118 121
119 const compressor = std.compress.flate.deflate.compressor; 122 var write_buf: [4096]u8 = undefined;
120 var out_file = try std.fs.cwd().createFile(output_path, .{}); 123 var out_file = try std.fs.cwd().createFile(output_path, .{});
121 defer out_file.close(); 124 defer out_file.close();
122 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 125 var writer = out_file.writer(&write_buf);
123 const writer = out_comp.writer();
124 126
125 const endian = builtin.cpu.arch.endian(); 127 const endian = builtin.cpu.arch.endian();
126 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 128 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
127 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 129 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
128 130
129 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 131 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
130 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 132 for (stage2.items) |i| try writer.interface.writeInt(u8, i, endian);
131 133
132 try out_comp.flush(); 134 try writer.interface.flush();
133} 135}
diff --git a/codegen/lower.zig b/codegen/lower.zig
index a053fe3..c11cb0a 100644
--- a/codegen/lower.zig
+++ b/codegen/lower.zig
@@ -6,27 +6,25 @@ pub fn main() !void {
6 defer arena.deinit(); 6 defer arena.deinit();
7 const allocator = arena.allocator(); 7 const allocator = arena.allocator();
8 8
9 var line_buf: [4096]u8 = undefined;
10 var write_buf: [4096]u8 = undefined;
9 // Process UnicodeData.txt 11 // Process UnicodeData.txt
10 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{}); 12 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{});
11 defer in_file.close(); 13 defer in_file.close();
12 var in_buf = std.io.bufferedReader(in_file.reader()); 14 var in_reader = in_file.reader(&line_buf);
13 const in_reader = in_buf.reader();
14 15
15 var args_iter = try std.process.argsWithAllocator(allocator); 16 var args_iter = try std.process.argsWithAllocator(allocator);
16 defer args_iter.deinit(); 17 defer args_iter.deinit();
17 _ = args_iter.skip(); 18 _ = args_iter.skip();
18 const output_path = args_iter.next() orelse @panic("No output file arg!"); 19 const output_path = args_iter.next() orelse @panic("No output file arg!");
19 20
20 const compressor = std.compress.flate.deflate.compressor;
21 var out_file = try std.fs.cwd().createFile(output_path, .{}); 21 var out_file = try std.fs.cwd().createFile(output_path, .{});
22 defer out_file.close(); 22 defer out_file.close();
23 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 23 var writer = out_file.writer(&write_buf);
24 const writer = out_comp.writer();
25 24
26 const endian = builtin.cpu.arch.endian(); 25 const endian = builtin.cpu.arch.endian();
27 var line_buf: [4096]u8 = undefined;
28 26
29 lines: while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 27 lines: while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
30 if (line.len == 0) continue; 28 if (line.len == 0) continue;
31 29
32 var field_iter = std.mem.splitScalar(u8, line, ';'); 30 var field_iter = std.mem.splitScalar(u8, line, ';');
@@ -42,16 +40,20 @@ pub fn main() !void {
42 13 => { 40 13 => {
43 // Simple lowercase mapping 41 // Simple lowercase mapping
44 if (field.len == 0) continue :lines; 42 if (field.len == 0) continue :lines;
45 try writer.writeInt(i24, cp, endian); 43 try writer.interface.writeInt(i24, cp, endian);
46 const mapping = try std.fmt.parseInt(i24, field, 16); 44 const mapping = try std.fmt.parseInt(i24, field, 16);
47 try writer.writeInt(i24, mapping - cp, endian); 45 try writer.interface.writeInt(i24, mapping - cp, endian);
48 }, 46 },
49 47
50 else => {}, 48 else => {},
51 } 49 }
52 } 50 }
51 } else |err| switch (err) {
52 error.EndOfStream => {},
53 else => {
54 return err;
55 },
53 } 56 }
54 57 try writer.interface.writeInt(u24, 0, endian);
55 try writer.writeInt(u24, 0, endian); 58 try writer.interface.flush();
56 try out_comp.flush();
57} 59}
diff --git a/codegen/normp.zig b/codegen/normp.zig
index 60dabdc..71a1ae5 100644
--- a/codegen/normp.zig
+++ b/codegen/normp.zig
@@ -21,7 +21,7 @@ const BlockMap = std.HashMap(
21 std.hash_map.default_max_load_percentage, 21 std.hash_map.default_max_load_percentage,
22); 22);
23 23
24pub fn main() !void { 24pub fn main() anyerror!void {
25 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 25 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
26 defer arena.deinit(); 26 defer arena.deinit();
27 const allocator = arena.allocator(); 27 const allocator = arena.allocator();
@@ -34,10 +34,9 @@ pub fn main() !void {
34 // Process DerivedNormalizationProps.txt 34 // Process DerivedNormalizationProps.txt
35 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedNormalizationProps.txt", .{}); 35 var in_file = try std.fs.cwd().openFile("data/unicode/DerivedNormalizationProps.txt", .{});
36 defer in_file.close(); 36 defer in_file.close();
37 var in_buf = std.io.bufferedReader(in_file.reader()); 37 var in_reader = in_file.reader(&line_buf);
38 const in_reader = in_buf.reader();
39 38
40 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 39 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
41 if (line.len == 0 or line[0] == '#') continue; 40 if (line.len == 0 or line[0] == '#') continue;
42 41
43 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 42 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -78,15 +77,19 @@ pub fn main() !void {
78 else => {}, 77 else => {},
79 } 78 }
80 } 79 }
80 } else |err| switch (err) {
81 error.EndOfStream => {},
82 else => {
83 return err;
84 },
81 } 85 }
82
83 var blocks_map = BlockMap.init(allocator); 86 var blocks_map = BlockMap.init(allocator);
84 defer blocks_map.deinit(); 87 defer blocks_map.deinit();
85 88
86 var stage1 = std.ArrayList(u16).init(allocator); 89 var stage1 = std.array_list.Managed(u16).init(allocator);
87 defer stage1.deinit(); 90 defer stage1.deinit();
88 91
89 var stage2 = std.ArrayList(u3).init(allocator); 92 var stage2 = std.array_list.Managed(u3).init(allocator);
90 defer stage2.deinit(); 93 defer stage2.deinit();
91 94
92 var block: Block = [_]u3{0} ** block_size; 95 var block: Block = [_]u3{0} ** block_size;
@@ -117,18 +120,17 @@ pub fn main() !void {
117 _ = args_iter.skip(); 120 _ = args_iter.skip();
118 const output_path = args_iter.next() orelse @panic("No output file arg!"); 121 const output_path = args_iter.next() orelse @panic("No output file arg!");
119 122
120 const compressor = std.compress.flate.deflate.compressor; 123 var write_buf: [4096]u8 = undefined;
121 var out_file = try std.fs.cwd().createFile(output_path, .{}); 124 var out_file = try std.fs.cwd().createFile(output_path, .{});
122 defer out_file.close(); 125 defer out_file.close();
123 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 126 var writer = out_file.writer(&write_buf);
124 const writer = out_comp.writer();
125 127
126 const endian = builtin.cpu.arch.endian(); 128 const endian = builtin.cpu.arch.endian();
127 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 129 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
128 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 130 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
129 131
130 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 132 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
131 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 133 for (stage2.items) |i| try writer.interface.writeInt(u8, i, endian);
132 134
133 try out_comp.flush(); 135 try writer.interface.flush();
134} 136}
diff --git a/codegen/numeric.zig b/codegen/numeric.zig
index 038ac0a..cf918e8 100644
--- a/codegen/numeric.zig
+++ b/codegen/numeric.zig
@@ -22,7 +22,7 @@ const BlockMap = std.HashMap(
22 std.hash_map.default_max_load_percentage, 22 std.hash_map.default_max_load_percentage,
23); 23);
24 24
25pub fn main() !void { 25pub fn main() anyerror!void {
26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
27 defer arena.deinit(); 27 defer arena.deinit();
28 const allocator = arena.allocator(); 28 const allocator = arena.allocator();
@@ -35,10 +35,9 @@ pub fn main() !void {
35 // Process DerivedNumericType.txt 35 // Process DerivedNumericType.txt
36 var in_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedNumericType.txt", .{}); 36 var in_file = try std.fs.cwd().openFile("data/unicode/extracted/DerivedNumericType.txt", .{});
37 defer in_file.close(); 37 defer in_file.close();
38 var in_buf = std.io.bufferedReader(in_file.reader()); 38 var in_reader = in_file.reader(&line_buf);
39 const in_reader = in_buf.reader();
40 39
41 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 40 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
42 if (line.len == 0 or line[0] == '#') continue; 41 if (line.len == 0 or line[0] == '#') continue;
43 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 42 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
44 43
@@ -79,15 +78,20 @@ pub fn main() !void {
79 else => {}, 78 else => {},
80 } 79 }
81 } 80 }
81 } else |err| switch (err) {
82 error.EndOfStream => {},
83 else => {
84 return err;
85 },
82 } 86 }
83 87
84 var blocks_map = BlockMap.init(allocator); 88 var blocks_map = BlockMap.init(allocator);
85 defer blocks_map.deinit(); 89 defer blocks_map.deinit();
86 90
87 var stage1 = std.ArrayList(u16).init(allocator); 91 var stage1 = std.array_list.Managed(u16).init(allocator);
88 defer stage1.deinit(); 92 defer stage1.deinit();
89 93
90 var stage2 = std.ArrayList(u8).init(allocator); 94 var stage2 = std.array_list.Managed(u8).init(allocator);
91 defer stage2.deinit(); 95 defer stage2.deinit();
92 96
93 var block: Block = [_]u8{0} ** block_size; 97 var block: Block = [_]u8{0} ** block_size;
@@ -118,18 +122,17 @@ pub fn main() !void {
118 _ = args_iter.skip(); 122 _ = args_iter.skip();
119 const output_path = args_iter.next() orelse @panic("No output file arg!"); 123 const output_path = args_iter.next() orelse @panic("No output file arg!");
120 124
121 const compressor = std.compress.flate.deflate.compressor; 125 var write_buf: [4096]u8 = undefined;
122 var out_file = try std.fs.cwd().createFile(output_path, .{}); 126 var out_file = try std.fs.cwd().createFile(output_path, .{});
123 defer out_file.close(); 127 defer out_file.close();
124 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 128 var writer = out_file.writer(&write_buf);
125 const writer = out_comp.writer();
126 129
127 const endian = builtin.cpu.arch.endian(); 130 const endian = builtin.cpu.arch.endian();
128 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 131 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
129 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 132 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
130 133
131 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 134 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
132 try writer.writeAll(stage2.items); 135 try writer.interface.writeAll(stage2.items);
133 136
134 try out_comp.flush(); 137 try writer.interface.flush();
135} 138}
diff --git a/codegen/props.zig b/codegen/props.zig
index 24b22e0..6ff0a33 100644
--- a/codegen/props.zig
+++ b/codegen/props.zig
@@ -22,7 +22,7 @@ const BlockMap = std.HashMap(
22 std.hash_map.default_max_load_percentage, 22 std.hash_map.default_max_load_percentage,
23); 23);
24 24
25pub fn main() !void { 25pub fn main() anyerror!void {
26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 26 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
27 defer arena.deinit(); 27 defer arena.deinit();
28 const allocator = arena.allocator(); 28 const allocator = arena.allocator();
@@ -35,10 +35,9 @@ pub fn main() !void {
35 // Process PropList.txt 35 // Process PropList.txt
36 var in_file = try std.fs.cwd().openFile("data/unicode/PropList.txt", .{}); 36 var in_file = try std.fs.cwd().openFile("data/unicode/PropList.txt", .{});
37 defer in_file.close(); 37 defer in_file.close();
38 var in_buf = std.io.bufferedReader(in_file.reader()); 38 var in_reader = in_file.reader(&line_buf);
39 const in_reader = in_buf.reader();
40 39
41 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 40 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
42 if (line.len == 0 or line[0] == '#') continue; 41 if (line.len == 0 or line[0] == '#') continue;
43 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 42 const no_comment = if (mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
44 43
@@ -79,15 +78,20 @@ pub fn main() !void {
79 else => {}, 78 else => {},
80 } 79 }
81 } 80 }
81 } else |err| switch (err) {
82 error.EndOfStream => {},
83 else => {
84 return err;
85 },
82 } 86 }
83 87
84 var blocks_map = BlockMap.init(allocator); 88 var blocks_map = BlockMap.init(allocator);
85 defer blocks_map.deinit(); 89 defer blocks_map.deinit();
86 90
87 var stage1 = std.ArrayList(u16).init(allocator); 91 var stage1 = std.array_list.Managed(u16).init(allocator);
88 defer stage1.deinit(); 92 defer stage1.deinit();
89 93
90 var stage2 = std.ArrayList(u8).init(allocator); 94 var stage2 = std.array_list.Managed(u8).init(allocator);
91 defer stage2.deinit(); 95 defer stage2.deinit();
92 96
93 var block: Block = [_]u8{0} ** block_size; 97 var block: Block = [_]u8{0} ** block_size;
@@ -118,18 +122,16 @@ pub fn main() !void {
118 _ = args_iter.skip(); 122 _ = args_iter.skip();
119 const output_path = args_iter.next() orelse @panic("No output file arg!"); 123 const output_path = args_iter.next() orelse @panic("No output file arg!");
120 124
121 const compressor = std.compress.flate.deflate.compressor; 125 var write_buf: [4096]u8 = undefined;
122 var out_file = try std.fs.cwd().createFile(output_path, .{}); 126 var out_file = try std.fs.cwd().createFile(output_path, .{});
123 defer out_file.close(); 127 defer out_file.close();
124 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 128 var writer = out_file.writer(&write_buf);
125 const writer = out_comp.writer();
126 129
127 const endian = builtin.cpu.arch.endian(); 130 const endian = builtin.cpu.arch.endian();
128 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 131 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
129 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 132 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
130 133
131 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 134 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
132 try writer.writeAll(stage2.items); 135 try writer.interface.writeAll(stage2.items);
133 136 try writer.interface.flush();
134 try out_comp.flush();
135} 137}
diff --git a/codegen/scripts.zig b/codegen/scripts.zig
index 530205d..bdd3d9d 100644
--- a/codegen/scripts.zig
+++ b/codegen/scripts.zig
@@ -195,7 +195,7 @@ const BlockMap = std.HashMap(
195 std.hash_map.default_max_load_percentage, 195 std.hash_map.default_max_load_percentage,
196); 196);
197 197
198pub fn main() !void { 198pub fn main() anyerror!void {
199 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 199 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
200 defer arena.deinit(); 200 defer arena.deinit();
201 const allocator = arena.allocator(); 201 const allocator = arena.allocator();
@@ -208,10 +208,9 @@ pub fn main() !void {
208 // Process DerivedGeneralCategory.txt 208 // Process DerivedGeneralCategory.txt
209 var in_file = try std.fs.cwd().openFile("data/unicode/Scripts.txt", .{}); 209 var in_file = try std.fs.cwd().openFile("data/unicode/Scripts.txt", .{});
210 defer in_file.close(); 210 defer in_file.close();
211 var in_buf = std.io.bufferedReader(in_file.reader()); 211 var in_reader = in_file.reader(&line_buf);
212 const in_reader = in_buf.reader();
213 212
214 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 213 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
215 if (line.len == 0 or line[0] == '#') continue; 214 if (line.len == 0 or line[0] == '#') continue;
216 215
217 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 216 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -245,18 +244,22 @@ pub fn main() !void {
245 else => {}, 244 else => {},
246 } 245 }
247 } 246 }
247 } else |err| switch (err) {
248 error.EndOfStream => {},
249 else => {
250 return err;
251 },
248 } 252 }
249
250 var blocks_map = BlockMap.init(allocator); 253 var blocks_map = BlockMap.init(allocator);
251 defer blocks_map.deinit(); 254 defer blocks_map.deinit();
252 255
253 var stage1 = std.ArrayList(u16).init(allocator); 256 var stage1 = std.array_list.Managed(u16).init(allocator);
254 defer stage1.deinit(); 257 defer stage1.deinit();
255 258
256 var stage2 = std.ArrayList(u8).init(allocator); 259 var stage2 = std.array_list.Managed(u8).init(allocator);
257 defer stage2.deinit(); 260 defer stage2.deinit();
258 261
259 var stage3 = std.ArrayList(u8).init(allocator); 262 var stage3 = std.array_list.Managed(u8).init(allocator);
260 defer stage3.deinit(); 263 defer stage3.deinit();
261 264
262 var block: Block = [_]u8{0} ** block_size; 265 var block: Block = [_]u8{0} ** block_size;
@@ -295,21 +298,20 @@ pub fn main() !void {
295 _ = args_iter.skip(); 298 _ = args_iter.skip();
296 const output_path = args_iter.next() orelse @panic("No output file arg!"); 299 const output_path = args_iter.next() orelse @panic("No output file arg!");
297 300
298 const compressor = std.compress.flate.deflate.compressor; 301 var write_buf: [4096]u8 = undefined;
299 var out_file = try std.fs.cwd().createFile(output_path, .{}); 302 var out_file = try std.fs.cwd().createFile(output_path, .{});
300 defer out_file.close(); 303 defer out_file.close();
301 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 304 var writer = out_file.writer(&write_buf);
302 const writer = out_comp.writer();
303 305
304 const endian = builtin.cpu.arch.endian(); 306 const endian = builtin.cpu.arch.endian();
305 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 307 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
306 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 308 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
307 309
308 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 310 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
309 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 311 for (stage2.items) |i| try writer.interface.writeInt(u8, i, endian);
310 312
311 try writer.writeInt(u8, @intCast(stage3.items.len), endian); 313 try writer.interface.writeInt(u8, @intCast(stage3.items.len), endian);
312 for (stage3.items) |i| try writer.writeInt(u8, i, endian); 314 for (stage3.items) |i| try writer.interface.writeInt(u8, i, endian);
313 315
314 try out_comp.flush(); 316 try writer.interface.flush();
315} 317}
diff --git a/codegen/upper.zig b/codegen/upper.zig
index 5848911..7d96a0e 100644
--- a/codegen/upper.zig
+++ b/codegen/upper.zig
@@ -1,32 +1,29 @@
1const std = @import("std"); 1const std = @import("std");
2const builtin = @import("builtin"); 2const builtin = @import("builtin");
3 3
4pub fn main() !void { 4pub fn main() anyerror!void {
5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
6 defer arena.deinit(); 6 defer arena.deinit();
7 const allocator = arena.allocator(); 7 const allocator = arena.allocator();
8 8
9 var line_buf: [4096]u8 = undefined;
10 var write_buf: [4096]u8 = undefined;
9 // Process UnicodeData.txt 11 // Process UnicodeData.txt
10 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{}); 12 var in_file = try std.fs.cwd().openFile("data/unicode/UnicodeData.txt", .{});
11 defer in_file.close(); 13 defer in_file.close();
12 var in_buf = std.io.bufferedReader(in_file.reader()); 14 var in_reader = in_file.reader(&line_buf);
13 const in_reader = in_buf.reader();
14 15
15 var args_iter = try std.process.argsWithAllocator(allocator); 16 var args_iter = try std.process.argsWithAllocator(allocator);
16 defer args_iter.deinit(); 17 defer args_iter.deinit();
17 _ = args_iter.skip(); 18 _ = args_iter.skip();
18 const output_path = args_iter.next() orelse @panic("No output file arg!"); 19 const output_path = args_iter.next() orelse @panic("No output file arg!");
19 20
20 const compressor = std.compress.flate.deflate.compressor;
21 var out_file = try std.fs.cwd().createFile(output_path, .{}); 21 var out_file = try std.fs.cwd().createFile(output_path, .{});
22 defer out_file.close(); 22 defer out_file.close();
23 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 23 var file_writer = out_file.writer(&write_buf);
24 const writer = out_comp.writer();
25
26 const endian = builtin.cpu.arch.endian(); 24 const endian = builtin.cpu.arch.endian();
27 var line_buf: [4096]u8 = undefined;
28 25
29 lines: while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 26 lines: while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
30 if (line.len == 0) continue; 27 if (line.len == 0) continue;
31 28
32 var field_iter = std.mem.splitScalar(u8, line, ';'); 29 var field_iter = std.mem.splitScalar(u8, line, ';');
@@ -42,16 +39,24 @@ pub fn main() !void {
42 12 => { 39 12 => {
43 // Simple uppercase mapping 40 // Simple uppercase mapping
44 if (field.len == 0) continue :lines; 41 if (field.len == 0) continue :lines;
45 try writer.writeInt(i24, cp, endian); 42 try file_writer.interface.writeInt(i24, cp, endian);
46 const mapping = try std.fmt.parseInt(i24, field, 16); 43 const mapping = try std.fmt.parseInt(i24, field, 16);
47 try writer.writeInt(i24, mapping - cp, endian); 44 try file_writer.interface.writeInt(i24, mapping - cp, endian);
48 }, 45 },
49 46
50 else => {}, 47 else => {},
51 } 48 }
52 } 49 }
50 } else |err| switch (err) {
51 error.ReadFailed => {
52 return in_reader.err orelse err;
53 },
54 error.EndOfStream => {},
55 else => {
56 return err;
57 },
53 } 58 }
54 59
55 try writer.writeInt(u24, 0, endian); 60 try file_writer.interface.writeInt(u24, 0, endian);
56 try out_comp.flush(); 61 try file_writer.interface.flush();
57} 62}
diff --git a/codegen/wbp.zig b/codegen/wbp.zig
index 741103e..b1ed56a 100644
--- a/codegen/wbp.zig
+++ b/codegen/wbp.zig
@@ -43,7 +43,7 @@ const BlockMap = std.HashMap(
43 std.hash_map.default_max_load_percentage, 43 std.hash_map.default_max_load_percentage,
44); 44);
45 45
46pub fn main() !void { 46pub fn main() anyerror!void {
47 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 47 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
48 defer arena.deinit(); 48 defer arena.deinit();
49 const allocator = arena.allocator(); 49 const allocator = arena.allocator();
@@ -56,10 +56,9 @@ pub fn main() !void {
56 // Process HangulSyllableType.txt 56 // Process HangulSyllableType.txt
57 var in_file = try std.fs.cwd().openFile("data/unicode/auxiliary/WordBreakProperty.txt", .{}); 57 var in_file = try std.fs.cwd().openFile("data/unicode/auxiliary/WordBreakProperty.txt", .{});
58 defer in_file.close(); 58 defer in_file.close();
59 var in_buf = std.io.bufferedReader(in_file.reader()); 59 var in_reader = in_file.reader(&line_buf);
60 const in_reader = in_buf.reader();
61 60
62 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 61 while (in_reader.interface.takeDelimiterExclusive('\n')) |line| {
63 if (line.len == 0 or line[0] == '#') continue; 62 if (line.len == 0 or line[0] == '#') continue;
64 63
65 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 64 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
@@ -90,15 +89,19 @@ pub fn main() !void {
90 else => {}, 89 else => {},
91 } 90 }
92 } 91 }
92 } else |err| switch (err) {
93 error.EndOfStream => {},
94 else => {
95 return err;
96 },
93 } 97 }
94
95 var blocks_map = BlockMap.init(allocator); 98 var blocks_map = BlockMap.init(allocator);
96 defer blocks_map.deinit(); 99 defer blocks_map.deinit();
97 100
98 var stage1 = std.ArrayList(u16).init(allocator); 101 var stage1 = std.array_list.Managed(u16).init(allocator);
99 defer stage1.deinit(); 102 defer stage1.deinit();
100 103
101 var stage2 = std.ArrayList(u5).init(allocator); 104 var stage2 = std.array_list.Managed(u5).init(allocator);
102 defer stage2.deinit(); 105 defer stage2.deinit();
103 106
104 var block: Block = [_]u5{0} ** block_size; 107 var block: Block = [_]u5{0} ** block_size;
@@ -129,18 +132,17 @@ pub fn main() !void {
129 _ = args_iter.skip(); 132 _ = args_iter.skip();
130 const output_path = args_iter.next() orelse @panic("No output file arg!"); 133 const output_path = args_iter.next() orelse @panic("No output file arg!");
131 134
132 const compressor = std.compress.flate.deflate.compressor; 135 var write_buf: [4096]u8 = undefined;
133 var out_file = try std.fs.cwd().createFile(output_path, .{}); 136 var out_file = try std.fs.cwd().createFile(output_path, .{});
134 defer out_file.close(); 137 defer out_file.close();
135 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 138 var writer = out_file.writer(&write_buf);
136 const writer = out_comp.writer();
137 139
138 const endian = builtin.cpu.arch.endian(); 140 const endian = builtin.cpu.arch.endian();
139 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 141 try writer.interface.writeInt(u16, @intCast(stage1.items.len), endian);
140 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 142 for (stage1.items) |i| try writer.interface.writeInt(u16, i, endian);
141 143
142 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 144 try writer.interface.writeInt(u16, @intCast(stage2.items.len), endian);
143 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 145 for (stage2.items) |i| try writer.interface.writeInt(u8, i, endian);
144 146
145 try out_comp.flush(); 147 try writer.interface.flush();
146} 148}