src/event_buffer.c

changeset 37
b7351b503b4b
parent 36
139601546bd9
child 40
11810d219ddb
equal deleted inserted replaced
36:139601546bd9 37:b7351b503b4b
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);

mercurial