fehQlibs 31
Qlibs
Loading...
Searching...
No Matches
buffer.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "buffer.h"
3#include "str.h"
4#include "byte.h"
5#include "error.h"
6
13void buffer_init(buffer *s,ssize_t (*op)(int, char *,size_t),int fd,char *buf,size_t len)
14{
15 s->x = buf;
16 s->fd = fd;
17 s->op = op;
18 s->p = 0;
19 s->n = len;
20}
21
22ssize_t buffer_unixread(int fd,char *buf,size_t len)
23{
24 return (ssize_t) read(fd,(void *)buf,len);
25}
26
27ssize_t buffer_unixwrite(int fd,char *buf,size_t len)
28{
29 return (ssize_t) write(fd,(const void *)buf,len);
30}
31
35
39
43
47
51
55
56int buffer_copy(buffer *bout,buffer *bin)
57{
58 size_t n;
59 char *x;
60
61 for (;;) {
62 n = buffer_feed(bin);
63 if (n < 0) return -2;
64 if (!n) return 0;
65 x = buffer_PEEK(bin);
66 if (buffer_put(bout,x,n) == -1) return -3;
67 buffer_SEEK(bin,n);
68 }
69}
70
71static int oneread(ssize_t (*op)(int, char *,size_t),int fd,char *buf,size_t len)
72{
73 int r;
74
75 for (;;) {
76 r = op(fd,buf,len);
77 if (r == -1) if (errno == EINTR) continue;
78 return r;
79 }
80}
81
82static int getthis(buffer *s,char *buf,size_t len)
83{
84 if (len > s->p) len = s->p;
85 s->p -= len;
86 byte_copy(buf,len,s->x + s->n);
87 s->n += len;
88 return len;
89}
90
92{
93 int r;
94
95 if (s->p) return s->p;
96 r = oneread(s->op,s->fd,s->x,s->n);
97 if (r <= 0) return r;
98 s->p = r;
99 s->n -= r;
100 if (s->n > 0) byte_copyr(s->x + s->n,r,s->x);
101 return r;
102}
103
104int buffer_bget(buffer *s,char *buf,size_t len)
105{
106 int r;
107
108 if (s->p > 0) return getthis(s,buf,len);
109 if (s->n <= len) return oneread(s->op,s->fd,buf,s->n);
110 r = buffer_feed(s);
111 if (r <= 0) return r;
112 return getthis(s,buf,len);
113}
114
115int buffer_get(buffer *s,char *buf,size_t len)
116{
117 int r;
118
119 if (s->p > 0) return getthis(s,buf,len);
120 if (s->n <= len) return oneread(s->op,s->fd,buf,len);
121 r = buffer_feed(s);
122 if (r <= 0) return r;
123 return getthis(s,buf,len);
124}
125
126int buffer_gets(buffer *s,char *buf,size_t len,char c)
127{
128 int r;
129 char *x;
130 int pos = 0;
131
132 while (len) {
133 r = buffer_feed(s);
134 if (r <= 0) return r;
135 x = buffer_PEEK(s);
136 r = byte_chr(x,r,c);
137 if (r == 0) {
138 buffer_SEEK(s,1);
139 break;
140 }
141 if (r > len) r = len;
142 byte_copy(buf,r,x);
143 buffer_SEEK(s,r);
144 buf += r; // advance buffer position
145 len -= r;
146 pos += r;
147 }
148 return pos;
149}
150
151
153{
154 return s->x + s->n;
155}
156
157void buffer_seek(buffer *s,size_t len)
158{
159 s->n += len;
160 s->p -= len;
161}
162
163static int allwrite(ssize_t (*op)(int, char *,size_t),int fd,const char *buf,size_t len)
164{
165 int w;
166
167 while (len) {
168 w = op(fd,(char *)buf,len);
169 if (w == -1) {
170 if (errno == EINTR) continue;
171 return -1; /* note that some data may have been written */
172 }
173 if (w == 0) /* luser's fault */
174 ;
175 buf += w;
176 len -= w;
177 }
178 return 0;
179}
180
182{
183 int p;
184
185 p = s->p;
186 if (!p) return 0;
187 s->p = 0;
188 return allwrite(s->op,s->fd,s->x,p);
189}
190
191int buffer_putalign(buffer *s,const char *buf,size_t len)
192{
193 size_t n;
194
195 while (len > (n = s->n - s->p)) {
196 byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
197 if (buffer_flush(s) == -1) return -1;
198 }
199 /* now len <= s->n - s->p */
200 byte_copy(s->x + s->p,len,buf);
201 s->p += len;
202 return 0;
203}
204
205int buffer_put(buffer *s,const char *buf,size_t len)
206{
207 size_t n;
208
209 n = s->n;
210 if (len > n - s->p) {
211 if (buffer_flush(s) == -1) return -1;
212 /* now s->p == 0 */
213 if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
214 while (len > s->n) {
215 if (n > len) n = len;
216 if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
217 buf += n;
218 len -= n;
219 }
220 }
221 /* now len <= s->n - s->p */
222 byte_copy(s->x + s->p,len,buf);
223 s->p += len;
224 return 0;
225}
226
227int buffer_putflush(buffer *s,const char *buf,size_t len)
228{
229 if (buffer_flush(s) == -1) return -1;
230 return allwrite(s->op,s->fd,buf,len);
231}
232
233int buffer_putsalign(buffer *s,const char *buf)
234{
235 return buffer_putalign(s,buf,str_len(buf));
236}
237
238int buffer_puts(buffer *s,const char *buf)
239{
240 return buffer_put(s,buf,str_len(buf));
241}
242
243int buffer_putsflush(buffer *s,const char *buf)
244{
245 return buffer_putflush(s,buf,str_len(buf));
246}
char buffer_2_space[BUFFER_OUTSIZE]
Definition: buffer.c:40
char buffer_0_small[BUFFER_SMALL]
Definition: buffer.c:44
int buffer_putalign(buffer *s, const char *buf, size_t len)
Definition: buffer.c:191
buffer * buffer_1small
Definition: buffer.c:50
int buffer_get(buffer *s, char *buf, size_t len)
Definition: buffer.c:115
ssize_t buffer_unixread(int fd, char *buf, size_t len)
Definition: buffer.c:22
int buffer_putsflush(buffer *s, const char *buf)
Definition: buffer.c:243
buffer * buffer_1
Definition: buffer.c:38
void buffer_init(buffer *s, ssize_t(*op)(int, char *, size_t), int fd, char *buf, size_t len)
Definition: buffer.c:13
char buffer_2_small[BUFFER_SMALL]
Definition: buffer.c:52
int buffer_putflush(buffer *s, const char *buf, size_t len)
Definition: buffer.c:227
buffer * buffer_2small
Definition: buffer.c:54
int buffer_copy(buffer *bout, buffer *bin)
Definition: buffer.c:56
char buffer_1_space[BUFFER_OUTSIZE]
Definition: buffer.c:36
int buffer_puts(buffer *s, const char *buf)
Definition: buffer.c:238
buffer * buffer_2
Definition: buffer.c:42
buffer * buffer_0small
Definition: buffer.c:46
char buffer_0_space[BUFFER_INSIZE]
Definition: buffer.c:32
int buffer_gets(buffer *s, char *buf, size_t len, char c)
Definition: buffer.c:126
char buffer_1_small[BUFFER_SMALL]
Definition: buffer.c:48
int buffer_flush(buffer *s)
Definition: buffer.c:181
int buffer_bget(buffer *s, char *buf, size_t len)
Definition: buffer.c:104
void buffer_seek(buffer *s, size_t len)
Definition: buffer.c:157
ssize_t buffer_unixwrite(int fd, char *buf, size_t len)
Definition: buffer.c:27
int buffer_put(buffer *s, const char *buf, size_t len)
Definition: buffer.c:205
int buffer_feed(buffer *s)
Definition: buffer.c:91
int buffer_putsalign(buffer *s, const char *buf)
Definition: buffer.c:233
char * buffer_peek(buffer *s)
Definition: buffer.c:152
buffer * buffer_0
Definition: buffer.c:34
int read(int _str, void *_buf, int _b)
unsigned int str_len(const char *)
Definition: str.c:68
unsigned int byte_chr(char *, unsigned int, int)
Definition: byte.c:9
void byte_copy(char *, unsigned int, const char *)
Definition: byte.c:20
void byte_copyr(char *, unsigned int, const char *)
Definition: byte.c:30
#define BUFFER_INSIZE
Definition: buffer.h:15
#define BUFFER_OUTSIZE
Definition: buffer.h:16
#define BUFFER_INIT(op, fd, buf, len)
Definition: buffer.h:13
#define buffer_SEEK(s, len)
Definition: buffer.h:44
#define BUFFER_SMALL
Definition: buffer.h:14
#define buffer_PEEK(s)
Definition: buffer.h:43
Definition: buffer.h:5
ssize_t(* op)(int, char *, size_t)
Definition: buffer.h:10
size_t n
Definition: buffer.h:8
int fd
Definition: buffer.h:9
size_t p
Definition: buffer.h:7
char * x
Definition: buffer.h:6