From a3b5e884b12fdaa341010ef41bb9382fa0cd89f8 Mon Sep 17 00:00:00 2001 From: Michael Chaten Date: Sat, 13 Sep 2025 08:38:24 -0700 Subject: Update codebase to Zig 0.15.1. Removes compression support --- codegen/fold.zig | 59 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 27 deletions(-) (limited to 'codegen/fold.zig') 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"); const builtin = @import("builtin"); const mem = std.mem; -pub fn main() !void { +pub fn main() anyerror!void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer std.debug.assert(gpa.deinit() == .ok); const allocator = gpa.allocator(); + var line_buf: [4096]u8 = undefined; // Process DerivedCoreProperties.txt var props_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); defer props_file.close(); - var props_buf = std.io.bufferedReader(props_file.reader()); - const props_reader = props_buf.reader(); + var props_reader = props_file.reader(&line_buf); var props_map = std.AutoHashMap(u21, void).init(allocator); defer props_map.deinit(); - var line_buf: [4096]u8 = undefined; - - props_lines: while (try props_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { + props_lines: while (props_reader.interface.takeDelimiterExclusive('\n')) |line| { if (line.len == 0 or line[0] == '#') continue; const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; @@ -49,18 +47,21 @@ pub fn main() !void { else => {}, } } + } else |err| switch (err) { + error.EndOfStream => {}, + else => { + return err; + }, } - var codepoint_mapping = std.AutoArrayHashMap(u21, [3]u21).init(allocator); defer codepoint_mapping.deinit(); // Process CaseFolding.txt var cp_file = try std.fs.cwd().openFile("data/unicode/CaseFolding.txt", .{}); defer cp_file.close(); - var cp_buf = std.io.bufferedReader(cp_file.reader()); - const cp_reader = cp_buf.reader(); + var cp_reader = cp_file.reader(&line_buf); - while (try cp_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { + while (cp_reader.interface.takeDelimiterExclusive('\n')) |line| { if (line.len == 0 or line[0] == '#') continue; var field_it = std.mem.splitScalar(u8, line, ';'); @@ -81,9 +82,14 @@ pub fn main() !void { } try codepoint_mapping.putNoClobber(codepoint, mapping_buf); + } else |err| switch (err) { + error.EndOfStream => {}, + else => { + return err; + }, } - var changes_when_casefolded_exceptions = std.ArrayList(u21).init(allocator); + var changes_when_casefolded_exceptions = std.array_list.Managed(u21).init(allocator); defer changes_when_casefolded_exceptions.deinit(); { @@ -221,32 +227,31 @@ pub fn main() !void { _ = args_iter.skip(); const output_path = args_iter.next() orelse @panic("No output file arg!"); - const compressor = std.compress.flate.deflate.compressor; + var write_buf: [4096]u8 = undefined; var out_file = try std.fs.cwd().createFile(output_path, .{}); defer out_file.close(); - var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); - const writer = out_comp.writer(); + var writer = out_file.writer(&write_buf); const endian = builtin.cpu.arch.endian(); // Table metadata. - try writer.writeInt(u24, @intCast(codepoint_cutoff), endian); - try writer.writeInt(u24, @intCast(multiple_codepoint_start), endian); + try writer.interface.writeInt(u24, @intCast(codepoint_cutoff), endian); + try writer.interface.writeInt(u24, @intCast(multiple_codepoint_start), endian); // Stage 1 - try writer.writeInt(u16, @intCast(meaningful_stage1.len), endian); - try writer.writeAll(meaningful_stage1); + try writer.interface.writeInt(u16, @intCast(meaningful_stage1.len), endian); + try writer.interface.writeAll(meaningful_stage1); // Stage 2 - try writer.writeInt(u16, @intCast(stage2.len), endian); - try writer.writeAll(stage2); + try writer.interface.writeInt(u16, @intCast(stage2.len), endian); + try writer.interface.writeAll(stage2); // Stage 3 - try writer.writeInt(u16, @intCast(stage3.len), endian); - for (stage3) |offset| try writer.writeInt(i24, offset, endian); + try writer.interface.writeInt(u16, @intCast(stage3.len), endian); + for (stage3) |offset| try writer.interface.writeInt(i24, offset, endian); // Changes when case folded // Min and max - try writer.writeInt(u24, std.mem.min(u21, changes_when_casefolded_exceptions.items), endian); - try writer.writeInt(u24, std.mem.max(u21, changes_when_casefolded_exceptions.items), endian); - try writer.writeInt(u16, @intCast(changes_when_casefolded_exceptions.items.len), endian); - for (changes_when_casefolded_exceptions.items) |cp| try writer.writeInt(u24, cp, endian); + try writer.interface.writeInt(u24, std.mem.min(u21, changes_when_casefolded_exceptions.items), endian); + try writer.interface.writeInt(u24, std.mem.max(u21, changes_when_casefolded_exceptions.items), endian); + try writer.interface.writeInt(u16, @intCast(changes_when_casefolded_exceptions.items.len), endian); + for (changes_when_casefolded_exceptions.items) |cp| try writer.interface.writeInt(u24, cp, endian); - try out_comp.flush(); + try writer.interface.flush(); } } -- cgit v1.2.3 From 749197a3f9d25e211615960c02380a3d659b20f9 Mon Sep 17 00:00:00 2001 From: Michael Chaten Date: Sun, 14 Sep 2025 04:11:09 -0700 Subject: Embed data files in scripts rather than relying on filesystem access for easier packaging --- codegen/fold.zig | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'codegen/fold.zig') diff --git a/codegen/fold.zig b/codegen/fold.zig index cc381a8..d927795 100644 --- a/codegen/fold.zig +++ b/codegen/fold.zig @@ -7,16 +7,13 @@ pub fn main() anyerror!void { defer std.debug.assert(gpa.deinit() == .ok); const allocator = gpa.allocator(); - var line_buf: [4096]u8 = undefined; // Process DerivedCoreProperties.txt - var props_file = try std.fs.cwd().openFile("data/unicode/DerivedCoreProperties.txt", .{}); - defer props_file.close(); - var props_reader = props_file.reader(&line_buf); + var props_reader = std.io.Reader.fixed(@embedFile("DerivedCoreProperties.txt")); var props_map = std.AutoHashMap(u21, void).init(allocator); defer props_map.deinit(); - props_lines: while (props_reader.interface.takeDelimiterExclusive('\n')) |line| { + props_lines: while (props_reader.takeDelimiterExclusive('\n')) |line| { if (line.len == 0 or line[0] == '#') continue; const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; @@ -57,11 +54,9 @@ pub fn main() anyerror!void { defer codepoint_mapping.deinit(); // Process CaseFolding.txt - var cp_file = try std.fs.cwd().openFile("data/unicode/CaseFolding.txt", .{}); - defer cp_file.close(); - var cp_reader = cp_file.reader(&line_buf); - while (cp_reader.interface.takeDelimiterExclusive('\n')) |line| { + var cp_reader = std.io.Reader.fixed(@embedFile("CaseFolding.txt")); + while (cp_reader.takeDelimiterExclusive('\n')) |line| { if (line.len == 0 or line[0] == '#') continue; var field_it = std.mem.splitScalar(u8, line, ';'); -- cgit v1.2.3 From 2f02c3b16c073d0bd3d9368a66ce272a574f75a3 Mon Sep 17 00:00:00 2001 From: Jay Date: Sat, 8 Nov 2025 19:59:08 +1100 Subject: Use takeDelimiterInclusive to support Zig 0.15.2 --- codegen/fold.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'codegen/fold.zig') diff --git a/codegen/fold.zig b/codegen/fold.zig index d927795..366ed79 100644 --- a/codegen/fold.zig +++ b/codegen/fold.zig @@ -13,7 +13,8 @@ pub fn main() anyerror!void { var props_map = std.AutoHashMap(u21, void).init(allocator); defer props_map.deinit(); - props_lines: while (props_reader.takeDelimiterExclusive('\n')) |line| { + props_lines: while (props_reader.takeDelimiterInclusive('\n')) |took| { + const line = std.mem.trimRight(u8, took, "\n"); if (line.len == 0 or line[0] == '#') continue; const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; @@ -56,7 +57,8 @@ pub fn main() anyerror!void { // Process CaseFolding.txt var cp_reader = std.io.Reader.fixed(@embedFile("CaseFolding.txt")); - while (cp_reader.takeDelimiterExclusive('\n')) |line| { + while (cp_reader.takeDelimiterInclusive('\n')) |took| { + const line = std.mem.trimRight(u8, took, "\n"); if (line.len == 0 or line[0] == '#') continue; var field_it = std.mem.splitScalar(u8, line, ';'); -- cgit v1.2.3