aboutsummaryrefslogtreecommitdiff
path: root/src/lua.c
blob: 30cec896d0889fd186dd14088ca7ec5b02babe9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "lua.h"
#include <stdio.h>
#include "io.h"
#include <stdlib.h>
#include <string.h>
#include "i_str.h"
#include "parray.h"

static int ii = 0;
void i_dcopy(lua_State* src, lua_State* dest, void* _seen){
    parray_t* seen = (parray_t*)_seen;
    if(seen == NULL) seen = parray_init();
    size_t len;
    int at, at2;
    int *sp = malloc(1);
    char* s;
    void* whar;
    int old_top = lua_gettop(src);
    //printf("%i\n",ii++);
    switch(lua_type(src, -1)){
        case LUA_TNUMBER:
            lua_pushnumber(dest, luaL_checknumber(src, -1));
            break;
        case LUA_TSTRING:
            s = (char*)luaL_checklstring(src, -1, &len);
            lua_pushlstring(dest, s, len);
            break;
        case LUA_TTABLE:
            lua_newtable(dest);
            at = lua_gettop(dest);
            at2 = lua_gettop(src);

            *sp = at2;
            whar = parray_get(seen, (void*)lua_topointer(src, at2));
            if( whar != NULL){
                //printf("%s\n",lua_tostring(src, at2));
                //printf("WHAR\n");
                    
                lua_pushvalue(dest, *(int*)whar);
                return;
            } else parray_set(seen, (void*)lua_topointer(src, at2), sp);

            lua_pushnil(src);
            for(;lua_next(src, at2) != 0;){
                lua_pushvalue(src, -2);
                
                i_dcopy(src, dest, seen);

                lua_pushvalue(src, -2);
                i_dcopy(src, dest, seen);
                
                lua_settable(dest, at);
                lua_pop(src, 3);
            }
            lua_settop(dest, at);
            break;
        case LUA_TFUNCTION:
            //lua_pushnil(dest);
            //break;
            if(lua_iscfunction(src, old_top)){
                //kinda silly
                lua_pushcfunction(dest, lua_tocfunction(src, -1));
                break;
            }
            
            lua_getglobal(src, "string");
            lua_pushstring(src, "dump");
            lua_gettable(src, -2);
            lua_pushvalue(src, old_top);
            lua_call(src, 1, 1);

            s = (char*)luaL_checklstring(src, -1, &len);
            lua_pushlstring(dest, s, len);
            //for(int i = 0; i != len; i++) printf("%c",s[i]);
            luaL_loadbuffer(dest, s, len, "test");
            lua_remove(dest, -2);
            //lua_pushvalue(dest, -1);
            break;
        case LUA_TUSERDATA:
            lua_pushlightuserdata(dest, lua_touserdata(src, -1));
            break;
        default:
            printf("%i\n",lua_type(src, -1));
            lua_pushnil(dest);
            break;
    }
    //lua_settop(src, old_top);
}