authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-08-08 04:48:11-07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-08-08 04:48:11-07:00
logf1bf1b12fe12d02113cb8106a33578326a13b6a1
treeff323e89ece234f9a4aabbf0b7658bf1b784a88a
parent957975718afb9f8212ba86b9f9269bd3ff6d8109
signature Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add generate Zone enum


6 files changed, 475 insertions(+), 0 deletions(-)

build.zig+23
...@@ -24,4 +24,27 @@ pub fn build(b: *std.Build) void {...@@ -24,4 +24,27 @@ pub fn build(b: *std.Build) void {
2424
25 const t_step = b.step("test", "Run all library tests");25 const t_step = b.step("test", "Run all library tests");
26 t_step.dependOn(&run_t.step);26 t_step.dependOn(&run_t.step);
27
28 //
29
30 const g = b.addExecutable(.{
31 .name = "generate",
32 .root_module = b.addModule("root", .{
33 .root_source_file = b.path("./generate.zig"),
34 .target = target,
35 .optimize = mode,
36 .link_libc = true,
37 }),
38 });
39 deps.addAllTo(g);
40 g.use_llvm = !disable_llvm;
41 g.use_lld = !disable_llvm;
42 b.getInstallStep().dependOn(&g.step);
43
44 const run_g = b.addRunArtifact(g);
45 run_g.setCwd(b.path("."));
46 run_g.has_side_effects = true;
47
48 const g_step = b.step("generate", "");
49 g_step.dependOn(&run_g.step);
27}50}
generate.zig created+95
...@@ -0,0 +1,95 @@
1// grep '^Zone' africa antarctica asia australasia europe northamerica southamerica etcetera factory backward | cut -d':' -f2- | awk '{$1=$1}1' | cut -d' ' -f2 | sort | grep -e '/'
2
3const std = @import("std");
4const nfs = @import("nfs");
5const nio = @import("nio");
6const extras = @import("extras");
7
8const deps = @import("./deps.zig");
9
10pub fn main() !void {
11 const sources = [_][:0]const u8{
12 "africa",
13 "antarctica",
14 "asia",
15 "australasia",
16 "europe",
17 "northamerica",
18 "southamerica",
19 "etcetera",
20 "factory",
21 "backward",
22 };
23
24 const path = deps.dirs._xw6xua7fqgft;
25 const allocator = std.heap.c_allocator;
26
27 var dir = try nfs.cwd().openDir(path, .{});
28 defer dir.close();
29
30 var zones: std.ArrayList([]const u8) = .empty;
31 defer zones.deinit(allocator);
32
33 for (&sources) |nm| {
34 var file = try dir.openFile(nm, .{});
35 defer file.close();
36
37 const content = try file.mmap();
38 defer nfs.munmap(content);
39
40 var iter = std.mem.splitScalar(u8, content, '\n');
41 while (iter.next()) |line| {
42 if (!std.mem.startsWith(u8, line, "Zone")) continue;
43
44 var jter = std.mem.tokenizeAny(u8, line, " \t");
45 _ = jter.next().?;
46 const name = jter.next().?;
47 if (std.mem.indexOfScalar(u8, name, '/') == null) continue;
48 try zones.append(allocator, try allocator.dupe(u8, name));
49 }
50 }
51
52 std.mem.sort([]const u8, zones.items, {}, extras.lessThanSlice([]const u8));
53
54 var out_file = try nfs.cwd().createFile("zone.zig", .{});
55 defer out_file.close();
56 var out_w: nio.BufferedWriter(4096, nfs.File) = .init(out_file);
57
58 try out_w.writeAll("pub const Zone = enum {\n");
59 for (zones.items) |z| {
60 try out_w.print(" {},\n", .{FormatId{ .bytes = z }});
61 }
62 try out_w.writeAll("};\n");
63 try out_w.flush();
64}
65
66const FormatId = struct {
67 bytes: []const u8,
68
69 /// Print the string as a Zig identifier, escaping it with `@""` syntax if needed.
70 pub fn nprint(ctx: FormatId, writer: anytype) !void {
71 const bytes = ctx.bytes;
72 if (std.zig.isValidId(bytes) and (!std.zig.isPrimitive(bytes)) and (!std.zig.isUnderscore(bytes))) {
73 return writer.writeAll(bytes);
74 }
75 try writer.writeAll("@\"");
76 try stringEscape(bytes, writer);
77 try writer.writeAll("\"");
78 }
79
80 fn stringEscape(bytes: []const u8, w: anytype) !void {
81 for (bytes) |byte| switch (byte) {
82 '\n' => try w.writeAll("\\n"),
83 '\r' => try w.writeAll("\\r"),
84 '\t' => try w.writeAll("\\t"),
85 '\\' => try w.writeAll("\\\\"),
86 '"' => try w.writeAll("\\\""),
87 '\'' => try w.writeAll("'"),
88 ' ', '!', '#'...'&', '('...'[', ']'...'~' => try w.writeAll(&.{byte}),
89 else => {
90 try w.writeAll("\\x");
91 try w.print("{x:2>0}", .{byte});
92 },
93 };
94 }
95};
licenses.txt+5
...@@ -6,6 +6,11 @@ MIT:...@@ -6,6 +6,11 @@ MIT:
6- git https://github.com/nektro/zig-sys-darwin6- git https://github.com/nektro/zig-sys-darwin
7- git https://github.com/nektro/zig-sys-linux7- git https://github.com/nektro/zig-sys-linux
88
9CC0-1.0:
10= https://spdx.org/licenses/CC0-1.0
11- git https://github.com/eggert/tz
12
9MPL-2.0:13MPL-2.0:
10= https://spdx.org/licenses/MPL-2.014= https://spdx.org/licenses/MPL-2.0
15- git https://github.com/nektro/zig-nfs
11- git https://github.com/nektro/zig-nio16- git https://github.com/nektro/zig-nio
time.zig+2
...@@ -11,6 +11,8 @@ const sys = switch (builtin.target.os.tag) {...@@ -11,6 +11,8 @@ const sys = switch (builtin.target.os.tag) {
11 else => unreachable, // TODO:11 else => unreachable, // TODO:
12};12};
1313
14pub const Zone = @import("./zone.zig").Zone;
15
14pub const DateTime = struct {16pub const DateTime = struct {
15 ms: u16,17 ms: u16,
16 seconds: u8,18 seconds: u8,
zig.mod+8
...@@ -10,3 +10,11 @@ dependencies:...@@ -10,3 +10,11 @@ dependencies:
10 - src: git https://github.com/nektro/zig-nio10 - src: git https://github.com/nektro/zig-nio
11root_dependencies:11root_dependencies:
12 - src: git https://github.com/nektro/zig-expect12 - src: git https://github.com/nektro/zig-expect
13 - src: git https://github.com/nektro/zig-nfs
14 - src: git https://github.com/nektro/zig-nio
15 - src: git https://github.com/nektro/zig-extras
16
17 - src: git https://github.com/eggert/tz
18 id: xw6xua7fqgft9ezk64mdj4nirj4hlz6s84vy2n5gu9ihrwuu
19 license: CC0-1.0
20 keep: true
zone.zig created+342
...@@ -0,0 +1,342 @@
1pub const Zone = enum {
2 @"Africa/Abidjan",
3 @"Africa/Algiers",
4 @"Africa/Bissau",
5 @"Africa/Cairo",
6 @"Africa/Casablanca",
7 @"Africa/Ceuta",
8 @"Africa/El_Aaiun",
9 @"Africa/Johannesburg",
10 @"Africa/Juba",
11 @"Africa/Khartoum",
12 @"Africa/Lagos",
13 @"Africa/Maputo",
14 @"Africa/Monrovia",
15 @"Africa/Nairobi",
16 @"Africa/Ndjamena",
17 @"Africa/Sao_Tome",
18 @"Africa/Tripoli",
19 @"Africa/Tunis",
20 @"Africa/Windhoek",
21 @"America/Adak",
22 @"America/Anchorage",
23 @"America/Araguaina",
24 @"America/Argentina/Buenos_Aires",
25 @"America/Argentina/Catamarca",
26 @"America/Argentina/Cordoba",
27 @"America/Argentina/Jujuy",
28 @"America/Argentina/La_Rioja",
29 @"America/Argentina/Mendoza",
30 @"America/Argentina/Rio_Gallegos",
31 @"America/Argentina/Salta",
32 @"America/Argentina/San_Juan",
33 @"America/Argentina/San_Luis",
34 @"America/Argentina/Tucuman",
35 @"America/Argentina/Ushuaia",
36 @"America/Asuncion",
37 @"America/Bahia_Banderas",
38 @"America/Bahia",
39 @"America/Barbados",
40 @"America/Belem",
41 @"America/Belize",
42 @"America/Boa_Vista",
43 @"America/Bogota",
44 @"America/Boise",
45 @"America/Cambridge_Bay",
46 @"America/Campo_Grande",
47 @"America/Cancun",
48 @"America/Caracas",
49 @"America/Cayenne",
50 @"America/Chicago",
51 @"America/Chihuahua",
52 @"America/Ciudad_Juarez",
53 @"America/Costa_Rica",
54 @"America/Coyhaique",
55 @"America/Cuiaba",
56 @"America/Danmarkshavn",
57 @"America/Dawson_Creek",
58 @"America/Dawson",
59 @"America/Denver",
60 @"America/Detroit",
61 @"America/Edmonton",
62 @"America/Eirunepe",
63 @"America/El_Salvador",
64 @"America/Fort_Nelson",
65 @"America/Fortaleza",
66 @"America/Glace_Bay",
67 @"America/Goose_Bay",
68 @"America/Grand_Turk",
69 @"America/Guatemala",
70 @"America/Guayaquil",
71 @"America/Guyana",
72 @"America/Halifax",
73 @"America/Havana",
74 @"America/Hermosillo",
75 @"America/Indiana/Indianapolis",
76 @"America/Indiana/Knox",
77 @"America/Indiana/Marengo",
78 @"America/Indiana/Petersburg",
79 @"America/Indiana/Tell_City",
80 @"America/Indiana/Vevay",
81 @"America/Indiana/Vincennes",
82 @"America/Indiana/Winamac",
83 @"America/Inuvik",
84 @"America/Iqaluit",
85 @"America/Jamaica",
86 @"America/Juneau",
87 @"America/Kentucky/Louisville",
88 @"America/Kentucky/Monticello",
89 @"America/La_Paz",
90 @"America/Lima",
91 @"America/Los_Angeles",
92 @"America/Maceio",
93 @"America/Managua",
94 @"America/Manaus",
95 @"America/Martinique",
96 @"America/Matamoros",
97 @"America/Mazatlan",
98 @"America/Menominee",
99 @"America/Merida",
100 @"America/Metlakatla",
101 @"America/Mexico_City",
102 @"America/Miquelon",
103 @"America/Moncton",
104 @"America/Monterrey",
105 @"America/Montevideo",
106 @"America/New_York",
107 @"America/Nome",
108 @"America/Noronha",
109 @"America/North_Dakota/Beulah",
110 @"America/North_Dakota/Center",
111 @"America/North_Dakota/New_Salem",
112 @"America/Nuuk",
113 @"America/Ojinaga",
114 @"America/Panama",
115 @"America/Paramaribo",
116 @"America/Phoenix",
117 @"America/Port-au-Prince",
118 @"America/Porto_Velho",
119 @"America/Puerto_Rico",
120 @"America/Punta_Arenas",
121 @"America/Rankin_Inlet",
122 @"America/Recife",
123 @"America/Regina",
124 @"America/Resolute",
125 @"America/Rio_Branco",
126 @"America/Santarem",
127 @"America/Santiago",
128 @"America/Santo_Domingo",
129 @"America/Sao_Paulo",
130 @"America/Scoresbysund",
131 @"America/Sitka",
132 @"America/St_Johns",
133 @"America/Swift_Current",
134 @"America/Tegucigalpa",
135 @"America/Thule",
136 @"America/Tijuana",
137 @"America/Toronto",
138 @"America/Vancouver",
139 @"America/Whitehorse",
140 @"America/Winnipeg",
141 @"America/Yakutat",
142 @"Antarctica/Casey",
143 @"Antarctica/Davis",
144 @"Antarctica/Macquarie",
145 @"Antarctica/Mawson",
146 @"Antarctica/Palmer",
147 @"Antarctica/Rothera",
148 @"Antarctica/Troll",
149 @"Antarctica/Vostok",
150 @"Asia/Almaty",
151 @"Asia/Amman",
152 @"Asia/Anadyr",
153 @"Asia/Aqtau",
154 @"Asia/Aqtobe",
155 @"Asia/Ashgabat",
156 @"Asia/Atyrau",
157 @"Asia/Baghdad",
158 @"Asia/Baku",
159 @"Asia/Bangkok",
160 @"Asia/Barnaul",
161 @"Asia/Beirut",
162 @"Asia/Bishkek",
163 @"Asia/Chita",
164 @"Asia/Colombo",
165 @"Asia/Damascus",
166 @"Asia/Dhaka",
167 @"Asia/Dili",
168 @"Asia/Dubai",
169 @"Asia/Dushanbe",
170 @"Asia/Famagusta",
171 @"Asia/Gaza",
172 @"Asia/Hebron",
173 @"Asia/Ho_Chi_Minh",
174 @"Asia/Hong_Kong",
175 @"Asia/Hovd",
176 @"Asia/Irkutsk",
177 @"Asia/Jakarta",
178 @"Asia/Jayapura",
179 @"Asia/Jerusalem",
180 @"Asia/Kabul",
181 @"Asia/Kamchatka",
182 @"Asia/Karachi",
183 @"Asia/Kathmandu",
184 @"Asia/Khandyga",
185 @"Asia/Kolkata",
186 @"Asia/Krasnoyarsk",
187 @"Asia/Kuching",
188 @"Asia/Macau",
189 @"Asia/Magadan",
190 @"Asia/Makassar",
191 @"Asia/Manila",
192 @"Asia/Nicosia",
193 @"Asia/Novokuznetsk",
194 @"Asia/Novosibirsk",
195 @"Asia/Omsk",
196 @"Asia/Oral",
197 @"Asia/Pontianak",
198 @"Asia/Pyongyang",
199 @"Asia/Qatar",
200 @"Asia/Qostanay",
201 @"Asia/Qyzylorda",
202 @"Asia/Riyadh",
203 @"Asia/Sakhalin",
204 @"Asia/Samarkand",
205 @"Asia/Seoul",
206 @"Asia/Shanghai",
207 @"Asia/Singapore",
208 @"Asia/Srednekolymsk",
209 @"Asia/Taipei",
210 @"Asia/Tashkent",
211 @"Asia/Tbilisi",
212 @"Asia/Tehran",
213 @"Asia/Thimphu",
214 @"Asia/Tokyo",
215 @"Asia/Tomsk",
216 @"Asia/Ulaanbaatar",
217 @"Asia/Urumqi",
218 @"Asia/Ust-Nera",
219 @"Asia/Vladivostok",
220 @"Asia/Yakutsk",
221 @"Asia/Yangon",
222 @"Asia/Yekaterinburg",
223 @"Asia/Yerevan",
224 @"Atlantic/Azores",
225 @"Atlantic/Bermuda",
226 @"Atlantic/Canary",
227 @"Atlantic/Cape_Verde",
228 @"Atlantic/Faroe",
229 @"Atlantic/Madeira",
230 @"Atlantic/South_Georgia",
231 @"Atlantic/Stanley",
232 @"Australia/Adelaide",
233 @"Australia/Brisbane",
234 @"Australia/Broken_Hill",
235 @"Australia/Darwin",
236 @"Australia/Eucla",
237 @"Australia/Hobart",
238 @"Australia/Lindeman",
239 @"Australia/Lord_Howe",
240 @"Australia/Melbourne",
241 @"Australia/Perth",
242 @"Australia/Sydney",
243 @"Etc/GMT",
244 @"Etc/GMT+1",
245 @"Etc/GMT+10",
246 @"Etc/GMT+11",
247 @"Etc/GMT+12",
248 @"Etc/GMT+2",
249 @"Etc/GMT+3",
250 @"Etc/GMT+4",
251 @"Etc/GMT+5",
252 @"Etc/GMT+6",
253 @"Etc/GMT+7",
254 @"Etc/GMT+8",
255 @"Etc/GMT+9",
256 @"Etc/GMT-10",
257 @"Etc/GMT-11",
258 @"Etc/GMT-12",
259 @"Etc/GMT-13",
260 @"Etc/GMT-14",
261 @"Etc/GMT-1",
262 @"Etc/GMT-2",
263 @"Etc/GMT-3",
264 @"Etc/GMT-4",
265 @"Etc/GMT-5",
266 @"Etc/GMT-6",
267 @"Etc/GMT-7",
268 @"Etc/GMT-8",
269 @"Etc/GMT-9",
270 @"Etc/UTC",
271 @"Europe/Andorra",
272 @"Europe/Astrakhan",
273 @"Europe/Athens",
274 @"Europe/Belgrade",
275 @"Europe/Berlin",
276 @"Europe/Brussels",
277 @"Europe/Bucharest",
278 @"Europe/Budapest",
279 @"Europe/Chisinau",
280 @"Europe/Dublin",
281 @"Europe/Gibraltar",
282 @"Europe/Helsinki",
283 @"Europe/Istanbul",
284 @"Europe/Kaliningrad",
285 @"Europe/Kirov",
286 @"Europe/Kyiv",
287 @"Europe/Lisbon",
288 @"Europe/London",
289 @"Europe/Madrid",
290 @"Europe/Malta",
291 @"Europe/Minsk",
292 @"Europe/Moscow",
293 @"Europe/Paris",
294 @"Europe/Prague",
295 @"Europe/Riga",
296 @"Europe/Rome",
297 @"Europe/Samara",
298 @"Europe/Saratov",
299 @"Europe/Simferopol",
300 @"Europe/Sofia",
301 @"Europe/Tallinn",
302 @"Europe/Tirane",
303 @"Europe/Ulyanovsk",
304 @"Europe/Vienna",
305 @"Europe/Vilnius",
306 @"Europe/Volgograd",
307 @"Europe/Warsaw",
308 @"Europe/Zurich",
309 @"Indian/Chagos",
310 @"Indian/Maldives",
311 @"Indian/Mauritius",
312 @"Pacific/Apia",
313 @"Pacific/Auckland",
314 @"Pacific/Bougainville",
315 @"Pacific/Chatham",
316 @"Pacific/Easter",
317 @"Pacific/Efate",
318 @"Pacific/Fakaofo",
319 @"Pacific/Fiji",
320 @"Pacific/Galapagos",
321 @"Pacific/Gambier",
322 @"Pacific/Guadalcanal",
323 @"Pacific/Guam",
324 @"Pacific/Honolulu",
325 @"Pacific/Kanton",
326 @"Pacific/Kiritimati",
327 @"Pacific/Kosrae",
328 @"Pacific/Kwajalein",
329 @"Pacific/Marquesas",
330 @"Pacific/Nauru",
331 @"Pacific/Niue",
332 @"Pacific/Norfolk",
333 @"Pacific/Noumea",
334 @"Pacific/Pago_Pago",
335 @"Pacific/Palau",
336 @"Pacific/Pitcairn",
337 @"Pacific/Port_Moresby",
338 @"Pacific/Rarotonga",
339 @"Pacific/Tahiti",
340 @"Pacific/Tarawa",
341 @"Pacific/Tongatapu",
342};