Mercurial > hg > cdb
annotate buffer_get.c @ 8:23c546c01f17
fix clean target,
add it_production (now default) and it_debug targets
| author | Henry S. Thompson <ht@inf.ed.ac.uk> |
|---|---|
| date | Wed, 29 Jan 2025 18:46:57 +0000 |
| parents | 2cb46628feec |
| children | 3bfef1f22a97 |
| rev | line source |
|---|---|
|
0
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
1 #include "buffer.h" |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
2 #include "byte.h" |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
3 #include "error.h" |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
4 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
5 static int oneread(int (*op)(),int fd,char *buf,unsigned int len) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
6 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
7 int r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
8 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
9 for (;;) { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
10 r = op(fd,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
11 if (r == -1) if (errno == error_intr) continue; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
12 return r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
13 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
14 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
15 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
16 static int getthis(buffer *s,char *buf,unsigned int len) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
17 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
18 if (len > s->p) len = s->p; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
19 s->p -= len; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
20 byte_copy(buf,len,s->x + s->n); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
21 s->n += len; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
22 return len; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
23 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
24 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
25 int buffer_feed(buffer *s) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
26 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
27 int r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
28 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
29 if (s->p) return s->p; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
30 r = oneread(s->op,s->fd,s->x,s->n); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
31 if (r <= 0) return r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
32 s->p = r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
33 s->n -= r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
34 if (s->n > 0) byte_copyr(s->x + s->n,r,s->x); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
35 return r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
36 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
37 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
38 int buffer_bget(buffer *s,char *buf,unsigned int len) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
39 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
40 int r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
41 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
42 if (s->p > 0) return getthis(s,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
43 if (s->n <= len) return oneread(s->op,s->fd,buf,s->n); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
44 r = buffer_feed(s); if (r <= 0) return r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
45 return getthis(s,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
46 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
47 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
48 int buffer_get(buffer *s,char *buf,unsigned int len) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
49 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
50 int r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
51 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
52 if (s->p > 0) return getthis(s,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
53 if (s->n <= len) return oneread(s->op,s->fd,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
54 r = buffer_feed(s); if (r <= 0) return r; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
55 return getthis(s,buf,len); |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
56 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
57 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
58 char *buffer_peek(buffer *s) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
59 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
60 return s->x + s->n; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
61 } |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
62 |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
63 void buffer_seek(buffer *s,unsigned int len) |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
64 { |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
65 s->n += len; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
66 s->p -= len; |
|
2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff
changeset
|
67 } |
