src/lib/lua_func.c
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 01:17:36 +0300
branchnew-lib-errors
changeset 219 cefec18b8268
parent 201 src/lua_func.c@5c34c5d90a3f
permissions -rw-r--r--
some of the lib/transport stuff compiles
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "lua_func.h"
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "error.h"
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <lua5.1/lauxlib.h>
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * Pushes onto the stack the value at t[i]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
static void lua_getindex (lua_State *L, int t, int i)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    lua_pushinteger(L, i);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    lua_gettable(L, t);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
 * Pushes onto the stack either:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 *  * the value at t[name]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 *  * the value at t[index]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 *
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 *  Returns the new index, or 0, if neither could be found
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
static int lua_arg_lookup (lua_State *L, int t, const char *name, int index)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    // try name
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    lua_getfield(L, t, name);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    if (!lua_isnil(L, -1))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // try index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    lua_getindex(L, t, index);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    if (!lua_isnil(L, -1))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    // not found
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
static const char *_lua_arg_string (lua_State *L, int index, const char *name, const char *def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    const char *value;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    // use default?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    if (lua_isnoneornil(L, index) && def != (const char *) LUA_ARG_REQUIRED)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        return def;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    // value given?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    if ((value = lua_tostring(L, index)))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        return value;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
   
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    // error
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    luaL_error(L, "missing value for required string argument <%d:%s>", index, name); return NULL;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
static bool _lua_arg_bool (lua_State *L, int index, const char *name, int def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    (void) name;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    // use default?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    if (lua_isnoneornil(L, index) && def != LUA_ARG_REQUIRED)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        return def;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
   
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    // value given
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    return lua_toboolean(L, index);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
201
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    73
static long _lua_arg_int (lua_State *L, int index, const char *name, long def)
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    74
{
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    75
    (void) name;
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    76
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    77
    // use default?
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    78
    if (lua_isnoneornil(L, index) && def != LUA_ARG_REQUIRED)
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    79
        return def;
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    80
   
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    81
    // conver to integer
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    82
    // XXX: check compatibility?
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    83
    return lua_tointeger(L, index);
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    84
}
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
    85
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    86
static void * _lua_arg_obj (lua_State *L, int index, const struct lua_type *type, bool optional)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    87
{
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    88
    // not given?
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    89
    if (!lua_isnoneornil(L, index))
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    90
        return lua_type_get(L, type, index);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    91
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    92
    if (optional)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    93
        return NULL;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    94
    
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    95
    luaL_error(L, "missing value for required object argument <%d:%s>", index, type->name);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    96
    return NULL;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    97
}
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    98
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
 * Look up the arg index to use for the given index/name.
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
 *
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
 * If no value is found for the corresponding index, returns zero.
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
static int lua_arg_index (lua_State *L, int nargs, int index, const char *name)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    // lookup from table?
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   107
    if (nargs == 2 && lua_istable(L, 2) && name) {
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   108
        // push the value from the named field onto the stack
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        lua_getfield(L, 2, name);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        // no named field?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        if (lua_isnil(L, -1)) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
            lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
            lua_getindex(L, 2, index - 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        // no index field?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        if (lua_isnil(L, -1)) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
            return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        // found either a named or indexed arg
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    } else if (index <= nargs) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
        // use the same index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        return index;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    } else {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        // no index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
const char *lua_arg_string (lua_State *L, int nargs, int index, const char *name, const char *def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    return _lua_arg_string(L, lua_arg_index(L, nargs, index, name), name, def);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
bool lua_arg_bool (lua_State *L, int nargs, int index, const char *name, int def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    return _lua_arg_bool(L, lua_arg_index(L, nargs, index, name), name, def);    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
201
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   148
void* lua_arg_obj (lua_State *L, int nargs, int index, const struct lua_type *type, bool optional)
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   149
{
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   150
    return _lua_arg_obj(L, lua_arg_index(L, nargs, index, NULL), type, optional);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   151
}
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   152
201
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   153
long lua_arg_int (lua_State *L, int nargs, int index, const char *name, long def)
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   154
{
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   155
    return _lua_arg_int(L, lua_arg_index(L, nargs, index, name), name, def);
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   156
}
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   157
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
void lua_args_parse (lua_State *L, const struct lua_func *func, void **obj_ptr, ...)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    int argidx = 1, argtbl = 0, idx;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    const struct lua_func_arg *arg;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    va_list vargs;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    // first, the obj argument
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   165
    if (func->type)
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   166
        *obj_ptr = lua_type_get(L, func->type, argidx++);
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    // were we given a table of arguments?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    if (lua_istable(L, argidx))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        argtbl = argidx++;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    // parse the args
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    va_start(vargs, obj_ptr);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    for (arg = func->args, idx = 1; arg->name && arg->type; arg++, idx++) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        int index;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        // map index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        if (!argtbl)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
            // direct
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
            index = argidx++;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
        else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            // lookup from table
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
            index = lua_arg_lookup(L, argtbl, arg->name, idx);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        // apply
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        switch (arg->type) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
            case LUA_ARG_STRING:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                *va_arg(vargs, const char **) = _lua_arg_string(L, index, arg->name, arg->def.string);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
                break;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
            case LUA_ARG_BOOL:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
                *va_arg(vargs, bool *) = _lua_arg_bool(L, index, arg->name, arg->def.boolean);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
                break;
201
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   196
            
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   197
            case LUA_ARG_INT:
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   198
                *va_arg(vargs, long *) = _lua_arg_int(L, index, arg->name, arg->def.integer);
5c34c5d90a3f implement LUA_ARG_INT
Tero Marttila <terom@fixme.fi>
parents: 199
diff changeset
   199
                break;
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
            default:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
                NOT_REACHED();
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
        };
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
    va_end(vargs);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
}