1const std = @import("std");
2const common = @import("./_common.zig");
3
4pub usingnamespace common.Main(struct {
5 pub const source_file = "DerivedNormalizationProps";
6
7 pub const dest_file = "src/derived_normalization_props.zig";
8
9 pub const dest_header =
10 \\const ucd = @import("./lib.zig");
11 \\
12 \\pub const Range = struct {
13 \\ from: u21,
14 \\ to: u21,
15 \\};
16 \\
17 ;
18
19 pub const dest_footer = "";
20
21 var sections: std.StringArrayHashMapUnmanaged(std.ArrayListUnmanaged([]const u8)) = .{};
22
23 pub fn exec(alloc: std.mem.Allocator, line: []const u8, writer: anytype) !void {
24 _ = writer;
25 var it = std.mem.tokenizeAny(u8, line, " ; ");
26
27 const cp_range = it.next().?;
28 const rest = it.rest();
29
30 const gop = try sections.getOrPut(alloc, try alloc.dupe(u8, rest));
31 if (!gop.found_existing) gop.value_ptr.* = .{};
32 try gop.value_ptr.append(alloc, try alloc.dupe(u8, cp_range));
33 }
34
35 pub fn after(alloc: std.mem.Allocator, writer: anytype) !void {
36 _ = alloc;
37
38 {
39 const list = sections.fetchSwapRemove("Full_Composition_Exclusion ").?;
40 try writer.writeAll("\n");
41 try writer.writeAll("pub const full_composition_exclusion = struct {\n");
42 try writer.writeAll(" pub const data = [_]u21{\n");
43 for (list.value.items) |item| {
44 if (std.mem.indexOf(u8, item, "..") == null) {
45 try writer.writeAll(" 0x");
46 try writer.writeAll(item);
47 try writer.writeAll(",\n");
48 }
49 }
50 try writer.writeAll(" };\n");
51 try writer.writeAll(" pub const data_range = [_]Range{\n");
52 for (list.value.items) |item| {
53 if (std.mem.indexOf(u8, item, "..")) |idx| {
54 try writer.writeAll(" .{ .from = 0x");
55 try writer.writeAll(item[0..idx]);
56 try writer.writeAll(", .to = 0x");
57 try writer.writeAll(item[idx + 2 ..]);
58 try writer.writeAll(" },\n");
59 }
60 }
61 try writer.writeAll(" };\n");
62 try writer.writeAll("};\n");
63 }
64 {
65 // "NFD_QC; N "
66 const list = sections.fetchSwapRemove("NFD_QC; N ").?;
67 try writer.writeAll("\n");
68 try writer.writeAll("pub const nfd_qc_n = struct {\n");
69 try writer.writeAll(" pub const data = [_]u21{\n");
70 for (list.value.items) |item| {
71 if (std.mem.indexOf(u8, item, "..") == null) {
72 try writer.writeAll(" 0x");
73 try writer.writeAll(item);
74 try writer.writeAll(",\n");
75 }
76 }
77 try writer.writeAll(" };\n");
78 try writer.writeAll(" pub const data_range = [_]Range{\n");
79 for (list.value.items) |item| {
80 if (std.mem.indexOf(u8, item, "..")) |idx| {
81 try writer.writeAll(" .{ .from = 0x");
82 try writer.writeAll(item[0..idx]);
83 try writer.writeAll(", .to = 0x");
84 try writer.writeAll(item[idx + 2 ..]);
85 try writer.writeAll(" },\n");
86 }
87 }
88 try writer.writeAll(" };\n");
89 try writer.writeAll("};\n");
90 }
91 {
92 // "NFC_QC; N "
93 const list = sections.fetchSwapRemove("NFC_QC; N ").?;
94 try writer.writeAll("\n");
95 try writer.writeAll("pub const nfc_qc_n = struct {\n");
96 try writer.writeAll(" pub const data = [_]u21{\n");
97 for (list.value.items) |item| {
98 if (std.mem.indexOf(u8, item, "..") == null) {
99 try writer.writeAll(" 0x");
100 try writer.writeAll(item);
101 try writer.writeAll(",\n");
102 }
103 }
104 try writer.writeAll(" };\n");
105 try writer.writeAll(" pub const data_range = [_]Range{\n");
106 for (list.value.items) |item| {
107 if (std.mem.indexOf(u8, item, "..")) |idx| {
108 try writer.writeAll(" .{ .from = 0x");
109 try writer.writeAll(item[0..idx]);
110 try writer.writeAll(", .to = 0x");
111 try writer.writeAll(item[idx + 2 ..]);
112 try writer.writeAll(" },\n");
113 }
114 }
115 try writer.writeAll(" };\n");
116 try writer.writeAll("};\n");
117 }
118 {
119 // "NFC_QC; M "
120 const list = sections.fetchSwapRemove("NFC_QC; M ").?;
121 try writer.writeAll("\n");
122 try writer.writeAll("pub const nfc_qc_m = struct {\n");
123 try writer.writeAll(" pub const data = [_]u21{\n");
124 for (list.value.items) |item| {
125 if (std.mem.indexOf(u8, item, "..") == null) {
126 try writer.writeAll(" 0x");
127 try writer.writeAll(item);
128 try writer.writeAll(",\n");
129 }
130 }
131 try writer.writeAll(" };\n");
132 try writer.writeAll(" pub const data_range = [_]Range{\n");
133 for (list.value.items) |item| {
134 if (std.mem.indexOf(u8, item, "..")) |idx| {
135 try writer.writeAll(" .{ .from = 0x");
136 try writer.writeAll(item[0..idx]);
137 try writer.writeAll(", .to = 0x");
138 try writer.writeAll(item[idx + 2 ..]);
139 try writer.writeAll(" },\n");
140 }
141 }
142 try writer.writeAll(" };\n");
143 try writer.writeAll("};\n");
144 }
145 {
146 // "NFKD_QC; N "
147 const list = sections.fetchSwapRemove("NFKD_QC; N ").?;
148 try writer.writeAll("\n");
149 try writer.writeAll("pub const nfkd_qc_n = struct {\n");
150 try writer.writeAll(" pub const data = [_]u21{\n");
151 for (list.value.items) |item| {
152 if (std.mem.indexOf(u8, item, "..") == null) {
153 try writer.writeAll(" 0x");
154 try writer.writeAll(item);
155 try writer.writeAll(",\n");
156 }
157 }
158 try writer.writeAll(" };\n");
159 try writer.writeAll(" pub const data_range = [_]Range{\n");
160 for (list.value.items) |item| {
161 if (std.mem.indexOf(u8, item, "..")) |idx| {
162 try writer.writeAll(" .{ .from = 0x");
163 try writer.writeAll(item[0..idx]);
164 try writer.writeAll(", .to = 0x");
165 try writer.writeAll(item[idx + 2 ..]);
166 try writer.writeAll(" },\n");
167 }
168 }
169 try writer.writeAll(" };\n");
170 try writer.writeAll("};\n");
171 }
172 {
173 // "NFKC_QC; N "
174 const list = sections.fetchSwapRemove("NFKC_QC; N ").?;
175 try writer.writeAll("\n");
176 try writer.writeAll("pub const nfkc_qc_n = struct {\n");
177 try writer.writeAll(" pub const data = [_]u21{\n");
178 for (list.value.items) |item| {
179 if (std.mem.indexOf(u8, item, "..") == null) {
180 try writer.writeAll(" 0x");
181 try writer.writeAll(item);
182 try writer.writeAll(",\n");
183 }
184 }
185 try writer.writeAll(" };\n");
186 try writer.writeAll(" pub const data_range = [_]Range{\n");
187 for (list.value.items) |item| {
188 if (std.mem.indexOf(u8, item, "..")) |idx| {
189 try writer.writeAll(" .{ .from = 0x");
190 try writer.writeAll(item[0..idx]);
191 try writer.writeAll(", .to = 0x");
192 try writer.writeAll(item[idx + 2 ..]);
193 try writer.writeAll(" },\n");
194 }
195 }
196 try writer.writeAll(" };\n");
197 try writer.writeAll("};\n");
198 }
199 {
200 // "NFKC_QC; M "
201 const list = sections.fetchSwapRemove("NFKC_QC; M ").?;
202 try writer.writeAll("\n");
203 try writer.writeAll("pub const nfkc_qc_m = struct {\n");
204 try writer.writeAll(" pub const data = [_]u21{\n");
205 for (list.value.items) |item| {
206 if (std.mem.indexOf(u8, item, "..") == null) {
207 try writer.writeAll(" 0x");
208 try writer.writeAll(item);
209 try writer.writeAll(",\n");
210 }
211 }
212 try writer.writeAll(" };\n");
213 try writer.writeAll(" pub const data_range = [_]Range{\n");
214 for (list.value.items) |item| {
215 if (std.mem.indexOf(u8, item, "..")) |idx| {
216 try writer.writeAll(" .{ .from = 0x");
217 try writer.writeAll(item[0..idx]);
218 try writer.writeAll(", .to = 0x");
219 try writer.writeAll(item[idx + 2 ..]);
220 try writer.writeAll(" },\n");
221 }
222 }
223 try writer.writeAll(" };\n");
224 try writer.writeAll("};\n");
225 }
226 {
227 // NFKC_CF
228 }
229 {
230 // NFKC_SCF
231 }
232 {
233 // "Changes_When_NFKC_Casefolded "
234 const list = sections.fetchSwapRemove("Changes_When_NFKC_Casefolded ").?;
235 try writer.writeAll("\n");
236 try writer.writeAll("pub const changes_when_nfc_casefolded = struct {\n");
237 try writer.writeAll(" pub const data = [_]u21{\n");
238 for (list.value.items) |item| {
239 if (std.mem.indexOf(u8, item, "..") == null) {
240 try writer.writeAll(" 0x");
241 try writer.writeAll(item);
242 try writer.writeAll(",\n");
243 }
244 }
245 try writer.writeAll(" };\n");
246 try writer.writeAll(" pub const data_range = [_]Range{\n");
247 for (list.value.items) |item| {
248 if (std.mem.indexOf(u8, item, "..")) |idx| {
249 try writer.writeAll(" .{ .from = 0x");
250 try writer.writeAll(item[0..idx]);
251 try writer.writeAll(", .to = 0x");
252 try writer.writeAll(item[idx + 2 ..]);
253 try writer.writeAll(" },\n");
254 }
255 }
256 try writer.writeAll(" };\n");
257 try writer.writeAll("};\n");
258 }
259 }
260});