Ejemplo n.º 1
0
Archivo: rpmhook.c Proyecto: xrg/RPM
static rpmhookArgs rpmhookArgsParse(const char *argt, va_list ap)
{
    rpmhookArgs args = rpmhookArgsNew(strlen(argt));
    int i;

    args->argt = argt;
    for (i = 0; i != args->argc; i++) {
	switch (argt[i]) {
	    case 's':
		args->argv[i].s = va_arg(ap, char *);
		break;
	    case 'i':
		args->argv[i].i = va_arg(ap, int);
		break;
	    case 'f':
		args->argv[i].f = (float)va_arg(ap, double);
		break;
	    case 'p':
		args->argv[i].p = va_arg(ap, void *);
		break;
	    default:
		fprintf(stderr, "error: unsupported type '%c' as "
				"a hook argument\n", argt[i]);
		break;
	}
    }
    return args;
}
Ejemplo n.º 2
0
static rpmhookArgs rpmhookArgsParse(const char *argt, va_list ap)
	/*@*/
{
    rpmhookArgs args = rpmhookArgsNew((int)strlen(argt));
    int i;

/*@-temptrans@*/
    args->argt = argt;
/*@=temptrans@*/
    for (i = 0; i != args->argc; i++) {
	switch (argt[i]) {
	    case 's':
		args->argv[i].s = va_arg(ap, char *);
		/*@switchbreak@*/ break;
	    case 'i':
		args->argv[i].i = va_arg(ap, int);
		/*@switchbreak@*/ break;
	    case 'f':
		args->argv[i].f = (float)va_arg(ap, double);
		/*@switchbreak@*/ break;
	    case 'p':
		args->argv[i].p = va_arg(ap, void *);
		/*@switchbreak@*/ break;
	    default:
/*@-modfilesys @*/
		fprintf(stderr, "error: unsupported type '%c' as "
				"a hook argument\n", argt[i]);
/*@=modfilesys @*/
		/*@switchbreak@*/ break;
	}
    }
    return args;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
Archivo: rpmlua.c Proyecto: 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;
}