Software / code / prosody
Comparison
util-src/ringbuffer.c @ 8543:0e1d8f2f02bf
util.ringbuffer: Add various comments
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 24 Feb 2018 14:44:46 +0100 |
| parent | 7969:1c6a07606309 |
| child | 8544:e7214441523b |
comparison
equal
deleted
inserted
replaced
| 8542:8c39ec8e6018 | 8543:0e1d8f2f02bf |
|---|---|
| 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 |