static int rpm_call(lua_State *L) /*@globals internalState @*/ /*@modifies L, internalState @*/ { if (!lua_isstring(L, 1)) { (void) luaL_argerror(L, 1, "hook name expected"); } else { rpmhookArgs args = rpmhookArgsNew(lua_gettop(L)-1); const char *name = lua_tostring(L, 1); char *argt = (char *)xmalloc(args->argc+1); int i; for (i = 0; i != args->argc; i++) { switch (lua_type(L, i+1)) { case LUA_TNIL: argt[i] = 'p'; args->argv[i].p = NULL; /*@switchbreak@*/ break; case LUA_TNUMBER: { float f = (float)lua_tonumber(L, i+1); /*@+relaxtypes@*/ if (f == (int)f) { argt[i] = 'i'; args->argv[i].i = (int)f; } else { argt[i] = 'f'; args->argv[i].f = f; } /*@=relaxtypes@*/ } /*@switchbreak@*/ break; case LUA_TSTRING: argt[i] = 's'; args->argv[i].s = lua_tostring(L, i+1); /*@switchbreak@*/ break; case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: argt[i] = 'p'; args->argv[i].p = lua_touserdata(L, i+1); /*@switchbreak@*/ break; default: (void) luaL_error(L, "unsupported Lua type passed to hook"); argt[i] = 'p'; args->argv[i].p = NULL; /*@switchbreak@*/ break; } } /*@-compdef -kepttrans -usereleased @*/ args->argt = argt; rpmhookCallArgs(name, args); argt = _free(argt); (void) rpmhookArgsFree(args); /*@=compdef =kepttrans =usereleased @*/ } return 0; }
void rpmhookCall(const char *name, const char *argt, ...) { if (globalTable != NULL) { rpmhookArgs args; va_list ap; va_start(ap, argt); args = rpmhookArgsParse(argt, ap); rpmhookTableCallArgs(&globalTable, name, args); (void) rpmhookArgsFree(args); va_end(ap); } }
static int rpm_call(lua_State *L) { if (!lua_isstring(L, 1)) { (void) luaL_argerror(L, 1, "hook name expected"); } else { rpmhookArgs args = rpmhookArgsNew(lua_gettop(L)-1); const char *name = lua_tostring(L, 1); char *argt = (char *)xmalloc(args->argc+1); int i; for (i = 0; i != args->argc; i++) { switch (lua_type(L, i+1)) { case LUA_TNIL: argt[i] = 'p'; args->argv[i].p = NULL; break; case LUA_TNUMBER: { float f = (float)lua_tonumber(L, i+1); if (f == (int)f) { argt[i] = 'i'; args->argv[i].i = (int)f; } else { argt[i] = 'f'; args->argv[i].f = f; } } break; case LUA_TSTRING: argt[i] = 's'; args->argv[i].s = lua_tostring(L, i+1); break; case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: argt[i] = 'p'; args->argv[i].p = lua_touserdata(L, i+1); break; default: (void) luaL_error(L, "unsupported Lua type passed to hook"); argt[i] = 'p'; args->argv[i].p = NULL; break; } } args->argt = argt; rpmhookCallArgs(name, args); free(argt); (void) rpmhookArgsFree(args); } return 0; }