aboutsummaryrefslogtreecommitdiff
path: root/misctools/headers-cleaner.zig
blob: a8261ae4f446e1d27b5219e42ac0e05a8a36207f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const std = @import("std");

pub fn main() anyerror!void {
        const headers_zig_file_src: std.builtin.SourceLocation = @src();
        var paths = [_][]const u8{std.mem.span(headers_zig_file_src.file), "../../src/javascript/jsc/bindings/headers.zig"};
        const headers_zig_file =  try std.fs.path.resolve(std.heap.c_allocator, &paths);
        std.debug.print("Writing to {s}", .{headers_zig_file});
        var headers_zig: std.fs.File = try std.fs.openFileAbsolute(headers_zig_file, .{ .write = true });
        var contents = try headers_zig.readToEndAlloc(std.heap.page_allocator, headers_zig.getEndPos() catch unreachable);
        const last_extern_i = std.mem.lastIndexOf(u8, contents, "pub extern fn") orelse @panic("Expected contents");
        const last_newline = std.mem.indexOf(u8, contents[last_extern_i..], "\n") orelse @panic("Expected newline");
        const to_splice = "usingnamespace @import(\"./headers-replacements.zig\");\n";
        var new_contents = try std.heap.page_allocator.alloc(u8, contents.len + to_splice.len);
        std.mem.copy(u8, new_contents, to_splice);
        std.mem.copy(u8, new_contents[to_splice.len..], contents);
        var i: usize = to_splice.len;
        var remainder = new_contents[i..];
        while (remainder.len > 0) {
            i = std.mem.indexOf(u8, remainder, "\npub const struct_b") orelse break + "\npub const struct_b".len;
            var begin = remainder[i..];
            const end_line = std.mem.indexOf(u8, begin, "extern struct {") orelse break;
            const end_struct = std.mem.indexOf(u8, begin, "\n};\n") orelse break + "\n};\n".len;

            std.mem.set(u8, begin[1 .. end_struct + 3], ' ');
            remainder = begin[end_struct..];
        }
        i = to_splice.len;
        remainder = new_contents[i..];
        while (remainder.len > 0) {
            i = std.mem.indexOf(u8, remainder, "\npub const struct_") orelse break + "\npub const struct_".len;
            var begin = remainder[i..];
            var end_struct = std.mem.indexOf(u8, begin, "opaque {};") orelse break;
            end_struct += std.mem.indexOf(u8, begin[end_struct..], "\n") orelse break;
            i = 0;

            std.mem.set(u8, begin[1..end_struct], ' ');
            remainder = begin[end_struct..];
        }

        const HARDCODE = [_][]const u8{
            "[*c][*c]JSC__Exception",
            "*?*JSC__Exception     ",
            "[*c]?*c_void",
            "[*c]*c_void",
        };
        i = 0;
        while (i < HARDCODE.len) : (i += 2) {
            _ = std.mem.replace(u8, new_contents, HARDCODE[i], HARDCODE[i + 1], new_contents);
        }

        const js_value_start = std.mem.indexOf(u8, new_contents, "pub const JSC__JSValue") orelse unreachable;
        const js_value_end = std.mem.indexOf(u8, new_contents[js_value_start..], "\n") orelse unreachable;
        std.mem.set(u8, new_contents[js_value_start..][0..js_value_end], ' ');

        try headers_zig.seekTo(0);
        try headers_zig.writeAll(new_contents);
        try headers_zig.setEndPos(last_newline + last_extern_i + to_splice.len);
}