equal
deleted
inserted
replaced
37 |
37 |
38 if(b->rpos == b->wpos) { /* empty */ |
38 if(b->rpos == b->wpos) { /* empty */ |
39 return 0; |
39 return 0; |
40 } |
40 } |
41 |
41 |
|
42 /* look for a matching first byte */ |
42 for(i = 0; i <= b->blen - l; i++) { |
43 for(i = 0; i <= b->blen - l; i++) { |
43 if(b->buffer[(b->rpos + i) % b->alen] == *s) { |
44 if(b->buffer[(b->rpos + i) % b->alen] == *s) { |
44 m = 1; |
45 m = 1; |
45 |
46 |
|
47 /* check if the following byte also match */ |
46 for(j = 1; j < l; j++) |
48 for(j = 1; j < l; j++) |
47 if(b->buffer[(b->rpos + i + j) % b->alen] != s[j]) { |
49 if(b->buffer[(b->rpos + i + j) % b->alen] != s[j]) { |
48 m = 0; |
50 m = 0; |
49 break; |
51 break; |
50 } |
52 } |
56 } |
58 } |
57 |
59 |
58 return 0; |
60 return 0; |
59 } |
61 } |
60 |
62 |
|
63 /* |
|
64 * Find first position of a substring in buffer |
|
65 * (buffer, string) -> number |
|
66 */ |
61 int rb_find(lua_State *L) { |
67 int rb_find(lua_State *L) { |
62 size_t l, m; |
68 size_t l, m; |
63 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
69 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
64 const char *s = luaL_checklstring(L, 2, &l); |
70 const char *s = luaL_checklstring(L, 2, &l); |
65 m = find(b, s, l); |
71 m = find(b, s, l); |
70 } |
76 } |
71 |
77 |
72 return 0; |
78 return 0; |
73 } |
79 } |
74 |
80 |
|
81 /* |
|
82 * Read bytes from buffer |
|
83 * (buffer, number, boolean?) -> string |
|
84 */ |
75 int rb_read(lua_State *L) { |
85 int rb_read(lua_State *L) { |
76 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
86 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
77 size_t r = luaL_checkinteger(L, 2); |
87 size_t r = luaL_checkinteger(L, 2); |
78 int peek = lua_toboolean(L, 3); |
88 int peek = lua_toboolean(L, 3); |
79 |
89 |
81 lua_pushnil(L); |
91 lua_pushnil(L); |
82 return 1; |
92 return 1; |
83 } |
93 } |
84 |
94 |
85 if((b->rpos + r) > b->alen) { |
95 if((b->rpos + r) > b->alen) { |
|
96 /* Substring wraps around to the beginning of the buffer */ |
86 lua_pushlstring(L, &b->buffer[b->rpos], b->alen - b->rpos); |
97 lua_pushlstring(L, &b->buffer[b->rpos], b->alen - b->rpos); |
87 lua_pushlstring(L, b->buffer, r - (b->alen - b->rpos)); |
98 lua_pushlstring(L, b->buffer, r - (b->alen - b->rpos)); |
88 lua_concat(L, 2); |
99 lua_concat(L, 2); |
89 } else { |
100 } else { |
90 lua_pushlstring(L, &b->buffer[b->rpos], r); |
101 lua_pushlstring(L, &b->buffer[b->rpos], r); |
97 } |
108 } |
98 |
109 |
99 return 1; |
110 return 1; |
100 } |
111 } |
101 |
112 |
|
113 /* |
|
114 * Read buffer until first occurence of a substring |
|
115 * (buffer, string) -> string |
|
116 */ |
102 int rb_readuntil(lua_State *L) { |
117 int rb_readuntil(lua_State *L) { |
103 size_t l, m; |
118 size_t l, m; |
104 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
119 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
105 const char *s = luaL_checklstring(L, 2, &l); |
120 const char *s = luaL_checklstring(L, 2, &l); |
106 m = find(b, s, l); |
121 m = find(b, s, l); |
112 } |
127 } |
113 |
128 |
114 return 0; |
129 return 0; |
115 } |
130 } |
116 |
131 |
|
132 /* |
|
133 * Write bytes into the buffer |
|
134 * (buffer, string) -> integer |
|
135 */ |
117 int rb_write(lua_State *L) { |
136 int rb_write(lua_State *L) { |
118 size_t l, w = 0; |
137 size_t l, w = 0; |
119 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
138 ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
120 const char *s = luaL_checklstring(L, 2, &l); |
139 const char *s = luaL_checklstring(L, 2, &l); |
121 |
140 |