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_isinteger(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_isfloat(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_isboolean(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_isstring(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 1;
}
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 1;
}
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 1;
}
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
|