aboutsummaryrefslogtreecommitdiff
path: root/src/lua/net/luaopen_Buffer.cpp
blob: 927854426cacf260276f2eb4b60255bc37595366 (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "lua/luax.h"
#include "../luaopen_types.h"
#include "libjin/jin.h"
#include "lua_net_Buffer.h"

namespace jin
{
namespace lua
{
namespace net
{

    static inline Buffer* checkNetBuffer(lua_State* L)
    {
        Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER);
        if (proxy != 0 && proxy != nullptr)
            return (Buffer*)proxy->object;
        return nullptr;
    }

    // net.Buffer:append(value) -> value_length
    static int l_append(lua_State* L)
    {
        Buffer* buffer = checkNetBuffer(L);
        const int vp = 2;
        if (luax_isintegerstrict(L, vp))
        {
            int n = luax_checkinteger(L, vp);
            int size = sizeof(n);
            buffer->append(&n, size);
            luax_pushinteger(L, size);
            return 1;
        } 
        else if (luax_isfloatstrict(L, vp))
        {
            float n = luax_checknumber(L, vp);
            int size = sizeof(n);
            buffer->append(&n, size);
            luax_pushinteger(L, size);
            return 1;
        }
        else if (luax_isbooleanstrict(L, vp))
        {
            bool n = luax_checkbool(L, vp);
            int size = sizeof(n);
            buffer->append(&n, size);
            luax_pushinteger(L, size);
            return 1;
        }
        else if (luax_isstringstrict(L, vp))
        {
            const char* str = luax_checkstring(L, vp);
            int size = strlen(str) + 1;
            buffer->append(str, size);
            luax_pushinteger(L, size);
            return 1;
        }
        else
        {
            luax_typerror(L, vp, "number, bool or string");
            return 0;
        }
    }

    // net.Buffer:grabString(offset) -> string, length
    static int l_grabString(lua_State* L)
    {
        Buffer* buffer = checkNetBuffer(L);
        int offset = luax_checkinteger(L, 2);
        int len;
        const char* str = buffer->grabString(&len, offset);
        luax_pushstring(L, str);
        luax_pushinteger(L, len);
        return 2;
    }

    // net.Buffer:grabInteger(offset) -> integer, length
    static int l_grabInteger(lua_State* L)
    {
        Buffer* buffer = checkNetBuffer(L);
        int offset = luax_checkinteger(L, 2);
        int len;
        int integer = buffer->grabInteger(&len, offset);
        luax_pushinteger(L, integer);
        luax_pushinteger(L, len);
        return 2;
    }

    static int l_grabFloat(lua_State* L)
    {
        Buffer* buffer = checkNetBuffer(L);
        int offset = luax_checkinteger(L, 2);
        int len;
        float floatv = buffer->grabFloat(&len, offset);
        luax_pushnumber(L, floatv);
        luax_pushinteger(L, len);
        return 2;
    }

    static int l_grabBoolean(lua_State* L)
    {
        Buffer* buffer = checkNetBuffer(L);
        int offset = luax_checkinteger(L, 2);
        int len;
        bool boolean = buffer->grabBoolean(&len, offset);
        luax_pushboolean(L, boolean);
        luax_pushinteger(L, len);
        return 2;
    }

    static const luaL_Reg netbuffer_function[] = {
        { "append",         l_append },
        { "grabString",     l_grabString },
        { "grabInteger",    l_grabInteger },
        { "grabBoolean",    l_grabBoolean },
        { "grabFloat",      l_grabFloat },
        { 0, 0 }
    };

} // net

    int luaopen_Buffer(lua_State* L)
    {
        luax_newtype(L, JIN_NETWORK_BUFFER, net::netbuffer_function);
        return 0;
    }

} // lua
} // jin