2 * Sherlock Library -- Fast Buffered I/O on Memory Streams
4 * (c) 1997--2000 Martin Mares <mj@ucw.cz>
8 #include "lib/fastbuf.h"
16 struct msblock *first;
26 fbmem_refill(struct fastbuf *f)
28 struct memstream *s = f->lldata;
29 struct msblock *b = f->llpos;
37 else if (f->buffer == b->data && f->bstop < b->data + b->size)
39 f->bstop = b->data + b->size;
49 f->buffer = f->bptr = b->data;
50 f->bufend = f->bstop = b->data + b->size;
56 fbmem_spout(struct fastbuf *f)
58 struct memstream *s = f->lldata;
59 struct msblock *b = f->llpos;
64 b->size = f->bptr - b->data;
65 if (b->size < s->blocksize)
69 bb = xmalloc(sizeof(struct msblock) + s->blocksize);
76 f->buffer = f->bptr = f->bstop = bb->data;
77 f->bufend = bb->data + s->blocksize;
82 fbmem_seek(struct fastbuf *f, sh_off_t pos, int whence)
84 struct memstream *m = f->lldata;
88 if (whence != SEEK_SET)
89 die("fbmem_seek: only SEEK_SET supported");
90 for (b=m->first; b; b=b->next)
92 if ((unsigned) pos <= p + b->size) /* <=, because we need to be able to seek just after file end */
96 f->bptr = b->data + (pos - p);
97 f->bufend = f->bstop = b->data + b->size;
103 die("fbmem_seek to invalid offset");
107 fbmem_close(struct fastbuf *f)
109 struct memstream *m = f->lldata;
124 fbmem_create(unsigned blocksize)
126 struct fastbuf *f = xmalloc(sizeof(struct fastbuf));
127 struct memstream *m = xmalloc(sizeof(struct memstream));
129 m->blocksize = blocksize;
133 f->bptr = f->bstop = f->buffer = f->bufend = NULL;
134 f->pos = f->fdpos = 0;
135 f->name = "<fbmem-write>";
138 f->spout = fbmem_spout;
140 f->close = fbmem_close;
145 fbmem_clone_read(struct fastbuf *b)
147 struct fastbuf *f = xmalloc(sizeof(struct fastbuf));
148 struct memstream *s = b->lldata;
153 f->bptr = f->bstop = f->buffer = f->bufend = NULL;
154 f->pos = f->fdpos = 0;
155 f->name = "<fbmem-read>";
158 f->refill = fbmem_refill;
160 f->seek = fbmem_seek;
161 f->close = fbmem_close;
169 struct fastbuf *w, *r;
173 r = fbmem_clone_read(w);
174 bwrite(w, "12345", 5);
175 bwrite(w, "12345", 5);
176 printf("<%d>", btell(w));
178 printf("<%d>", btell(w));
179 printf("<%d>", btell(r));
180 while ((t = bgetc(r)) >= 0)
182 printf("<%d>", btell(r));
183 bwrite(w, "12345", 5);
184 bwrite(w, "12345", 5);
185 printf("<%d>", btell(w));
188 printf("<!%d>", btell(r));
189 while ((t = bgetc(r)) >= 0)
192 printf("<!%d>", btell(r));
193 while ((t = bgetc(r)) >= 0)