fehQlibs 28
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
12
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 int 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
127{
128 return s->x + s->n;
129}
130
131void buffer_seek(buffer *s,size_t len)
132{
133 s->n += len;
134 s->p -= len;
135}
136
137static int allwrite(ssize_t (*op)(int, char *,size_t),int fd,const char *buf,size_t len)
138{
139 int w;
140
141 while (len) {
142 w = op(fd,buf,len);
143 if (w == -1) {
144 if (errno == EINTR) continue;
145 return -1; /* note that some data may have been written */
146 }
147 if (w == 0) /* luser's fault */
148 ;
149 buf += w;
150 len -= w;
151 }
152 return 0;
153}
154
156{
157 int p;
158
159 p = s->p;
160 if (!p) return 0;
161 s->p = 0;
162 return allwrite(s->op,s->fd,s->x,p);
163}
164
165int buffer_putalign(buffer *s,const char *buf,size_t len)
166{
167 unsigned int n;
168
169 while (len > (n = s->n - s->p)) {
170 byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
171 if (buffer_flush(s) == -1) return -1;
172 }
173 /* now len <= s->n - s->p */
174 byte_copy(s->x + s->p,len,buf);
175 s->p += len;
176 return 0;
177}
178
179int buffer_put(buffer *s,const char *buf,size_t len)
180{
181 unsigned int n;
182
183 n = s->n;
184 if (len > n - s->p) {
185 if (buffer_flush(s) == -1) return -1;
186 /* now s->p == 0 */
187 if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
188 while (len > s->n) {
189 if (n > len) n = len;
190 if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
191 buf += n;
192 len -= n;
193 }
194 }
195 /* now len <= s->n - s->p */
196 byte_copy(s->x + s->p,len,buf);
197 s->p += len;
198 return 0;
199}
200
201int buffer_putflush(buffer *s,const char *buf,size_t len)
202{
203 if (buffer_flush(s) == -1) return -1;
204 return allwrite(s->op,s->fd,buf,len);
205}
206
207int buffer_putsalign(buffer *s,const char *buf)
208{
209 return buffer_putalign(s,buf,str_len(buf));
210}
211
212int buffer_puts(buffer *s,const char *buf)
213{
214 return buffer_put(s,buf,str_len(buf));
215}
216
217int buffer_putsflush(buffer *s,const char *buf)
218{
219 return buffer_putflush(s,buf,str_len(buf));
220}
void byte_copy(void *, unsigned int, const void *)
Definition byte.c:20
void byte_copyr(void *, unsigned int, const void *)
Definition byte.c:30
buffer * buffer_1small
Definition buffer.c:50
ssize_t buffer_unixread(int, char *, size_t)
Definition buffer.c:22
#define BUFFER_INSIZE
Definition buffer.h:15
#define BUFFER_OUTSIZE
Definition buffer.h:16
ssize_t buffer_unixwrite(int, char *, size_t)
Definition buffer.c:27
buffer * buffer_1
Definition buffer.c:38
buffer * buffer_2small
Definition buffer.c:54
buffer * buffer_2
Definition buffer.c:42
buffer * buffer_0small
Definition buffer.c:46
#define BUFFER_INIT(op, fd, buf, len)
Definition buffer.h:13
#define buffer_SEEK(s, len)
Definition buffer.h:43
#define BUFFER_SMALL
Definition buffer.h:14
#define buffer_PEEK(s)
Definition buffer.h:42
buffer * buffer_0
Definition buffer.c:34
unsigned int str_len(const char *)
Definition str.c:68
int read(int _str, void *_buf, int _b)
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:165
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:217
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:201
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:212
char buffer_0_space[BUFFER_INSIZE]
Definition buffer.c:32
char buffer_1_small[BUFFER_SMALL]
Definition buffer.c:48
int buffer_flush(buffer *s)
Definition buffer.c:155
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:131
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:179
int buffer_feed(buffer *s)
Definition buffer.c:91
int buffer_putsalign(buffer *s, const char *buf)
Definition buffer.c:207
char * buffer_peek(buffer *s)
Definition buffer.c:126
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
unsigned int p
Definition buffer.h:7
char * x
Definition buffer.h:6