|
| 1 | +const std = @import("std"); |
| 2 | +const Io = std.Io; |
| 3 | + |
| 4 | +pub fn main(init: std.process.Init) !void { |
| 5 | + const alloc = init.arena.allocator(); |
| 6 | + const io = init.io; |
| 7 | + |
| 8 | + var args = std.process.Args.Iterator.init(init.minimal.args); |
| 9 | + _ = args.skip(); |
| 10 | + const input_path = args.next() orelse return error.MissingArgument; |
| 11 | + |
| 12 | + const data = try Io.Dir.readFileAlloc(.cwd(), io, input_path, alloc, .unlimited); |
| 13 | + |
| 14 | + var intel_mods: std.ArrayList([]const u8) = .empty; |
| 15 | + var other_mods: std.ArrayList(struct { []const u8, []const u8 }) = .empty; |
| 16 | + var vendors: std.ArrayList([]const u8) = .empty; |
| 17 | + |
| 18 | + var lines = std.mem.splitScalar(u8, data, '\n'); |
| 19 | + while (lines.next()) |line| { |
| 20 | + if (parseAfter(line, "#define I915_FORMAT_MOD_")) |name| { |
| 21 | + try intel_mods.append(alloc, name); |
| 22 | + } else if (parseVendorMod(line)) |vm| { |
| 23 | + try other_mods.append(alloc, vm); |
| 24 | + } else if (parseAfter(line, "#define DRM_FORMAT_MOD_VENDOR_")) |name| { |
| 25 | + try vendors.append(alloc, name); |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + var buf: [4096]u8 = undefined; |
| 30 | + var fw = Io.File.stdout().writerStreaming(io, &buf); |
| 31 | + const w = &fw.interface; |
| 32 | + |
| 33 | + try w.writeAll( |
| 34 | + \\/* AUTOMATICALLY GENERATED by gen_table_fourcc.zig */ |
| 35 | + \\static const struct drmFormatModifierInfo drm_format_modifier_table[] = { |
| 36 | + \\ { DRM_MODIFIER_INVALID(NONE, INVALID) }, |
| 37 | + \\ { DRM_MODIFIER_LINEAR(NONE, LINEAR) }, |
| 38 | + \\ |
| 39 | + ); |
| 40 | + |
| 41 | + for (intel_mods.items) |mod| |
| 42 | + try w.print(" {{ DRM_MODIFIER_INTEL({s}, {s}) }},\n", .{ mod, mod }); |
| 43 | + |
| 44 | + for (other_mods.items) |entry| { |
| 45 | + const vendor, const mod = entry; |
| 46 | + try w.print(" {{ DRM_MODIFIER({s}, {s}, {s}) }},\n", .{ vendor, mod, mod }); |
| 47 | + } |
| 48 | + |
| 49 | + try w.writeAll( |
| 50 | + \\}; |
| 51 | + \\static const struct drmFormatModifierVendorInfo drm_format_modifier_vendor_table[] = { |
| 52 | + \\ |
| 53 | + ); |
| 54 | + |
| 55 | + for (vendors.items) |v| |
| 56 | + try w.print(" {{ DRM_FORMAT_MOD_VENDOR_{s}, \"{s}\" }},\n", .{ v, v }); |
| 57 | + |
| 58 | + try w.writeAll("};\n"); |
| 59 | + try fw.flush(); |
| 60 | +} |
| 61 | + |
| 62 | +fn parseAfter(line: []const u8, prefix: []const u8) ?[]const u8 { |
| 63 | + const trimmed = std.mem.trimStart(u8, line, " \t"); |
| 64 | + if (!std.mem.startsWith(u8, trimmed, prefix)) return null; |
| 65 | + const after = trimmed[prefix.len..]; |
| 66 | + const end = std.mem.indexOfAny(u8, after, " \t\r\n") orelse return null; |
| 67 | + if (end == 0) return null; |
| 68 | + const name = after[0..end]; |
| 69 | + if (std.mem.indexOfScalar(u8, name, '(') != null) return null; |
| 70 | + return name; |
| 71 | +} |
| 72 | + |
| 73 | +fn parseVendorMod(line: []const u8) ?struct { []const u8, []const u8 } { |
| 74 | + const prefix = "#define DRM_FORMAT_MOD_"; |
| 75 | + const trimmed = std.mem.trimStart(u8, line, " \t"); |
| 76 | + if (!std.mem.startsWith(u8, trimmed, prefix)) return null; |
| 77 | + const after = trimmed[prefix.len..]; |
| 78 | + |
| 79 | + for ([_][]const u8{ "ARM", "SAMSUNG", "QCOM", "VIVANTE", "NVIDIA", "BROADCOM", "ALLWINNER" }) |vendor| { |
| 80 | + if (std.mem.startsWith(u8, after, vendor) and after.len > vendor.len and after[vendor.len] == '_') { |
| 81 | + const mod_start = vendor.len + 1; |
| 82 | + // Require trailing whitespace (like the Python regex `\s` at end) |
| 83 | + const end = std.mem.indexOfAny(u8, after[mod_start..], " \t\r\n") orelse continue; |
| 84 | + if (end == 0) continue; |
| 85 | + const mod = after[mod_start..][0..end]; |
| 86 | + if (std.mem.indexOfScalar(u8, mod, '(') != null) continue; |
| 87 | + if (std.mem.eql(u8, vendor, "ARM") and |
| 88 | + (std.mem.eql(u8, mod, "TYPE_AFBC") or |
| 89 | + std.mem.eql(u8, mod, "TYPE_MISC") or |
| 90 | + std.mem.eql(u8, mod, "TYPE_AFRC"))) continue; |
| 91 | + return .{ vendor, mod }; |
| 92 | + } |
| 93 | + } |
| 94 | + return null; |
| 95 | +} |
0 commit comments