src/lua_type.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 199 8eb839fbabba
permissions -rw-r--r--
nexus.c compiles
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "lua_type.h"
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <lua5.1/lauxlib.h>
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     5
void lua_type_register (lua_State *L, const struct lua_type *type, const struct lua_method methods[])
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     7
    const struct lua_method *method;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     8
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     9
    // create the metatable
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    10
    luaL_newmetatable(L, type->name);
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    // set the metatable __index to itself
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    lua_pushvalue(L, -1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    lua_setfield(L, -1, "__index");
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    16
    // add the methods to the metatable
146
24c0fc79d86a fix bug with lua_type_register/methods
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
    17
    for (method = methods; method->func; method++) {
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    18
        lua_pushcfunction(L, method->func);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    19
        lua_setfield(L, -2, method->name);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    20
    }
143
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
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    23
void* lua_type_create (lua_State *L, const struct lua_type *type, size_t size)
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    // create the new userdata on the stack
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    void *ud = lua_newuserdata(L, size);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    // get the type and set it
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    29
    luaL_getmetatable(L, type->name);
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    lua_setmetatable(L, -2);
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    31
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // ok
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    return ud;
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
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    36
void* lua_type_register_global (lua_State *L, const struct lua_type *type, const struct lua_method methods[],
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    37
        const char *global_name, size_t size)
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    // allocate the global object
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    void *obj = lua_newuserdata(L, size);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    // create the type metatable
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    43
    lua_type_register(L, type, methods);
143
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
    // set the userdata's metatable
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    lua_setmetatable(L, -2);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    // store it as a global
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    lua_setglobal(L, global_name);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // ok
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    return obj;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    55
void* lua_type_get (lua_State *L, const struct lua_type *type, int index)
143
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
    void *ud;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    // validate the userdata arg
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 146
diff changeset
    60
    // XXX: the luaL_checkudata actually raises an error itself
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    61
    if ((ud = luaL_checkudata(L, index, type->name)) == NULL) {
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    62
        luaL_error(L, "bad type argument: `%s` expected", type->name); return NULL;
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    } else {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        // ok
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        return ud;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
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
}