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