2 * UCW Library -- Fast Buffered I/O: Strings
4 * (c) 1997--2006 Martin Mares <mj@ucw.cz>
5 * (c) 2006 Pavel Charvat <pchar@ucw.cz>
7 * This software may be freely distributed and used according to the terms
8 * of the GNU Lesser General Public License.
12 #include "lib/fastbuf.h"
13 #include "lib/mempool.h"
15 byte * /* Non-standard */
16 bgets(struct fastbuf *f, byte *b, uns l)
26 if (k == '\n' || k < 0)
34 die("%s: Line too long", f->name);
38 bgets_nodie(struct fastbuf *f, byte *b, uns l)
49 if (k == '\n' || k < 0)
61 bgets_bb(struct fastbuf *f, bb_t *bb)
63 byte *buf = bb->ptr, *src;
64 uns len = 0, buf_len = bb->len, src_len = bdirect_read_prepare(f, &src);
67 uns cnt = MIN(src_len, buf_len);
68 for (uns i = cnt; i--;)
79 src_len = bdirect_read_prepare(f, &src);
84 bb_do_grow(bb, len + 1);
86 buf_len = bb->len - len;
96 bgets_mp(struct mempool *mp, struct fastbuf *f)
98 #define BLOCK_SIZE 4096
101 byte data[BLOCK_SIZE];
106 struct block *new_block = alloca(sizeof(struct block));
107 byte *b = new_block->data, *e = b + BLOCK_SIZE;
111 if (k == '\n' || k < 0)
113 uns len = b - new_block->data;
114 byte *result = mp_alloc(mp, sum + len + 1) + sum;
116 memcpy(result, new_block->data, len);
119 result -= BLOCK_SIZE;
120 memcpy(result, blocks->data, BLOCK_SIZE);
121 blocks = blocks->prev;
127 new_block->prev = blocks;
135 bgets_stk_step(struct fastbuf *f, byte *old_buf, byte *buf, uns len)
140 memcpy(buf, old_buf, len);
146 if (k == '\n' || k < 0)
154 bgets0(struct fastbuf *f, byte *b, uns l)
172 die("%s: Line too long", f->name);