forked from ikskuh/SDL.zig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgen_sdl.sh
executable file
·121 lines (93 loc) · 3.08 KB
/
gen_sdl.sh
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
# The input file name to the SDL2 main header
INFILE="/home/felix/projects/SDL/include/SDL.h"
# The output file name of this script.
# this should not be changed
OUTFILE="src/binding/sdl.zig"
setopt -e
clear
zig translate-c \
-target x86_64-linux-gnu \
-I stubs \
-D SDL_DISABLE_MMINTRIN_H=0 \
-D SDL_DISABLE_XMMINTRIN_H=0 \
-D SDL_DISABLE_EMMINTRIN_H=0 \
-D SDL_DISABLE_PMMINTRIN_H=0 \
-D SDL_DISABLE_IMMINTRIN_H=0 \
-D SDL_DISABLE_MM3DNOW_H=0 \
"${INFILE}" > "${OUTFILE}"
function patch_file()
{
sed -i "$@" "${OUTFILE}"
}
# Remove comptime assertions
patch_file '/SDL_compile_time_assert_/d'
# Delete all C _t types, but not SDL _t types
patch_file '/SDL_/b;/_t = /d'
# Remove all reserved definitions (prefixed with _)
patch_file '/pub const _/d'
# Remove min/max/print elements
patch_file '/pub const SDL_MAX_/d'
patch_file '/pub const SDL_MIN/d'
patch_file '/pub const SDL_PRI/d'
# Replace SDL types with native zig ones
patch_file 's/\bSint8\b/i8/g'
patch_file 's/\bUint8\b/u8/g'
patch_file 's/\bSint16\b/i16/g'
patch_file 's/\bUint16\b/u16/g'
patch_file 's/\bSint32\b/i32/g'
patch_file 's/\bUint32\b/u32/g'
patch_file 's/\bSint64\b/i64/g'
patch_file 's/\bUint64\b/u64/g'
# Remove identity definitions
patch_file -r '/pub const [ui](8|16|32|64) =/d'
# Remove use of varargs stuff
# sed -i '/struct___va_list_tag =/,+5d' sdl.zig
# sed -i '/struct___va_list_tag/d' sdl.zig
patch_file '/va_list =/d'
patch_file '/va_list =/d'
# Remove all lines with @compileError
patch_file '/@compileError/d'
# Remove some stuff from list
for pattern in \
"pub const unix " \
"pub const linux " \
"pub const NULL ="; \
do
patch_file "/${pattern}/d"
done
# Remove these HAVE definitions
patch_file "/pub const HAVE_/d"
# Remove some min/max translations
patch_file -r '/SDL_/b;/pub const .*(_MAX) =/d'
patch_file -r '/SDL_/b;/pub const .*(_MIN) =/d'
# Remove all generated comments
patch_file 's|//.*||'
# Delete original wchar_t definition
patch_file '/wchar_t = /d'
# and replace it with our own semi-correct wchar_t definition
echo "const wchar_t = if(@import(\"builtin\").os.tag == .windows) u16 else u32; $(cat ${OUTFILE})" > "${OUTFILE}"
# Delete all lines that declare C attributes
patch_file '/ = __attribute__/d'
patch_file '/SDL_INLINE/d'
patch_file '/alloca = /d'
patch_file '/SDL_FUNCTION = /d'
patch_file '/SDL_FILE = /d'
patch_file '/SDL_LINE = /d'
patch_file '/SDL_COMPILEDVERSION = /d'
patch_file '/SDL_BYTEORDER = /d'
patch_file '/fn SDL_OutOfMemory/,+2d'
patch_file '/fn SDL_Unsupported/,+2d'
patch_file '/fn SDL_InvalidParamError/,+2d'
patch_file '/fn SDL_TriggerBreakpoint/,+2d'
patch_file -r 's/usize - ([0-9]+)/@bitCast(usize, @as(isize, -\1))/g'
patch_file -r 's/u(8|16|32|64) - ([0-9]+)/@bitCast(u\1, @as(i\1, -\2))/g'
patch_file -r 's/i(8|16|32|64) - ([0-9]+)/@as(i\1, -\2)/g'
# Verify we didn't fuck up
zig fmt "${OUTFILE}"
patch_file '/usingnamespace/d'
echo "test \"all decls\" { @import(\"std\").testing.refAllDecls(@import(\"${OUTFILE}\")); }" > test.zig
zig test test.zig 2>&1 | sed '/note: /,+2d'
rm test.zig
# Print out generated LOC
wc -l "${OUTFILE}"