static void testC (void) { #define getnum(s) ((*s++) - '0') #define getname(s) (nome[0] = *s++, nome) static int locks[10]; lua_Object reg[10]; char nome[2]; char *s = luaL_check_string(1); nome[1] = 0; for (;;) { switch (*s++) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': lua_pushnumber(*(s-1) - '0'); break; case 'c': reg[getnum(s)] = lua_createtable(); break; case 'C': { lua_CFunction f = lua_getcfunction(lua_getglobal(getname(s))); lua_pushcclosure(f, getnum(s)); break; } case 'P': reg[getnum(s)] = lua_pop(); break; case 'g': { int n=getnum(s); reg[n]=lua_getglobal(getname(s)); break; } case 'G': { int n = getnum(s); reg[n] = lua_rawgetglobal(getname(s)); break; } case 'l': locks[getnum(s)] = lua_ref(1); break; case 'L': locks[getnum(s)] = lua_ref(0); break; case 'r': { int n=getnum(s); reg[n]=lua_getref(locks[getnum(s)]); break; } case 'u': lua_unref(locks[getnum(s)]); break; case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; } case '=': lua_setglobal(getname(s)); break; case 's': lua_pushstring(getname(s)); break; case 'o': lua_pushobject(reg[getnum(s)]); break; case 'f': lua_call(getname(s)); break; case 'i': reg[getnum(s)] = lua_gettable(); break; case 'I': reg[getnum(s)] = lua_rawgettable(); break; case 't': lua_settable(); break; case 'T': lua_rawsettable(); break; case 'N' : lua_pushstring(lua_nextvar(lua_getstring(reg[getnum(s)]))); break; case 'n' : { int n=getnum(s); n=lua_next(reg[n], (int)lua_getnumber(reg[getnum(s)])); lua_pushnumber(n); break; } default: luaL_verror("unknown command in `testC': %c", *(s-1)); } if (*s == 0) return; if (*s++ != ' ') lua_error("missing ` ' between commands in `testC'"); } }
/* ** Internal function: print object values */ void lua_print (void) { int i=1; lua_Object obj; while ((obj=lua_getparam (i++)) != LUA_NOOBJECT) { if (lua_isnumber(obj)) printf("%g\n",lua_getnumber(obj)); else if (lua_isstring(obj)) printf("%s\n",lua_getstring(obj)); else if (lua_isfunction(obj)) printf("function: %p\n",bvalue(luaI_Address(obj))); else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction(obj) ); else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata(obj)); else if (lua_istable(obj)) printf("table: %p\n",avalue(luaI_Address(obj))); else if (lua_isnil(obj)) printf("nil\n"); else printf("invalid value to print\n"); } }
static void iuplua_set_callback(void) { lua_Object o; Icallback func; Ihandle* ih = iuplua_checkihandle(1); char* name = luaL_check_string(2); o = lua_getparam(3); if (!lua_iscfunction(o)) lua_error("invalid function when set callback"); func = (Icallback)lua_getcfunction(o); o = lua_getparam(4); if (lua_isnil(o)) IupSetCallback(ih, name, (Icallback)NULL); else IupSetCallback(ih, name, func); }