X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Ffastbuf.c;h=a29dc30b370e8a5c2606eab15edb665b9746bbbb;hb=b1fd07e17d8b9041fd026385e51f273adb2bee5a;hp=b7be624b5645d5ac34e1e52ca83b1ce2a951be62;hpb=7de317f0204214032e41d210c8b4d01f7871342f;p=libucw.git diff --git a/lib/fastbuf.c b/lib/fastbuf.c index b7be624b..a29dc30b 100644 --- a/lib/fastbuf.c +++ b/lib/fastbuf.c @@ -1,7 +1,7 @@ /* * Sherlock Library -- Fast Buffered I/O * - * (c) 1997--2000 Martin Mares + * (c) 1997--2004 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -244,11 +244,11 @@ bgets(struct fastbuf *f, byte *b, uns l) int k; k = bgetc(f); - if (k == EOF) + if (k < 0) return NULL; while (b < e) { - if (k == '\n' || k == EOF) + if (k == '\n' || k < 0) { *b = 0; return b; @@ -259,6 +259,29 @@ bgets(struct fastbuf *f, byte *b, uns l) die("%s: Line too long", f->name); } +int +bgets_nodie(struct fastbuf *f, byte *b, uns l) +{ + byte *start = b; + byte *e = b + l - 1; + int k; + + k = bgetc(f); + if (k < 0) + return 0; + while (b < e) + { + if (k == '\n' || k < 0) + { + *b++ = 0; + return b - start; + } + *b++ = k; + k = bgetc(f); + } + return -1; +} + byte * bgets0(struct fastbuf *f, byte *b, uns l) { @@ -266,11 +289,11 @@ bgets0(struct fastbuf *f, byte *b, uns l) int k; k = bgetc(f); - if (k == EOF) + if (k < 0) return NULL; while (b < e) { - if (!k || k == EOF) + if (k <= 0) { *b = 0; return b; @@ -291,14 +314,19 @@ bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uns l) favail = bdirect_read_prepare(f, &fptr); if (!favail) - die("bbcopy: source exhausted"); + { + if (l == ~0U) + return; + die("bbcopy: source exhausted"); + } tavail = bdirect_write_prepare(t, &tptr); n = MIN(l, favail); n = MIN(n, tavail); memcpy(tptr, fptr, n); bdirect_read_commit(f, fptr + n); bdirect_write_commit(t, tptr + n); - l -= n; + if (l != ~0U) + l -= n; } } @@ -307,3 +335,38 @@ bconfig(struct fastbuf *f, uns item, int value) { return f->config ? f->config(f, item, value) : -1; } + +void +brewind(struct fastbuf *f) +{ + bflush(f); + bsetpos(f, 0); +} + +int +bskip(struct fastbuf *f, uns len) +{ + while (len) + { + byte *buf; + uns l = bdirect_read_prepare(f, &buf); + if (!l) + return 0; + l = MIN(l, len); + bdirect_read_commit(f, buf+l); + len -= l; + } + return 1; +} + +sh_off_t +bfilesize(struct fastbuf *f) +{ + if (!f) + return 0; + sh_off_t pos = btell(f); + bseek(f, 0, SEEK_END); + sh_off_t len = btell(f); + bsetpos(f, pos); + return len; +}