struct msblock {
struct msblock *next;
- sh_off_t pos;
+ ucw_off_t pos;
unsigned size;
byte data[0];
};
struct memstream *stream;
struct msblock *block;
};
-#define FB_MEM(f) ((struct fb_mem *)(f)->is_fastbuf)
+#define FB_MEM(f) ((struct fb_mem *)(f))
static int
fbmem_refill(struct fastbuf *f)
}
static int
-fbmem_seek(struct fastbuf *f, sh_off_t pos, int whence)
+fbmem_seek(struct fastbuf *f, ucw_off_t pos, int whence)
{
struct memstream *m = FB_MEM(f)->stream;
struct msblock *b;
/* Yes, this is linear. But considering the average number of buckets, it doesn't matter. */
for (b=m->first; b; b=b->next)
{
- if (pos <= b->pos + (sh_off_t)b->size) /* <=, because we need to be able to seek just after file end */
+ if (pos <= b->pos + (ucw_off_t)b->size) /* <=, because we need to be able to seek just after file end */
{
- f->buffer = b->data;
+ f->buffer = f->bstop = b->data;
f->bptr = b->data + (pos - b->pos);
- f->bufend = f->bstop = b->data + b->size;
- f->pos = b->pos + b->size;
+ f->bufend = b->data + b->size;
+ f->pos = b->pos;
FB_MEM(f)->block = b;
return 1;
}
if (!m->first && !pos)
{
/* Seeking to offset 0 in an empty file needs an exception */
- f->buffer = f->bptr = f->bufend = NULL;
+ f->buffer = f->bptr = f->bstop = f->bufend = NULL;
f->pos = 0;
FB_MEM(f)->block = NULL;
return 1;
}
- die("fbmem_seek to invalid offset");
+ bthrow(f, "seek", "fbmem_seek to an invalid offset");
}
static void
printf("<!%d>", (int)btell(r));
while ((t = bgetc(r)) >= 0)
putchar(t);
+ putchar('\n');
fflush(stdout);
bclose(r);
return 0;