Thu, 06 Sep 2007 23:22:55 -0400
Added event_buffer object + 'add' functionality
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
1 | /* LuaEvent - Copyright (C) 2007 Thomas Harning <harningt@gmail.com> |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
2 | * Licensed as LGPL - See doc/COPYING for details */ |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
3 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
4 | #include "event_buffer.h" |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
5 | #include <lauxlib.h> |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
6 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
7 | #define EVENT_BUFFER_MT "EVENT_BUFFER_MT" |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
8 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
9 | #define BUFFER_ADD_CHECK_INPUT_FIRST 1 |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
10 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
11 | static le_buffer* event_buffer_get(lua_State* L, int idx) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
12 | return (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
13 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
14 | static int is_event_buffer(lua_State* L, int idx) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
15 | int ret; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
16 | lua_getmetatable(L, idx); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
17 | luaL_getmetatable(L, EVENT_BUFFER_MT); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
18 | ret = lua_rawequal(L, -2, -1); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
19 | lua_pop(L, 2); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
20 | return ret; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
21 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
22 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
23 | /* LUA: buffer:add(...) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
24 | progressively adds items to the buffer |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
25 | if arg[*] is string, treat as a string:format call |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
26 | if arg[*] is a buffer, perform event_add_buffer |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
27 | returns number of bytes added |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
28 | */ |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
29 | int event_buffer_add(lua_State* L) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
30 | le_buffer* buf = event_buffer_get(L, 1); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
31 | struct evbuffer* buffer = buf->buffer; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
32 | int oldLength = EVBUFFER_LENGTH(buffer); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
33 | int last = lua_top(L); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
34 | int i; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
35 | for(i = 2; i <= last; i++) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
36 | if(!lua_isstring(L, i) && !is_event_buffer(L, i)) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
37 | luaL_argerror(L, i, "Argument is not a string or buffer object"); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
38 | /* Optionally perform checks and data loading separately to avoid overfilling the buffer */ |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
39 | #if BUFFER_ADD_CHECK_INPUT_FIRST |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
40 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
41 | for(i = 2; i <= last; i++) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
42 | #endif |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
43 | if(lua_isstring(L, i)) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
44 | size_t len; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
45 | const char* data = lua_tolstring(L, i, &len); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
46 | if(0 != evbuffer_add(buffer, data, len)) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
47 | luaL_error(L, "Failed to add data to the buffer"); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
48 | } else { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
49 | le_buffer* buf2 = event_buffer_get(L, i); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
50 | if(0 != evbuffer_add_buffer(buffer, buf2->buffer)) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
51 | luaL_error(L, "Failed to move buffer-data to the buffer"); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
52 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
53 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
54 | lua_pushinteger(L, EVBUFFER_LENGTH(buffer) - oldLength); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
55 | return 1; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
56 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
57 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
58 | static luaL_Reg buffer_funcs[] = { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
59 | {"add",event_buffer_add}, |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
60 | {NULL, NULL} |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
61 | }; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
62 | static luaL_Ref funcs[] = { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
63 | {NULL, NULL} |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
64 | }; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
65 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
66 | int event_buffer_register(lua_State* L) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
67 | luaL_newmetatable(L, EVENT_BUFFER_MT); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
68 | lua_newtable(L); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
69 | luaL_register(L, NULL, buffer_funcs); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
70 | lua_setfield(L, -2, "__index"); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
71 | lua_pop(L, 1); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
72 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
73 | luaL_register(L, "luaevent.core.buffer", funcs); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
74 | return 0; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
75 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
76 |