115 /* MAYBE: Could add caching */ |
115 /* MAYBE: Could add caching */ |
116 /* LUA: buffer:get_data |
116 /* LUA: buffer:get_data |
117 () - Returns all data in buffer |
117 () - Returns all data in buffer |
118 (len) - Returns data up to 'len' bytes long |
118 (len) - Returns data up to 'len' bytes long |
119 (begin,len) - Returns data beginning at 'begin' up to 'len' bytes long |
119 (begin,len) - Returns data beginning at 'begin' up to 'len' bytes long |
|
120 If begin < 0, wraps at data length |
|
121 ex: (-1, 1) returns last character |
|
122 (-2,2) returns last 2 chars [length meaning does not get inverted] |
120 */ |
123 */ |
121 static int event_buffer_get_data(lua_State* L) { |
124 static int event_buffer_get_data(lua_State* L) { |
122 le_buffer* buf = event_buffer_check(L, 1); |
125 le_buffer* buf = event_buffer_check(L, 1); |
123 int begin, len; |
126 int begin, len; |
124 switch(lua_gettop(L)) { |
127 switch(lua_gettop(L)) { |
133 if(len > EVBUFFER_LENGTH(buf->buffer)) |
136 if(len > EVBUFFER_LENGTH(buf->buffer)) |
134 len = EVBUFFER_LENGTH(buf->buffer); |
137 len = EVBUFFER_LENGTH(buf->buffer); |
135 break; |
138 break; |
136 case 3: |
139 case 3: |
137 default: |
140 default: |
|
141 /* - 1 to map it to Lua's 1-based indexing |
|
142 * If begin < 0 add length to cause position wrapping |
|
143 */ |
138 begin = luaL_checkinteger(L, 2); |
144 begin = luaL_checkinteger(L, 2); |
|
145 if(begin < 0) |
|
146 begin += EVBUFFER_LENGTH(buf->buffer); |
|
147 else |
|
148 begin--; |
139 len = luaL_checkinteger(L, 3); |
149 len = luaL_checkinteger(L, 3); |
|
150 /* If length is less than zero, capture entire remaining string */ |
|
151 |
|
152 if(len < 0) len = EVBUFFER_LENGTH(buf->buffer); |
140 if(begin > EVBUFFER_LENGTH(buf->buffer)) |
153 if(begin > EVBUFFER_LENGTH(buf->buffer)) |
141 begin = EVBUFFER_LENGTH(buf->buffer); |
154 begin = EVBUFFER_LENGTH(buf->buffer); |
142 if(begin + len > EVBUFFER_LENGTH(buf->buffer)) |
155 if(begin + len > EVBUFFER_LENGTH(buf->buffer)) |
143 len = EVBUFFER_LENGTH(buf->buffer) - begin; |
156 len = EVBUFFER_LENGTH(buf->buffer) - begin; |
144 break; |
157 break; |
148 } |
161 } |
149 |
162 |
150 /* LUA: buffer:readline() |
163 /* LUA: buffer:readline() |
151 Returns a line terminated by either '\r\n','\n\r' or '\r' or '\n' |
164 Returns a line terminated by either '\r\n','\n\r' or '\r' or '\n' |
152 Returns nil and leaves data alone if no terminator is found |
165 Returns nil and leaves data alone if no terminator is found |
153 TODO: Evaluate whether or not the newline is included |
166 Newline is not present in the captured string. |
154 */ |
167 */ |
155 static int event_buffer_readline(lua_State* L) { |
168 static int event_buffer_readline(lua_State* L) { |
156 le_buffer* buf = event_buffer_check(L, 1); |
169 le_buffer* buf = event_buffer_check(L, 1); |
157 char* line = evbuffer_readline(buf->buffer); |
170 char* line = evbuffer_readline(buf->buffer); |
158 if(!line) |
171 if(!line) |
162 return 1; |
175 return 1; |
163 } |
176 } |
164 |
177 |
165 /* LUA: buffer:drain(amt) |
178 /* LUA: buffer:drain(amt) |
166 Drains 'amt' bytes from the buffer |
179 Drains 'amt' bytes from the buffer |
|
180 If amt < 0, drains all data |
|
181 (Due to auto-casting to unsigned int and automatic capping) |
167 */ |
182 */ |
168 static int event_buffer_drain(lua_State* L) { |
183 static int event_buffer_drain(lua_State* L) { |
169 le_buffer* buf = event_buffer_check(L, 1); |
184 le_buffer* buf = event_buffer_check(L, 1); |
170 size_t len = luaL_checkinteger(L, 2); |
185 size_t len = luaL_checkinteger(L, 2); |
171 evbuffer_drain(buf->buffer, len); |
186 evbuffer_drain(buf->buffer, len); |