6 |
6 |
7 #define EVENT_BUFFER_MT "EVENT_BUFFER_MT" |
7 #define EVENT_BUFFER_MT "EVENT_BUFFER_MT" |
8 |
8 |
9 #define BUFFER_ADD_CHECK_INPUT_FIRST 1 |
9 #define BUFFER_ADD_CHECK_INPUT_FIRST 1 |
10 |
10 |
|
11 /* Obtains an le_buffer structure from a given index */ |
11 static le_buffer* event_buffer_get(lua_State* L, int idx) { |
12 static le_buffer* event_buffer_get(lua_State* L, int idx) { |
12 return (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
13 return (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
13 } |
14 } |
|
15 |
|
16 /* Obtains an le_buffer structure from a given index |
|
17 AND checks that it hadn't been prematurely freed |
|
18 */ |
14 static le_buffer* event_buffer_check(lua_State* L, int idx) { |
19 static le_buffer* event_buffer_check(lua_State* L, int idx) { |
15 le_buffer* buf = (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
20 le_buffer* buf = (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
16 if(!buf->buffer) |
21 if(!buf->buffer) |
17 luaL_argerror(L, idx, "Attempt to use closed event_buffer object"); |
22 luaL_argerror(L, idx, "Attempt to use closed event_buffer object"); |
18 return buf; |
23 return buf; |
19 } |
24 } |
|
25 |
|
26 /* Checks if the given index contains an le_buffer object */ |
20 static int is_event_buffer(lua_State* L, int idx) { |
27 static int is_event_buffer(lua_State* L, int idx) { |
21 int ret; |
28 int ret; |
22 lua_getmetatable(L, idx); |
29 lua_getmetatable(L, idx); |
23 luaL_getmetatable(L, EVENT_BUFFER_MT); |
30 luaL_getmetatable(L, EVENT_BUFFER_MT); |
24 ret = lua_rawequal(L, -2, -1); |
31 ret = lua_rawequal(L, -2, -1); |
25 lua_pop(L, 2); |
32 lua_pop(L, 2); |
26 return ret; |
33 return ret; |
27 } |
34 } |
28 |
35 |
29 /* TODO: Use lightuserdata mapping to locate hanging object instances */ |
36 /* TODO: Use lightuserdata mapping to locate hanging object instances */ |
|
37 /* Pushes the specified evbuffer object onto the stack, attaching a metatable to it */ |
30 static int event_buffer_push(lua_State* L, struct evbuffer* buffer) { |
38 static int event_buffer_push(lua_State* L, struct evbuffer* buffer) { |
31 le_buffer *buf = (le_buffer*)lua_newuserdata(L, sizeof(le_buffer)); |
39 le_buffer *buf = (le_buffer*)lua_newuserdata(L, sizeof(le_buffer)); |
32 buf->buffer = buffer; |
40 buf->buffer = buffer; |
33 luaL_getmetatable(L, EVENT_BUFFER_MT); |
41 luaL_getmetatable(L, EVENT_BUFFER_MT); |
34 lua_setmetatable(L, -2); |
42 lua_setmetatable(L, -2); |
35 return 1; |
43 return 1; |
36 } |
44 } |
37 |
45 |
|
46 /* LUA: new() |
|
47 Pushes a new evbuffer instance on the stack |
|
48 */ |
38 static int event_buffer_push_new(lua_State* L) { |
49 static int event_buffer_push_new(lua_State* L) { |
39 return event_buffer_push(L, evbuffer_new()); |
50 return event_buffer_push(L, evbuffer_new()); |
40 } |
51 } |
41 |
52 |
|
53 /* LUA: __gc and buffer:close() |
|
54 Releases the buffer resources |
|
55 */ |
42 static int event_buffer_gc(lua_State* L) { |
56 static int event_buffer_gc(lua_State* L) { |
43 le_buffer* buf = event_buffer_get(L, 1); |
57 le_buffer* buf = event_buffer_get(L, 1); |
44 if(buf->buffer) { |
58 if(buf->buffer) { |
45 evbuffer_free(buf->buffer); |
59 evbuffer_free(buf->buffer); |
46 buf->buffer = NULL; |
60 buf->buffer = NULL; |
81 } |
95 } |
82 lua_pushinteger(L, EVBUFFER_LENGTH(buffer) - oldLength); |
96 lua_pushinteger(L, EVBUFFER_LENGTH(buffer) - oldLength); |
83 return 1; |
97 return 1; |
84 } |
98 } |
85 |
99 |
|
100 /* LUA: buffer:length() |
|
101 Returns the length of the buffer contents |
|
102 */ |
86 static int event_buffer_get_length(lua_State* L) { |
103 static int event_buffer_get_length(lua_State* L) { |
87 le_buffer* buf = event_buffer_check(L, 1); |
104 le_buffer* buf = event_buffer_check(L, 1); |
88 lua_pushinteger(L, EVBUFFER_LENGTH(buf->buffer)); |
105 lua_pushinteger(L, EVBUFFER_LENGTH(buf->buffer)); |
89 return 1; |
106 return 1; |
90 } |
107 } |
91 |
108 |
92 /* MAYBE: Could add caching */ |
109 /* MAYBE: Could add caching */ |
|
110 /* LUA: buffer:get_data |
|
111 () - Returns all data in buffer |
|
112 (len) - Returns data up to 'len' bytes long |
|
113 (begin,len) - Returns data beginning at 'begin' up to 'len' bytes long |
|
114 */ |
93 static int event_buffer_get_data(lua_State* L) { |
115 static int event_buffer_get_data(lua_State* L) { |
94 le_buffer* buf = event_buffer_check(L, 1); |
116 le_buffer* buf = event_buffer_check(L, 1); |
95 int begin, len; |
117 int begin, len; |
96 switch(lua_gettop(L)) { |
118 switch(lua_gettop(L)) { |
97 case 1: |
119 case 1: |
117 } |
139 } |
118 lua_pushlstring(L, (const char*)EVBUFFER_DATA(buf->buffer) + begin, len); |
140 lua_pushlstring(L, (const char*)EVBUFFER_DATA(buf->buffer) + begin, len); |
119 return 1; |
141 return 1; |
120 } |
142 } |
121 |
143 |
|
144 /* LUA: buffer:drain(amt) |
|
145 Drains 'amt' bytes from the buffer |
|
146 */ |
122 static int event_buffer_drain(lua_State* L) { |
147 static int event_buffer_drain(lua_State* L) { |
123 le_buffer* buf = event_buffer_check(L, 1); |
148 le_buffer* buf = event_buffer_check(L, 1); |
124 size_t len = luaL_checkinteger(L, 2); |
149 size_t len = luaL_checkinteger(L, 2); |
125 evbuffer_drain(buf->buffer, len); |
150 evbuffer_drain(buf->buffer, len); |
126 return 0; |
151 return 0; |