util-src/ringbuffer.c
changeset 8546 0e1d8f2f02bf
parent 7972 1c6a07606309
child 8547 e7214441523b
equal deleted inserted replaced
8545:8c39ec8e6018 8546: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