#!/usr/bin/env python3 import toml typesIn = { "__unknown": "lua_touserdata", "char": "luaL_checkinteger", "int": "luaL_checkinteger", "long long": "luaL_checkinteger", "char *": "(char *)luaL_checkstring" } typesOut = { "__unknown": "lua_pushlightuserdata", "char": "lua_pushinteger", "int": "lua_pushinteger", "long long": "lua_pushinteger", "char *": "lua_pushstring" } functionBlacklist = [ "engine_malloc" ] statics = toml.loads(open("modules/engine/STATICS.toml").read()) functions = toml.loads(open("modules/engine/FUNCTIONS.toml").read()) ofile = open("modules/engine/lua.c","w") ofile.write('''\ #include #include #include lua_State * engine_lua_state; #include "lua_manual.c" ''') for func in functions: if func in functionBlacklist: continue invarCount = 1 funcnew = "engine_luaf_" +func.replace("engine_","",1) ofile.write('int ' +funcnew+ '(lua_State *L) {\n') for arg in functions[func]["arguments"]: if not arg in typesIn: checkfunc = typesIn["__unknown"] else: checkfunc = typesIn[arg] ofile.write("\t" +arg+ ' ' +functions[func]["argNames"][invarCount - 1]+ ' = ' +checkfunc+ '(L,' +str(invarCount)+ ');\n') invarCount += 1 argstring = "(" +",".join(functions[func]["argNames"])+ ")" outtype = functions[func]["type"] if outtype == "void": ofile.write('\t' + func + argstring + ";") ofile.write('\n\treturn 0;') else: if not outtype in typesOut: pushfunc = typesOut["__unknown"] else: pushfunc = typesOut[arg] ofile.write('\t' +outtype+ ' outvar = ' +func + argstring + ";") ofile.write("\n\t" +pushfunc+ '(L,outvar);') ofile.write('\n\treturn 1;') ofile.write('\n}\n\n') ofile.write('''\ void engine_lua_init() { engine_lua_state = luaL_newstate(); luaL_openlibs(engine_lua_state); ''') for static in statics: ofile.write('\tlua_pushinteger(engine_lua_state,' +static+ ');\n') ofile.write('\tlua_setglobal(engine_lua_state,"' +static+ '");\n') for func in functions: if func in functionBlacklist: continue funcnew = "engine_luaf_" +func.replace("engine_","",1) ofile.write('\tlua_pushcfunction(engine_lua_state,' +funcnew+ ');\n') ofile.write('\tlua_setglobal (engine_lua_state,"' +func+ '");\n') ofile.write('''\ engine_lua_init_manual(); luaL_loadfile(engine_lua_state,"assets/scripts/main.lua"); lua_call(engine_lua_state,0,0); }''')