X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fff-string.c;h=c8fa0fb35b48cc06a4bc44c6ee4280af5587f2ff;hb=b7b9a3d3d56430caba2f41a2e9cae8ca87dce1d6;hp=c0b85da1d460ee3479924686cc40971cffb8b9cd;hpb=5a3a31413e9a65287c5e0bb8cf5ac3cdf93e74ee;p=libucw.git diff --git a/lib/ff-string.c b/lib/ff-string.c index c0b85da1..c8fa0fb3 100644 --- a/lib/ff-string.c +++ b/lib/ff-string.c @@ -11,6 +11,7 @@ #include "lib/lib.h" #include "lib/fastbuf.h" #include "lib/mempool.h" +#include "lib/bbuf.h" byte * /* Non-standard */ bgets(struct fastbuf *f, byte *b, uns l) @@ -79,15 +80,16 @@ exit: } uns -bgets_bb(struct fastbuf *f, bb_t *bb) +bgets_bb(struct fastbuf *f, struct bb_t *bb, uns limit) { + ASSERT(limit); byte *src; uns src_len = bdirect_read_prepare(f, &src); if (!src_len) return 0; bb_grow(bb, 1); byte *buf = bb->ptr; - uns len = 0, buf_len = bb->len; + uns len = 0, buf_len = MIN(bb->len, limit); do { uns cnt = MIN(src_len, buf_len); @@ -111,9 +113,11 @@ bgets_bb(struct fastbuf *f, bb_t *bb) src_len -= cnt; if (cnt == buf_len) { + if (unlikely(len == limit)) + die("%s: Line too long", f->name); bb_do_grow(bb, len + 1); buf = bb->ptr + len; - buf_len = bb->len - len; + buf_len = MIN(bb->len, limit) - len; } else buf_len -= cnt; @@ -171,7 +175,7 @@ bgets_mp(struct fastbuf *f, struct mempool *mp) buf_len -= cnt; } while (src_len); -exit: ; +exit: ; uns len = buf - new_block->data; byte *result = mp_alloc(mp, sum + len + 1) + sum; result[len] = 0; @@ -244,7 +248,7 @@ bgets_stk_step(struct bgets_stk_struct *s) buf_len -= cnt; } while (s->src_len); -exit: +exit: *buf = 0; s->cur_len = 0; }