X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffastbuf.c;h=8df905487ed42ff9bd371aaa222b8625a3fc21c7;hb=23552983305e667eeb772406d1745ab7b865855e;hp=5b394cf1c867c2f755b07db788a562ad3e3fb84c;hpb=417d2511bb77568e041fef8ea14406b265124066;p=libucw.git diff --git a/lib/fastbuf.c b/lib/fastbuf.c index 5b394cf1..8df90548 100644 --- a/lib/fastbuf.c +++ b/lib/fastbuf.c @@ -87,13 +87,19 @@ void bputc_slow(struct fastbuf *f, byte c) *f->bptr++ = c; } -word bgetw_slow(struct fastbuf *f) +int bgetw_slow(struct fastbuf *f) { - word w = bgetc_slow(f); + int w1, w2; + w1 = bgetc_slow(f); + if (w1 < 0) + return w1; + w2 = bgetc_slow(f); + if (w2 < 0) + return w2; #ifdef CPU_BIG_ENDIAN - return (w << 8) | bgetc_slow(f); + return (w1 << 8) | w2; #else - return w | (bgetc_slow(f) << 8); + return w1 | (w2 << 8); #endif } @@ -187,7 +193,7 @@ void bput5_slow(struct fastbuf *f, u64 o) #endif } -uns bread_slow(struct fastbuf *f, void *b, uns l) +uns bread_slow(struct fastbuf *f, void *b, uns l, uns check) { uns total = 0; while (l) @@ -209,6 +215,8 @@ uns bread_slow(struct fastbuf *f, void *b, uns l) l -= k; total += k; } + if (check && total && l) + die("breadb: short read"); return total; } @@ -254,6 +262,28 @@ bgets(struct fastbuf *f, byte *b, uns l) die("%s: Line too long", f->name); } +byte * +bgets0(struct fastbuf *f, byte *b, uns l) +{ + byte *e = b + l - 1; + int k; + + k = bgetc(f); + if (k == EOF) + return NULL; + while (b < e) + { + if (!k || k == EOF) + { + *b = 0; + return b; + } + *b++ = k; + k = bgetc(f); + } + die("%s: Line too long", f->name); +} + int bdirect_read(struct fastbuf *f, byte **buf) {