Fri, 07 Sep 2007 00:20:10 -0400
event_buffer learned to manage '#' and the __tostring metafield
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> |
31
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
6 | #include <malloc.h> |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
7 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
8 | #define EVENT_BUFFER_MT "EVENT_BUFFER_MT" |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
9 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
10 | #define BUFFER_ADD_CHECK_INPUT_FIRST 1 |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
11 | |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
12 | /* Obtains an le_buffer structure from a given index */ |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
13 | 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
|
14 | 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
|
15 | } |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
16 | |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
17 | /* Obtains an le_buffer structure from a given index |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
18 | AND checks that it hadn't been prematurely freed |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
19 | */ |
28
f7b864b661f4
Quick compilation-fixes.
Thomas Harning Jr <harningt@gmail.com>
parents:
27
diff
changeset
|
20 | static le_buffer* event_buffer_check(lua_State* L, int idx) { |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
21 | le_buffer* buf = (le_buffer*)luaL_checkudata(L, idx, EVENT_BUFFER_MT); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
22 | if(!buf->buffer) |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
23 | luaL_argerror(L, idx, "Attempt to use closed event_buffer object"); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
24 | return buf; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
25 | } |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
26 | |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
27 | /* Checks if the given index contains an le_buffer object */ |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
28 | 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
|
29 | int ret; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
30 | lua_getmetatable(L, idx); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
31 | luaL_getmetatable(L, EVENT_BUFFER_MT); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
32 | ret = lua_rawequal(L, -2, -1); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
33 | lua_pop(L, 2); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
34 | return ret; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
35 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
36 | |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
37 | /* TODO: Use lightuserdata mapping to locate hanging object instances */ |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
38 | /* Pushes the specified evbuffer object onto the stack, attaching a metatable to it */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
39 | static int event_buffer_push(lua_State* L, struct evbuffer* buffer) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
40 | le_buffer *buf = (le_buffer*)lua_newuserdata(L, sizeof(le_buffer)); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
41 | buf->buffer = buffer; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
42 | luaL_getmetatable(L, EVENT_BUFFER_MT); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
43 | lua_setmetatable(L, -2); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
44 | return 1; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
45 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
46 | |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
47 | /* LUA: new() |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
48 | Pushes a new evbuffer instance on the stack |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
49 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
50 | static int event_buffer_push_new(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
51 | return event_buffer_push(L, evbuffer_new()); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
52 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
53 | |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
54 | /* LUA: __gc and buffer:close() |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
55 | Releases the buffer resources |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
56 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
57 | static int event_buffer_gc(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
58 | le_buffer* buf = event_buffer_get(L, 1); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
59 | if(buf->buffer) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
60 | evbuffer_free(buf->buffer); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
61 | buf->buffer = NULL; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
62 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
63 | return 0; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
64 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
65 | |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
66 | /* LUA: buffer:add(...) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
67 | progressively adds items to the buffer |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
68 | 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
|
69 | 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
|
70 | returns number of bytes added |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
71 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
72 | static int event_buffer_add(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
73 | le_buffer* buf = event_buffer_check(L, 1); |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
74 | struct evbuffer* buffer = buf->buffer; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
75 | int oldLength = EVBUFFER_LENGTH(buffer); |
28
f7b864b661f4
Quick compilation-fixes.
Thomas Harning Jr <harningt@gmail.com>
parents:
27
diff
changeset
|
76 | int last = lua_gettop(L); |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
77 | int i; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
78 | for(i = 2; i <= last; i++) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
79 | 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
|
80 | luaL_argerror(L, i, "Argument is not a string or buffer object"); |
32
22976b4e5ffd
event_buffer:add learned not to append to itself...
Thomas Harning Jr <harningt@gmail.com>
parents:
31
diff
changeset
|
81 | if(lua_equal(L, 1, i)) |
22976b4e5ffd
event_buffer:add learned not to append to itself...
Thomas Harning Jr <harningt@gmail.com>
parents:
31
diff
changeset
|
82 | luaL_argerror(L, i, "Cannot add buffer to itself"); |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
83 | /* 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
|
84 | #if BUFFER_ADD_CHECK_INPUT_FIRST |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
85 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
86 | for(i = 2; i <= last; i++) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
87 | #endif |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
88 | if(lua_isstring(L, i)) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
89 | size_t len; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
90 | const char* data = lua_tolstring(L, i, &len); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
91 | if(0 != evbuffer_add(buffer, data, len)) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
92 | 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
|
93 | } else { |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
94 | le_buffer* buf2 = event_buffer_check(L, i); |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
95 | if(0 != evbuffer_add_buffer(buffer, buf2->buffer)) |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
96 | 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
|
97 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
98 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
99 | lua_pushinteger(L, EVBUFFER_LENGTH(buffer) - oldLength); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
100 | return 1; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
101 | } |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
102 | |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
103 | /* LUA: buffer:length() |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
104 | Returns the length of the buffer contents |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
105 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
106 | static int event_buffer_get_length(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
107 | le_buffer* buf = event_buffer_check(L, 1); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
108 | lua_pushinteger(L, EVBUFFER_LENGTH(buf->buffer)); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
109 | return 1; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
110 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
111 | |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
112 | /* MAYBE: Could add caching */ |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
113 | /* LUA: buffer:get_data |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
114 | () - Returns all data in buffer |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
115 | (len) - Returns data up to 'len' bytes long |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
116 | (begin,len) - Returns data beginning at 'begin' up to 'len' bytes long |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
117 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
118 | static int event_buffer_get_data(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
119 | le_buffer* buf = event_buffer_check(L, 1); |
29
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
120 | int begin, len; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
121 | switch(lua_gettop(L)) { |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
122 | case 1: |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
123 | /* Obtain full data */ |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
124 | begin = 0; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
125 | len = EVBUFFER_LENGTH(buf->buffer); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
126 | break; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
127 | case 2: |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
128 | begin = 0; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
129 | len = luaL_checkinteger(L, 2); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
130 | if(len > EVBUFFER_LENGTH(buf->buffer)) |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
131 | len = EVBUFFER_LENGTH(buf->buffer); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
132 | break; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
133 | case 3: |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
134 | default: |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
135 | begin = luaL_checkinteger(L, 2); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
136 | len = luaL_checkinteger(L, 3); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
137 | if(begin > EVBUFFER_LENGTH(buf->buffer)) |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
138 | begin = EVBUFFER_LENGTH(buf->buffer); |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
139 | if(begin + len > EVBUFFER_LENGTH(buf->buffer)) |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
140 | len = EVBUFFER_LENGTH(buf->buffer) - begin; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
141 | break; |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
142 | } |
f6d0eb94ca6c
event_buffer:get_data learned (len) and (begin,len) API
Thomas Harning Jr <harningt@gmail.com>
parents:
28
diff
changeset
|
143 | lua_pushlstring(L, (const char*)EVBUFFER_DATA(buf->buffer) + begin, len); |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
144 | return 1; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
145 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
146 | |
31
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
147 | /* LUA: buffer:readline() |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
148 | Returns a line terminated by either '\r\n','\n\r' or '\r' or '\n' |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
149 | Returns nil and leaves data alone if no terminator is found |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
150 | TODO: Evaluate whether or not the newline is included |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
151 | */ |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
152 | static int event_buffer_readline(lua_State* L) { |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
153 | le_buffer* buf = event_buffer_check(L, 1); |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
154 | char* line = evbuffer_readline(buf->buffer); |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
155 | if(!line) |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
156 | return 0; |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
157 | lua_pushstring(L, line); |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
158 | free(line); |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
159 | return 1; |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
160 | } |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
161 | |
30
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
162 | /* LUA: buffer:drain(amt) |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
163 | Drains 'amt' bytes from the buffer |
d5b6c8abaaeb
Documented event_buffer functions
Thomas Harning Jr <harningt@gmail.com>
parents:
29
diff
changeset
|
164 | */ |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
165 | static int event_buffer_drain(lua_State* L) { |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
166 | le_buffer* buf = event_buffer_check(L, 1); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
167 | size_t len = luaL_checkinteger(L, 2); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
168 | evbuffer_drain(buf->buffer, len); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
169 | return 0; |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
170 | } |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
171 | |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
172 | static luaL_Reg buffer_funcs[] = { |
31
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
173 | {"add", event_buffer_add}, |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
174 | {"length", event_buffer_get_length}, |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
175 | {"get_data", event_buffer_get_data}, |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
176 | {"readline", event_buffer_readline}, |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
177 | {"drain", event_buffer_drain}, |
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
178 | {"close", event_buffer_gc}, |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
179 | {NULL, NULL} |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
180 | }; |
28
f7b864b661f4
Quick compilation-fixes.
Thomas Harning Jr <harningt@gmail.com>
parents:
27
diff
changeset
|
181 | static luaL_Reg funcs[] = { |
31
1956a957c613
event_buffer learned readline and cleaned fn-list.
Thomas Harning Jr <harningt@gmail.com>
parents:
30
diff
changeset
|
182 | {"new", event_buffer_push_new}, |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
183 | {NULL, NULL} |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
184 | }; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
185 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
186 | int event_buffer_register(lua_State* L) { |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
187 | luaL_newmetatable(L, EVENT_BUFFER_MT); |
27
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
188 | lua_pushcfunction(L, event_buffer_gc); |
0d82e4f49a56
Updated changelog. event_buffer learned `get_data`,`length`,`drain`,`close`,`new`
Thomas Harning Jr <harningt@gmail.com>
parents:
26
diff
changeset
|
189 | lua_setfield(L, -2, "__gc"); |
33
0d750f302d66
event_buffer learned to manage '#' and the __tostring metafield
Thomas Harning Jr <harningt@gmail.com>
parents:
32
diff
changeset
|
190 | lua_pushcfunction(L, event_buffer_get_length); |
0d750f302d66
event_buffer learned to manage '#' and the __tostring metafield
Thomas Harning Jr <harningt@gmail.com>
parents:
32
diff
changeset
|
191 | lua_setfield(L, -2, "__len"); |
0d750f302d66
event_buffer learned to manage '#' and the __tostring metafield
Thomas Harning Jr <harningt@gmail.com>
parents:
32
diff
changeset
|
192 | lua_pushcfunction(L, event_buffer_get_data); |
0d750f302d66
event_buffer learned to manage '#' and the __tostring metafield
Thomas Harning Jr <harningt@gmail.com>
parents:
32
diff
changeset
|
193 | lua_setfield(L, -2, "__tostring"); |
26
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
194 | lua_newtable(L); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
195 | luaL_register(L, NULL, buffer_funcs); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
196 | lua_setfield(L, -2, "__index"); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
197 | lua_pop(L, 1); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
198 | |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
199 | luaL_register(L, "luaevent.core.buffer", funcs); |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
200 | return 0; |
a117895e867c
Added event_buffer object + 'add' functionality
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
201 | } |