コード例 #1
0
ファイル: rpmlua.c プロジェクト: cobexer/RPM5
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;
}
コード例 #2
0
ファイル: rpmhook.c プロジェクト: xrg/RPM
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);
    }
}
コード例 #3
0
ファイル: rpmlua.c プロジェクト: Tojaj/rpm
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;
}