diff --git a/build.zig b/build.zig index 59f31decdaf29fabdb38094890f13d7578ed351a..20ddb2d62267a7c28b1cfce84bb2a95e9f2f5462 100644 --- a/build.zig +++ b/build.zig @@ -24,4 +24,27 @@ pub fn build(b: *std.Build) void { const t_step = b.step("test", "Run all library tests"); t_step.dependOn(&run_t.step); + + // + + const g = b.addExecutable(.{ + .name = "generate", + .root_module = b.addModule("root", .{ + .root_source_file = b.path("./generate.zig"), + .target = target, + .optimize = mode, + .link_libc = true, + }), + }); + deps.addAllTo(g); + g.use_llvm = !disable_llvm; + g.use_lld = !disable_llvm; + b.getInstallStep().dependOn(&g.step); + + const run_g = b.addRunArtifact(g); + run_g.setCwd(b.path(".")); + run_g.has_side_effects = true; + + const g_step = b.step("generate", ""); + g_step.dependOn(&run_g.step); } diff --git a/generate.zig b/generate.zig new file mode 100644 index 0000000000000000000000000000000000000000..17e2a62464b006dda7185c6e0cbd53db38c934fd --- /dev/null +++ b/generate.zig @@ -0,0 +1,95 @@ +// 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 '/' + +const std = @import("std"); +const nfs = @import("nfs"); +const nio = @import("nio"); +const extras = @import("extras"); + +const deps = @import("./deps.zig"); + +pub fn main() !void { + const sources = [_][:0]const u8{ + "africa", + "antarctica", + "asia", + "australasia", + "europe", + "northamerica", + "southamerica", + "etcetera", + "factory", + "backward", + }; + + const path = deps.dirs._xw6xua7fqgft; + const allocator = std.heap.c_allocator; + + var dir = try nfs.cwd().openDir(path, .{}); + defer dir.close(); + + var zones: std.ArrayList([]const u8) = .empty; + defer zones.deinit(allocator); + + for (&sources) |nm| { + var file = try dir.openFile(nm, .{}); + defer file.close(); + + const content = try file.mmap(); + defer nfs.munmap(content); + + var iter = std.mem.splitScalar(u8, content, '\n'); + while (iter.next()) |line| { + if (!std.mem.startsWith(u8, line, "Zone")) continue; + + var jter = std.mem.tokenizeAny(u8, line, " \t"); + _ = jter.next().?; + const name = jter.next().?; + if (std.mem.indexOfScalar(u8, name, '/') == null) continue; + try zones.append(allocator, try allocator.dupe(u8, name)); + } + } + + std.mem.sort([]const u8, zones.items, {}, extras.lessThanSlice([]const u8)); + + var out_file = try nfs.cwd().createFile("zone.zig", .{}); + defer out_file.close(); + var out_w: nio.BufferedWriter(4096, nfs.File) = .init(out_file); + + try out_w.writeAll("pub const Zone = enum {\n"); + for (zones.items) |z| { + try out_w.print(" {},\n", .{FormatId{ .bytes = z }}); + } + try out_w.writeAll("};\n"); + try out_w.flush(); +} + +const FormatId = struct { + bytes: []const u8, + + /// Print the string as a Zig identifier, escaping it with `@""` syntax if needed. + pub fn nprint(ctx: FormatId, writer: anytype) !void { + const bytes = ctx.bytes; + if (std.zig.isValidId(bytes) and (!std.zig.isPrimitive(bytes)) and (!std.zig.isUnderscore(bytes))) { + return writer.writeAll(bytes); + } + try writer.writeAll("@\""); + try stringEscape(bytes, writer); + try writer.writeAll("\""); + } + + fn stringEscape(bytes: []const u8, w: anytype) !void { + for (bytes) |byte| switch (byte) { + '\n' => try w.writeAll("\\n"), + '\r' => try w.writeAll("\\r"), + '\t' => try w.writeAll("\\t"), + '\\' => try w.writeAll("\\\\"), + '"' => try w.writeAll("\\\""), + '\'' => try w.writeAll("'"), + ' ', '!', '#'...'&', '('...'[', ']'...'~' => try w.writeAll(&.{byte}), + else => { + try w.writeAll("\\x"); + try w.print("{x:2>0}", .{byte}); + }, + }; + } +}; diff --git a/licenses.txt b/licenses.txt index ac2520b7b5a6db9f2772a7fad2e456205cc736e9..39bdf77e7dc05a6f2f36a0aecdda2d7612bec956 100644 --- a/licenses.txt +++ b/licenses.txt @@ -6,6 +6,11 @@ MIT: - git https://github.com/nektro/zig-sys-darwin - git https://github.com/nektro/zig-sys-linux +CC0-1.0: += https://spdx.org/licenses/CC0-1.0 +- git https://github.com/eggert/tz + MPL-2.0: = https://spdx.org/licenses/MPL-2.0 +- git https://github.com/nektro/zig-nfs - git https://github.com/nektro/zig-nio diff --git a/time.zig b/time.zig index a686ec99c03edf26b653b9778eda067839fbc1d2..cf5ccac36b3d54333742abcd9e07556b39b3ad63 100644 --- a/time.zig +++ b/time.zig @@ -11,6 +11,8 @@ const sys = switch (builtin.target.os.tag) { else => unreachable, // TODO: }; +pub const Zone = @import("./zone.zig").Zone; + pub const DateTime = struct { ms: u16, seconds: u8, diff --git a/zig.mod b/zig.mod index 46461cf44afcd66830ab8e5193f4ddc6e64b83a7..3692ea1910d5969a76c40ab32ed8c2a773d621c0 100644 --- a/zig.mod +++ b/zig.mod @@ -10,3 +10,11 @@ dependencies: - src: git https://github.com/nektro/zig-nio root_dependencies: - src: git https://github.com/nektro/zig-expect + - src: git https://github.com/nektro/zig-nfs + - src: git https://github.com/nektro/zig-nio + - src: git https://github.com/nektro/zig-extras + + - src: git https://github.com/eggert/tz + id: xw6xua7fqgft9ezk64mdj4nirj4hlz6s84vy2n5gu9ihrwuu + license: CC0-1.0 + keep: true diff --git a/zone.zig b/zone.zig new file mode 100644 index 0000000000000000000000000000000000000000..1b227e1cc90732389c2847bc2e375a349902efad --- /dev/null +++ b/zone.zig @@ -0,0 +1,342 @@ +pub const Zone = enum { + @"Africa/Abidjan", + @"Africa/Algiers", + @"Africa/Bissau", + @"Africa/Cairo", + @"Africa/Casablanca", + @"Africa/Ceuta", + @"Africa/El_Aaiun", + @"Africa/Johannesburg", + @"Africa/Juba", + @"Africa/Khartoum", + @"Africa/Lagos", + @"Africa/Maputo", + @"Africa/Monrovia", + @"Africa/Nairobi", + @"Africa/Ndjamena", + @"Africa/Sao_Tome", + @"Africa/Tripoli", + @"Africa/Tunis", + @"Africa/Windhoek", + @"America/Adak", + @"America/Anchorage", + @"America/Araguaina", + @"America/Argentina/Buenos_Aires", + @"America/Argentina/Catamarca", + @"America/Argentina/Cordoba", + @"America/Argentina/Jujuy", + @"America/Argentina/La_Rioja", + @"America/Argentina/Mendoza", + @"America/Argentina/Rio_Gallegos", + @"America/Argentina/Salta", + @"America/Argentina/San_Juan", + @"America/Argentina/San_Luis", + @"America/Argentina/Tucuman", + @"America/Argentina/Ushuaia", + @"America/Asuncion", + @"America/Bahia_Banderas", + @"America/Bahia", + @"America/Barbados", + @"America/Belem", + @"America/Belize", + @"America/Boa_Vista", + @"America/Bogota", + @"America/Boise", + @"America/Cambridge_Bay", + @"America/Campo_Grande", + @"America/Cancun", + @"America/Caracas", + @"America/Cayenne", + @"America/Chicago", + @"America/Chihuahua", + @"America/Ciudad_Juarez", + @"America/Costa_Rica", + @"America/Coyhaique", + @"America/Cuiaba", + @"America/Danmarkshavn", + @"America/Dawson_Creek", + @"America/Dawson", + @"America/Denver", + @"America/Detroit", + @"America/Edmonton", + @"America/Eirunepe", + @"America/El_Salvador", + @"America/Fort_Nelson", + @"America/Fortaleza", + @"America/Glace_Bay", + @"America/Goose_Bay", + @"America/Grand_Turk", + @"America/Guatemala", + @"America/Guayaquil", + @"America/Guyana", + @"America/Halifax", + @"America/Havana", + @"America/Hermosillo", + @"America/Indiana/Indianapolis", + @"America/Indiana/Knox", + @"America/Indiana/Marengo", + @"America/Indiana/Petersburg", + @"America/Indiana/Tell_City", + @"America/Indiana/Vevay", + @"America/Indiana/Vincennes", + @"America/Indiana/Winamac", + @"America/Inuvik", + @"America/Iqaluit", + @"America/Jamaica", + @"America/Juneau", + @"America/Kentucky/Louisville", + @"America/Kentucky/Monticello", + @"America/La_Paz", + @"America/Lima", + @"America/Los_Angeles", + @"America/Maceio", + @"America/Managua", + @"America/Manaus", + @"America/Martinique", + @"America/Matamoros", + @"America/Mazatlan", + @"America/Menominee", + @"America/Merida", + @"America/Metlakatla", + @"America/Mexico_City", + @"America/Miquelon", + @"America/Moncton", + @"America/Monterrey", + @"America/Montevideo", + @"America/New_York", + @"America/Nome", + @"America/Noronha", + @"America/North_Dakota/Beulah", + @"America/North_Dakota/Center", + @"America/North_Dakota/New_Salem", + @"America/Nuuk", + @"America/Ojinaga", + @"America/Panama", + @"America/Paramaribo", + @"America/Phoenix", + @"America/Port-au-Prince", + @"America/Porto_Velho", + @"America/Puerto_Rico", + @"America/Punta_Arenas", + @"America/Rankin_Inlet", + @"America/Recife", + @"America/Regina", + @"America/Resolute", + @"America/Rio_Branco", + @"America/Santarem", + @"America/Santiago", + @"America/Santo_Domingo", + @"America/Sao_Paulo", + @"America/Scoresbysund", + @"America/Sitka", + @"America/St_Johns", + @"America/Swift_Current", + @"America/Tegucigalpa", + @"America/Thule", + @"America/Tijuana", + @"America/Toronto", + @"America/Vancouver", + @"America/Whitehorse", + @"America/Winnipeg", + @"America/Yakutat", + @"Antarctica/Casey", + @"Antarctica/Davis", + @"Antarctica/Macquarie", + @"Antarctica/Mawson", + @"Antarctica/Palmer", + @"Antarctica/Rothera", + @"Antarctica/Troll", + @"Antarctica/Vostok", + @"Asia/Almaty", + @"Asia/Amman", + @"Asia/Anadyr", + @"Asia/Aqtau", + @"Asia/Aqtobe", + @"Asia/Ashgabat", + @"Asia/Atyrau", + @"Asia/Baghdad", + @"Asia/Baku", + @"Asia/Bangkok", + @"Asia/Barnaul", + @"Asia/Beirut", + @"Asia/Bishkek", + @"Asia/Chita", + @"Asia/Colombo", + @"Asia/Damascus", + @"Asia/Dhaka", + @"Asia/Dili", + @"Asia/Dubai", + @"Asia/Dushanbe", + @"Asia/Famagusta", + @"Asia/Gaza", + @"Asia/Hebron", + @"Asia/Ho_Chi_Minh", + @"Asia/Hong_Kong", + @"Asia/Hovd", + @"Asia/Irkutsk", + @"Asia/Jakarta", + @"Asia/Jayapura", + @"Asia/Jerusalem", + @"Asia/Kabul", + @"Asia/Kamchatka", + @"Asia/Karachi", + @"Asia/Kathmandu", + @"Asia/Khandyga", + @"Asia/Kolkata", + @"Asia/Krasnoyarsk", + @"Asia/Kuching", + @"Asia/Macau", + @"Asia/Magadan", + @"Asia/Makassar", + @"Asia/Manila", + @"Asia/Nicosia", + @"Asia/Novokuznetsk", + @"Asia/Novosibirsk", + @"Asia/Omsk", + @"Asia/Oral", + @"Asia/Pontianak", + @"Asia/Pyongyang", + @"Asia/Qatar", + @"Asia/Qostanay", + @"Asia/Qyzylorda", + @"Asia/Riyadh", + @"Asia/Sakhalin", + @"Asia/Samarkand", + @"Asia/Seoul", + @"Asia/Shanghai", + @"Asia/Singapore", + @"Asia/Srednekolymsk", + @"Asia/Taipei", + @"Asia/Tashkent", + @"Asia/Tbilisi", + @"Asia/Tehran", + @"Asia/Thimphu", + @"Asia/Tokyo", + @"Asia/Tomsk", + @"Asia/Ulaanbaatar", + @"Asia/Urumqi", + @"Asia/Ust-Nera", + @"Asia/Vladivostok", + @"Asia/Yakutsk", + @"Asia/Yangon", + @"Asia/Yekaterinburg", + @"Asia/Yerevan", + @"Atlantic/Azores", + @"Atlantic/Bermuda", + @"Atlantic/Canary", + @"Atlantic/Cape_Verde", + @"Atlantic/Faroe", + @"Atlantic/Madeira", + @"Atlantic/South_Georgia", + @"Atlantic/Stanley", + @"Australia/Adelaide", + @"Australia/Brisbane", + @"Australia/Broken_Hill", + @"Australia/Darwin", + @"Australia/Eucla", + @"Australia/Hobart", + @"Australia/Lindeman", + @"Australia/Lord_Howe", + @"Australia/Melbourne", + @"Australia/Perth", + @"Australia/Sydney", + @"Etc/GMT", + @"Etc/GMT+1", + @"Etc/GMT+10", + @"Etc/GMT+11", + @"Etc/GMT+12", + @"Etc/GMT+2", + @"Etc/GMT+3", + @"Etc/GMT+4", + @"Etc/GMT+5", + @"Etc/GMT+6", + @"Etc/GMT+7", + @"Etc/GMT+8", + @"Etc/GMT+9", + @"Etc/GMT-10", + @"Etc/GMT-11", + @"Etc/GMT-12", + @"Etc/GMT-13", + @"Etc/GMT-14", + @"Etc/GMT-1", + @"Etc/GMT-2", + @"Etc/GMT-3", + @"Etc/GMT-4", + @"Etc/GMT-5", + @"Etc/GMT-6", + @"Etc/GMT-7", + @"Etc/GMT-8", + @"Etc/GMT-9", + @"Etc/UTC", + @"Europe/Andorra", + @"Europe/Astrakhan", + @"Europe/Athens", + @"Europe/Belgrade", + @"Europe/Berlin", + @"Europe/Brussels", + @"Europe/Bucharest", + @"Europe/Budapest", + @"Europe/Chisinau", + @"Europe/Dublin", + @"Europe/Gibraltar", + @"Europe/Helsinki", + @"Europe/Istanbul", + @"Europe/Kaliningrad", + @"Europe/Kirov", + @"Europe/Kyiv", + @"Europe/Lisbon", + @"Europe/London", + @"Europe/Madrid", + @"Europe/Malta", + @"Europe/Minsk", + @"Europe/Moscow", + @"Europe/Paris", + @"Europe/Prague", + @"Europe/Riga", + @"Europe/Rome", + @"Europe/Samara", + @"Europe/Saratov", + @"Europe/Simferopol", + @"Europe/Sofia", + @"Europe/Tallinn", + @"Europe/Tirane", + @"Europe/Ulyanovsk", + @"Europe/Vienna", + @"Europe/Vilnius", + @"Europe/Volgograd", + @"Europe/Warsaw", + @"Europe/Zurich", + @"Indian/Chagos", + @"Indian/Maldives", + @"Indian/Mauritius", + @"Pacific/Apia", + @"Pacific/Auckland", + @"Pacific/Bougainville", + @"Pacific/Chatham", + @"Pacific/Easter", + @"Pacific/Efate", + @"Pacific/Fakaofo", + @"Pacific/Fiji", + @"Pacific/Galapagos", + @"Pacific/Gambier", + @"Pacific/Guadalcanal", + @"Pacific/Guam", + @"Pacific/Honolulu", + @"Pacific/Kanton", + @"Pacific/Kiritimati", + @"Pacific/Kosrae", + @"Pacific/Kwajalein", + @"Pacific/Marquesas", + @"Pacific/Nauru", + @"Pacific/Niue", + @"Pacific/Norfolk", + @"Pacific/Noumea", + @"Pacific/Pago_Pago", + @"Pacific/Palau", + @"Pacific/Pitcairn", + @"Pacific/Port_Moresby", + @"Pacific/Rarotonga", + @"Pacific/Tahiti", + @"Pacific/Tarawa", + @"Pacific/Tongatapu", +};