]> mj.ucw.cz Git - libucw.git/blobdiff - lib/ff-string.c
Merge with git+ssh://cvs.ucw.cz/projects/sherlock/GIT/sherlock.git#dev-sorter
[libucw.git] / lib / ff-string.c
index c0b85da1d460ee3479924686cc40971cffb8b9cd..c8fa0fb35b48cc06a4bc44c6ee4280af5587f2ff 100644 (file)
@@ -11,6 +11,7 @@
 #include "lib/lib.h"
 #include "lib/fastbuf.h"
 #include "lib/mempool.h"
 #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)
 
 byte *                                 /* Non-standard */
 bgets(struct fastbuf *f, byte *b, uns l)
@@ -79,15 +80,16 @@ exit:
 }
 
 uns
 }
 
 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;
   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);
   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)
         {
        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;
          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;
        }
       else
        buf_len -= cnt;
@@ -171,7 +175,7 @@ bgets_mp(struct fastbuf *f, struct mempool *mp)
        buf_len -= cnt;
     }
   while (src_len);
        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;
   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);
        buf_len -= cnt;
     }
   while (s->src_len);
-exit:  
+exit:
   *buf = 0;
   s->cur_len = 0;
 }
   *buf = 0;
   s->cur_len = 0;
 }