summaryrefslogtreecommitdiff
path: root/codegen/emoji.zig
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/emoji.zig')
-rw-r--r--codegen/emoji.zig56
1 files changed, 35 insertions, 21 deletions
diff --git a/codegen/emoji.zig b/codegen/emoji.zig
index 0a4dbe6..c44c483 100644
--- a/codegen/emoji.zig
+++ b/codegen/emoji.zig
@@ -44,21 +44,17 @@ pub fn main() !void {
44 var emoji_map = std.AutoHashMap(u21, Emoji).init(allocator); 44 var emoji_map = std.AutoHashMap(u21, Emoji).init(allocator);
45 defer emoji_map.deinit(); 45 defer emoji_map.deinit();
46 46
47 var line_buf: [4096]u8 = undefined;
48
49 // Process Emoji 47 // Process Emoji
50 var in_file = try std.fs.cwd().openFile("data/unicode/emoji/emoji-data.txt", .{});
51 defer in_file.close();
52 var in_buf = std.io.bufferedReader(in_file.reader());
53 const in_reader = in_buf.reader();
54 48
55 while (try in_reader.readUntilDelimiterOrEof(&line_buf, '\n')) |line| { 49 var @"emo-reader" = std.io.Reader.fixed(@embedFile("emoji-data.txt"));
56 if (line.len == 0 or line[0] == '#') continue; 50 var count: usize = 0; // XXX: remove
51 while (@"emo-reader".takeDelimiterInclusive('\n')) |line| {
52 count += 1;
53 if (line.len <= 1 or line[0] == '#') continue;
57 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line; 54 const no_comment = if (std.mem.indexOfScalar(u8, line, '#')) |octo| line[0..octo] else line;
58 55
59 var field_iter = std.mem.tokenizeAny(u8, no_comment, "; "); 56 var field_iter = std.mem.tokenizeAny(u8, no_comment, "; ");
60 var current_code: [2]u21 = undefined; 57 var current_code: [2]u21 = undefined;
61
62 var i: usize = 0; 58 var i: usize = 0;
63 while (field_iter.next()) |field| : (i += 1) { 59 while (field_iter.next()) |field| : (i += 1) {
64 switch (i) { 60 switch (i) {
@@ -91,15 +87,20 @@ pub fn main() !void {
91 else => {}, 87 else => {},
92 } 88 }
93 } 89 }
90 } else |err| switch (err) {
91 error.EndOfStream => {},
92 else => {
93 return err;
94 },
94 } 95 }
95 96
96 var blocks_map = BlockMap.init(allocator); 97 var blocks_map = BlockMap.init(allocator);
97 defer blocks_map.deinit(); 98 defer blocks_map.deinit();
98 99
99 var stage1 = std.ArrayList(u16).init(allocator); 100 var stage1 = std.array_list.Managed(u16).init(allocator);
100 defer stage1.deinit(); 101 defer stage1.deinit();
101 102
102 var stage2 = std.ArrayList(u6).init(allocator); 103 var stage2 = std.array_list.Managed(u6).init(allocator);
103 defer stage2.deinit(); 104 defer stage2.deinit();
104 105
105 var block: Block = [_]u6{0} ** block_size; 106 var block: Block = [_]u6{0} ** block_size;
@@ -129,18 +130,31 @@ pub fn main() !void {
129 _ = args_iter.skip(); 130 _ = args_iter.skip();
130 const output_path = args_iter.next() orelse @panic("No output file arg!"); 131 const output_path = args_iter.next() orelse @panic("No output file arg!");
131 132
132 const compressor = std.compress.flate.deflate.compressor; 133 var write_buf: [4096]u8 = undefined;
133 var out_file = try std.fs.cwd().createFile(output_path, .{}); 134 var out_file = try std.fs.cwd().createFile(output_path, .{});
134 defer out_file.close(); 135 defer out_file.close();
135 var out_comp = try compressor(.raw, out_file.writer(), .{ .level = .best }); 136 var writer = out_file.writer(&write_buf);
136 const writer = out_comp.writer(); 137
137 138 try writer.interface.print(
138 const endian = builtin.cpu.arch.endian(); 139 \\//! This file is auto-generated. Do not edit.
139 try writer.writeInt(u16, @intCast(stage1.items.len), endian); 140 \\
140 for (stage1.items) |i| try writer.writeInt(u16, i, endian); 141 \\pub const s1: [{}]u16 = .{{
142 , .{stage1.items.len});
143 for (stage1.items) |entry| try writer.interface.print("{}, ", .{entry});
144
145 try writer.interface.print(
146 \\
147 \\}};
148 \\
149 \\pub const s2: [{}]u6 = .{{
150 , .{stage2.items.len});
151 for (stage2.items) |entry| {
152 try writer.interface.print("{}, ", .{entry});
153 }
141 154
142 try writer.writeInt(u16, @intCast(stage2.items.len), endian); 155 try writer.interface.writeAll(
143 for (stage2.items) |i| try writer.writeInt(u8, i, endian); 156 \\};
157 );
144 158
145 try out_comp.flush(); 159 try writer.interface.flush();
146} 160}