Software /
code /
prosody
Annotate
util-src/ringbuffer.c @ 7827:db15e9f6d77f
util.ringbuffer: Remove unused macros
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 22 Jan 2017 04:05:41 +0100 |
parent | 7818:54669df178c2 |
child | 7828:b4a08a514ebc |
rev | line source |
---|---|
7117
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 #include <stdlib.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 #include <unistd.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 #include <string.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 #include <stdio.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 #include <lua.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 #include <lauxlib.h> |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 typedef struct { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 size_t rpos; /* read position */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 size_t wpos; /* write position */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 size_t alen; /* allocated size */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 size_t blen; /* current content size */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 char* buffer; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 } ringbuffer; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 char readchar(ringbuffer* b) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 b->blen--; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 return b->buffer[(b->rpos++) % b->alen]; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 void writechar(ringbuffer* b, char c) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 b->blen++; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 b->buffer[(b->wpos++) % b->alen] = c; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 /* make sure position counters stay within the allocation */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 void modpos(ringbuffer* b) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 b->rpos = b->rpos % b->alen; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 b->wpos = b->wpos % b->alen; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 int find(ringbuffer* b, const char* s, int l) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 size_t i, j; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 int m; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 if(b->rpos == b->wpos) { /* empty */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 for(i = 0; i <= b->blen - l; i++) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 if(b->buffer[(b->rpos + i) % b->alen] == *s) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 m = 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 for(j = 1; j < l; j++) |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 if(b->buffer[(b->rpos + i + j) % b->alen] != s[j]) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 m = 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 break; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 if(m) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 return i + l; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 int rb_find(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 size_t l, m; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 const char* s = luaL_checklstring(L, 2, &l); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 m = find(b, s, l); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 if(m > 0) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 lua_pushinteger(L, m); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 int rb_read(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 int r = luaL_checkinteger(L, 2); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 int peek = lua_toboolean(L, 3); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 if(r > b->blen) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 lua_pushnil(L); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 if((b->rpos + r) > b->alen) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 lua_pushlstring(L, &b->buffer[b->rpos], b->alen - b->rpos); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 lua_pushlstring(L, b->buffer, r - (b->alen - b->rpos)); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 lua_concat(L, 2); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 } else { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 lua_pushlstring(L, &b->buffer[b->rpos], r); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 if(!peek) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 b->blen -= r; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 b->rpos += r; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 modpos(b); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 int rb_readuntil(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 size_t l, m; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 const char* s = luaL_checklstring(L, 2, &l); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 m = find(b, s, l); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 if(m > 0) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 lua_settop(L, 1); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 lua_pushinteger(L, m); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 return rb_read(L); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 int rb_write(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 size_t l, w = 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 const char* s = luaL_checklstring(L, 2, &l); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 /* Does `l` bytes fit? */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 if((l + b->blen) > b->alen) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 lua_pushnil(L); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 while(l-- > 0) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 writechar(b, *s++); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 w++; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 modpos(b); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 lua_pushinteger(L, w); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 int rb_tostring(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 lua_pushfstring(L, "ringbuffer: %p->%p %d/%d", b, b->buffer, b->blen, b->alen); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 int rb_length(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 lua_pushinteger(L, b->blen); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 int rb_size(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 lua_pushinteger(L, b->alen); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 int rb_free(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 lua_pushinteger(L, b->alen - b->blen); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 int rb_new(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 size_t size = luaL_optinteger(L, 1, sysconf(_SC_PAGESIZE)); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 ringbuffer* b = lua_newuserdata(L, sizeof(ringbuffer)); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 b->rpos = 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 b->wpos = 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 b->alen = size; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 b->blen = 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 b->buffer = malloc(size); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 if(b->buffer == NULL) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
177 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 luaL_getmetatable(L, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 lua_setmetatable(L, -2); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 int rb_gc(lua_State* L) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 ringbuffer* b = luaL_checkudata(L, 1, "ringbuffer_mt"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 if(b->buffer != NULL) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 free(b->buffer); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
193 return 0; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 int luaopen_util_ringbuffer(lua_State* L) { |
7818
54669df178c2
util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents:
7117
diff
changeset
|
197 #if (LUA_VERSION_NUM > 501) |
54669df178c2
util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents:
7117
diff
changeset
|
198 luaL_checkversion(L); |
54669df178c2
util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents:
7117
diff
changeset
|
199 #endif |
7117
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 if(luaL_newmetatable(L, "ringbuffer_mt")) { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 lua_pushcfunction(L, rb_tostring); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 lua_setfield(L, -2, "__tostring"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
203 lua_pushcfunction(L, rb_length); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 lua_setfield(L, -2, "__len"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 lua_pushcfunction(L, rb_gc); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 lua_setfield(L, -2, "__gc"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 lua_newtable(L); /* __index */ |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 { |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
210 lua_pushcfunction(L, rb_find); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 lua_setfield(L, -2, "find"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 lua_pushcfunction(L, rb_read); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 lua_setfield(L, -2, "read"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 lua_pushcfunction(L, rb_readuntil); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 lua_setfield(L, -2, "readuntil"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 lua_pushcfunction(L, rb_write); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 lua_setfield(L, -2, "write"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
218 lua_pushcfunction(L, rb_size); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
219 lua_setfield(L, -2, "size"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 lua_pushcfunction(L, rb_length); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 lua_setfield(L, -2, "length"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 lua_pushcfunction(L, rb_free); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 lua_setfield(L, -2, "free"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 lua_setfield(L, -2, "__index"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 } |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 lua_newtable(L); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 lua_pushcfunction(L, rb_new); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 lua_setfield(L, -2, "new"); |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 return 1; |
2b4432cc9c29
Add util.ringbuffer, a ringbuffer with a file handle like interface
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
232 } |