ohmu
·
2026-10-15
1#pragma once
2
3#include "fastfetch.h"
4
5#if FF_HAVE_LUA
6 #if !FF_DISABLE_DLOPEN
7 // Hack. LUA_API is defined as extern which prevents us from implementing the functions ourselves.
8 #include <luaconf.h>
9 #undef LUA_API
10 #undef LUALIB_API
11 #undef LUAMOD_API
12 #define LUA_API static inline
13 #define LUALIB_API LUA_API
14 #define LUAMOD_API LUA_API
15
16 // Note: `#pragma GCC diagnostic push` is intentionally omitted here.
17 #pragma GCC diagnostic ignored "-Wunused-function"
18 #endif
19
20 #include <lua.h>
21 #include <lauxlib.h>
22 #include <lualib.h>
23
24 #ifndef LUA_GNAME
25 #define LUA_GNAME "_G"
26 #endif
27
28 #include "common/library.h"
29
30extern struct FFLuaData {
31 #if !FF_DISABLE_DLOPEN
32 FF_LIBRARY_SYMBOL(luaL_checkany)
33 FF_LIBRARY_SYMBOL(luaL_loadbufferx)
34 FF_LIBRARY_SYMBOL(luaL_tolstring)
35 FF_LIBRARY_SYMBOL(lua_callk)
36 FF_LIBRARY_SYMBOL(lua_createtable)
37 FF_LIBRARY_SYMBOL(lua_error)
38 FF_LIBRARY_SYMBOL(lua_gettop)
39 FF_LIBRARY_SYMBOL(lua_isinteger)
40 FF_LIBRARY_SYMBOL(lua_next)
41 FF_LIBRARY_SYMBOL(lua_pcallk)
42 FF_LIBRARY_SYMBOL(lua_pushboolean)
43 FF_LIBRARY_SYMBOL(lua_pushcclosure)
44 FF_LIBRARY_SYMBOL(lua_pushinteger)
45 FF_LIBRARY_SYMBOL(lua_pushlstring)
46 FF_LIBRARY_SYMBOL(lua_pushnil)
47 FF_LIBRARY_SYMBOL(lua_pushnumber)
48 FF_LIBRARY_SYMBOL(lua_pushvalue)
49 FF_LIBRARY_SYMBOL(lua_rawgeti)
50 FF_LIBRARY_SYMBOL(lua_rawlen)
51 FF_LIBRARY_SYMBOL(lua_setfield)
52 FF_LIBRARY_SYMBOL(lua_setglobal)
53 FF_LIBRARY_SYMBOL(lua_seti)
54 FF_LIBRARY_SYMBOL(lua_settop)
55 FF_LIBRARY_SYMBOL(lua_toboolean)
56 FF_LIBRARY_SYMBOL(lua_tointegerx)
57 FF_LIBRARY_SYMBOL(lua_tolstring)
58 FF_LIBRARY_SYMBOL(lua_tonumberx)
59 FF_LIBRARY_SYMBOL(lua_type)
60 #endif
61
62 lua_State* L;
63 bool inited;
64} luaData;
65
66 #if !FF_DISABLE_DLOPEN
67[[gnu::always_inline]] void(lua_settop)(lua_State* L, int idx) {
68 return luaData.fflua_settop(L, idx);
69}
70
71[[gnu::always_inline]] int(luaL_loadbufferx)(lua_State* L, const char* buff, size_t sz, const char* name, const char* mode) {
72 return luaData.ffluaL_loadbufferx(L, buff, sz, name, mode);
73}
74
75[[gnu::always_inline]] const char*(lua_tolstring) (lua_State * L, int idx, size_t* len) {
76 return luaData.fflua_tolstring(L, idx, len);
77}
78
79[[gnu::always_inline]] void(lua_createtable)(lua_State* L, int narr, int nrec) {
80 return luaData.fflua_createtable(L, narr, nrec);
81}
82
83[[gnu::always_inline]] void(lua_pushinteger)(lua_State* L, lua_Integer n) {
84 return luaData.fflua_pushinteger(L, n);
85}
86
87[[gnu::always_inline]] void(lua_pushnumber)(lua_State* L, lua_Number n) {
88 return luaData.fflua_pushnumber(L, n);
89}
90
91[[gnu::always_inline]] void(lua_pushboolean)(lua_State* L, int b) {
92 return luaData.fflua_pushboolean(L, b);
93}
94
95[[gnu::always_inline]] const char*(lua_pushlstring) (lua_State * L, const char* s, size_t len) {
96 return luaData.fflua_pushlstring(L, s, len);
97}
98
99[[gnu::always_inline]] void(lua_pushvalue)(lua_State* L, int idx) {
100 return luaData.fflua_pushvalue(L, idx);
101}
102
103[[gnu::always_inline]] void(lua_seti)(lua_State* L, int idx, lua_Integer n) {
104 return luaData.fflua_seti(L, idx, n);
105}
106
107[[gnu::always_inline]] void(lua_pushnil)(lua_State* L) {
108 return luaData.fflua_pushnil(L);
109}
110
111[[gnu::always_inline]] void(lua_setfield)(lua_State* L, int idx, const char* k) {
112 return luaData.fflua_setfield(L, idx, k);
113}
114
115[[gnu::always_inline]] int(lua_pcallk)(lua_State* L, int nargs, int nresults, int errfunc, lua_KContext ctx, lua_KFunction k) {
116 return luaData.fflua_pcallk(L, nargs, nresults, errfunc, ctx, k);
117}
118
119[[gnu::always_inline]] int(lua_gettop)(lua_State* L) {
120 return luaData.fflua_gettop(L);
121}
122
123[[gnu::always_inline]] const char*(luaL_tolstring) (lua_State * L, int idx, size_t* len) {
124 return luaData.ffluaL_tolstring(L, idx, len);
125}
126
127[[gnu::always_inline]] int(lua_error)(lua_State* L) {
128 return luaData.fflua_error(L);
129}
130
131[[gnu::always_inline]] void(lua_pushcclosure)(lua_State* L, lua_CFunction fn, int n) {
132 return luaData.fflua_pushcclosure(L, fn, n);
133}
134
135[[gnu::always_inline]] void(luaL_checkany)(lua_State* L, int idx) {
136 return luaData.ffluaL_checkany(L, idx);
137}
138
139[[gnu::always_inline]] void(lua_callk)(lua_State* L, int nargs, int nresults, lua_KContext ctx, lua_KFunction k) {
140 return luaData.fflua_callk(L, nargs, nresults, ctx, k);
141}
142
143[[gnu::always_inline]] int(lua_isinteger)(lua_State* L, int idx) {
144 return luaData.fflua_isinteger(L, idx);
145}
146
147[[gnu::always_inline]] int(lua_next)(lua_State* L, int idx) {
148 return luaData.fflua_next(L, idx);
149}
150
151[[gnu::always_inline]] int(lua_rawgeti)(lua_State* L, int idx, lua_Integer n) {
152 return luaData.fflua_rawgeti(L, idx, n);
153}
154
155[[gnu::always_inline]]
156 #if LUA_VERSION_NUM > 503
157lua_Unsigned
158 #else
159size_t
160 #endif
161 (lua_rawlen)(lua_State* L, int idx) {
162 return luaData.fflua_rawlen(L, idx);
163}
164
165[[gnu::always_inline]] void(lua_setglobal)(lua_State* L, const char* name) {
166 return luaData.fflua_setglobal(L, name);
167}
168
169[[gnu::always_inline]] int(lua_toboolean)(lua_State* L, int idx) {
170 return luaData.fflua_toboolean(L, idx);
171}
172
173[[gnu::always_inline]] lua_Integer(lua_tointegerx)(lua_State* L, int idx, int* isnum) {
174 return luaData.fflua_tointegerx(L, idx, isnum);
175}
176
177[[gnu::always_inline]] lua_Number(lua_tonumberx)(lua_State* L, int idx, int* isnum) {
178 return luaData.fflua_tonumberx(L, idx, isnum);
179}
180
181[[gnu::always_inline]] int(lua_type)(lua_State* L, int idx) {
182 return luaData.fflua_type(L, idx);
183}
184 #endif
185
186const char* ffLuaLoadState(void);
187
188#endif