That ud just stands for user data, I do nothing with it because I passed NULL to lua_newstate for that variable, lua doesn't care whether it's NULL or a valid pointer, it just passes it onto the alloctor, it's probably there for things like HeapAlloc(), any I seem to have fixed it, it now looks like this:
Code:
static void* foo_alloc( void *ud, void *ptr, size_t size, size_t want )
{
uchar *tmp = NULL;
(void)ud;
errno = EXIT_SUCCESS;
if ( want == size ) return ptr;
if ( !want ) {
if ( ptr ) free( ptr );
return NULL;
}
if ( !ptr ) tmp = malloc( want );
else tmp = realloc( ptr, want );
if ( !tmp ) {
if ( want < size ) {
tmp = malloc( want );
if ( tmp ) memcpy( tmp, ptr, want );
free(ptr);
return tmp;
}
goto nomem;
}
if ( size < want ) memset( &tmp[size], 0, want - size );
return tmp;
nomem:
if ( errno == EXIT_SUCCESS ) errno = ENOMEM;
return NULL;
}
But now I've run into a new problem, the app keeps crashing at around the end part:
Code:
void foo_gnewcfunc( lua_State *L, char *name, lua_CFunction func ) {
lua_pushcfunction(L,func);
lua_setglobal(L,name);
lua_pop(L,2);
}
void foo_gnewtable( lua_State *L, char *name ) {
lua_newtable(L);
lua_setglobal(L,name);
lua_pop(L,2);
}
void foo_gnewstring( lua_State *L, char *name, char *value ) {
lua_pushstring(L,value);
lua_setglobal(L,name);
lua_pop(L,2);
}
void foo_gnewinteger( lua_State *L, char *name, long value ) {
lua_pushinteger(L,value);
lua_setglobal(L,name);
lua_pop(L,2);
}
void foo_gnewnumber( lua_State *L, char *name, long double value ) {
lua_pushnumber(L,value);
lua_setglobal(L,name);
lua_pop(L,2);
}
...
int main( int argc, char *argv[] ) {
lua_State *L = NULL;
puts("Opening lua state...");
if ( !(L = lua_newstate(foo_alloc,NULL)) ) {
printf("error 0x%08X '%s'\n", errno, strerror(errno) );
return EXIT_FAILURE;
}
g_L = L;
puts("Setting atexit to cope with glut aborting program...");
atexit(foo_atexit);
puts("Opening lua libs...");
luaL_openlibs(L);
puts("Adding lua global locate()...");
foo_gnewcfunc(L,"locate",foo_locate);
puts("Adding lua global hookpid()...");
foo_gnewcfunc(L,"hookpid",foo_hookpid);
puts("Adding lua global table game...");
foo_gnewtable(L,"game");
puts("Adding lua global table glut...");
foo_gnewtable(L,"glut");
puts("Putting glut at top of lua stack...");
lua_getglobal(L,"glut");
puts("Adding string field api...");
foo_tnewstring(L,-1,"api","freeglut");
puts("Adding field initWindowPosition()...");
foo_tnewcfunc(L,-1,"initWindowPosition",foo_glutInitWindowPosition);
puts("Adding field initWindowSize()...");
foo_tnewcfunc(L,-1,"initWindowSize",foo_glutInitWindowSize);
puts("Adding field init()...");
foo_tnewcfunc(L,-1,"init",foo_glutInit); // Furthest I get is here
puts("Adding field terminate()...");
foo_tnewcfunc(L,-1,"terminate",foo_glutTerminate);
lua_pop(L,1);
puts("Attempt to run file foo.lua...");
luaL_dofile(L,"foo.lua");
lua_close(L);
g_L = NULL;
puts("Nothing further to do, leaving program...");
return EXIT_SUCCESS;
}
Edit: Just removed the lua_pop(L,2) calls and everything went dandy