From: Martin Mares Date: Wed, 17 May 2006 10:40:34 +0000 (+0200) Subject: Split fastbuf.c to three parts. X-Git-Tag: holmes-import~641^2~14 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=35ec1bb7d7bbab61494b654ec0433c38bad0a2ff;p=libucw.git Split fastbuf.c to three parts. --- diff --git a/lib/Makefile b/lib/Makefile index 0991fc99..ae6cd736 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -14,7 +14,7 @@ LIBUCW_MODS= \ conf-alloc conf-dump conf-input conf-intr conf-journal conf-parse conf-section \ ipaccess \ profile \ - fastbuf ff-printf ff-utf8 \ + fastbuf ff-binary ff-string ff-printf ff-utf8 \ fb-file carefulio fb-mem fb-temp fb-mmap fb-limfd fb-buffer fb-grow \ str_ctype str_upper str_lower unicode-utf8 stkstring \ wildmatch wordsplit ctmatch patimatch patmatch regex \ diff --git a/lib/fastbuf.c b/lib/fastbuf.c index 4c5ec5cd..980d53aa 100644 --- a/lib/fastbuf.c +++ b/lib/fastbuf.c @@ -1,7 +1,7 @@ /* * UCW Library -- Fast Buffered I/O * - * (c) 1997--2005 Martin Mares + * (c) 1997--2006 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -9,7 +9,6 @@ #include "lib/lib.h" #include "lib/fastbuf.h" -#include "lib/mempool.h" #include @@ -85,112 +84,6 @@ void bputc_slow(struct fastbuf *f, uns c) *f->bptr++ = c; } -int bgetw_slow(struct fastbuf *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 (w1 << 8) | w2; -#else - return w1 | (w2 << 8); -#endif -} - -u32 bgetl_slow(struct fastbuf *f) -{ - u32 l = bgetc_slow(f); -#ifdef CPU_BIG_ENDIAN - l = (l << 8) | bgetc_slow(f); - l = (l << 8) | bgetc_slow(f); - return (l << 8) | bgetc_slow(f); -#else - l = (bgetc_slow(f) << 8) | l; - l = (bgetc_slow(f) << 16) | l; - return (bgetc_slow(f) << 24) | l; -#endif -} - -u64 bgetq_slow(struct fastbuf *f) -{ - u32 l, h; -#ifdef CPU_BIG_ENDIAN - h = bgetl_slow(f); - l = bgetl_slow(f); -#else - l = bgetl_slow(f); - h = bgetl_slow(f); -#endif - return ((u64) h << 32) | l; -} - -u64 bget5_slow(struct fastbuf *f) -{ - u32 l, h; -#ifdef CPU_BIG_ENDIAN - h = bgetc_slow(f); - l = bgetl_slow(f); -#else - l = bgetl_slow(f); - h = bgetc_slow(f); -#endif - return ((u64) h << 32) | l; -} - -void bputw_slow(struct fastbuf *f, uns w) -{ -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, w >> 8); - bputc_slow(f, w); -#else - bputc_slow(f, w); - bputc_slow(f, w >> 8); -#endif -} - -void bputl_slow(struct fastbuf *f, u32 l) -{ -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, l >> 24); - bputc_slow(f, l >> 16); - bputc_slow(f, l >> 8); - bputc_slow(f, l); -#else - bputc_slow(f, l); - bputc_slow(f, l >> 8); - bputc_slow(f, l >> 16); - bputc_slow(f, l >> 24); -#endif -} - -void bputq_slow(struct fastbuf *f, u64 q) -{ -#ifdef CPU_BIG_ENDIAN - bputl_slow(f, q >> 32); - bputl_slow(f, q); -#else - bputl_slow(f, q); - bputl_slow(f, q >> 32); -#endif -} - -void bput5_slow(struct fastbuf *f, u64 o) -{ - u32 hi = o >> 32; - u32 low = o; -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, hi); - bputl_slow(f, low); -#else - bputl_slow(f, low); - bputc_slow(f, hi); -#endif -} - uns bread_slow(struct fastbuf *f, void *b, uns l, uns check) { uns total = 0; @@ -238,166 +131,6 @@ void bwrite_slow(struct fastbuf *f, void *b, uns l) } } -byte * /* Non-standard */ -bgets(struct fastbuf *f, byte *b, uns l) -{ - byte *e = b + l - 1; - int k; - - k = bgetc(f); - if (k < 0) - return NULL; - while (b < e) - { - if (k == '\n' || k < 0) - { - *b = 0; - return b; - } - *b++ = k; - k = bgetc(f); - } - 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; -} - -uns -bgets_bb(struct fastbuf *f, bb_t *bb) -{ - byte *buf = bb->ptr, *src; - uns len = 0, buf_len = bb->len, src_len = bdirect_read_prepare(f, &src); - while (src_len) - { - uns cnt = MIN(src_len, buf_len); - for (uns i = cnt; i--;) - { - if (*src == '\n') - { - *buf = 0; - return buf - bb->ptr; - } - *buf++ = *src++; - } - len += cnt; - if (cnt == src_len) - src_len = bdirect_read_prepare(f, &src); - else - src_len -= cnt; - if (cnt == buf_len) - { - bb_do_grow(bb, len + 1); - buf = bb->ptr + len; - buf_len = bb->len - len; - } - else - buf_len -= cnt; - } - *buf = 0; - return len; -} - -byte * -bgets_mp(struct mempool *mp, struct fastbuf *f) -{ -#define BLOCK_SIZE 4096 - struct block { - struct block *prev; - byte data[BLOCK_SIZE]; - } *blocks = NULL; - uns sum = 0; - for (;;) - { - struct block *new_block = alloca(sizeof(struct block)); - byte *b = new_block->data, *e = b + BLOCK_SIZE; - while (b < e) - { - int k = bgetc(f); - if (k == '\n' || k < 0) - { - uns len = b - new_block->data; - byte *result = mp_alloc(mp, sum + len + 1) + sum; - result[len] = 0; - memcpy(result, new_block->data, len); - while (blocks) - { - result -= BLOCK_SIZE; - memcpy(result, blocks->data, BLOCK_SIZE); - blocks = blocks->prev; - } - return result; - } - *b++ = k; - } - new_block->prev = blocks; - blocks = new_block; - sum += BLOCK_SIZE; - } -#undef BLOCK_SIZE -} - -int -bgets_stk_step(struct fastbuf *f, byte *old_buf, byte *buf, uns len) -{ - if (old_buf) - { - len = len >> 1; - memcpy(buf, old_buf, len); - buf += len; - } - while (len--) - { - int k = bgetc(f); - if (k == '\n' || k < 0) - return *buf = 0; - *buf++ = k; - } - return 1; -} - -byte * -bgets0(struct fastbuf *f, byte *b, uns l) -{ - byte *e = b + l - 1; - int k; - - k = bgetc(f); - if (k < 0) - return NULL; - while (b < e) - { - if (k <= 0) - { - *b = 0; - return b; - } - *b++ = k; - k = bgetc(f); - } - die("%s: Line too long", f->name); -} - void bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uns l) { diff --git a/lib/ff-binary.c b/lib/ff-binary.c new file mode 100644 index 00000000..2d088ccf --- /dev/null +++ b/lib/ff-binary.c @@ -0,0 +1,117 @@ +/* + * UCW Library -- Fast Buffered I/O: Binary Numbers + * + * (c) 1997--2006 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. + */ + +#include "lib/lib.h" +#include "lib/fastbuf.h" + +int bgetw_slow(struct fastbuf *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 (w1 << 8) | w2; +#else + return w1 | (w2 << 8); +#endif +} + +u32 bgetl_slow(struct fastbuf *f) +{ + u32 l = bgetc_slow(f); +#ifdef CPU_BIG_ENDIAN + l = (l << 8) | bgetc_slow(f); + l = (l << 8) | bgetc_slow(f); + return (l << 8) | bgetc_slow(f); +#else + l = (bgetc_slow(f) << 8) | l; + l = (bgetc_slow(f) << 16) | l; + return (bgetc_slow(f) << 24) | l; +#endif +} + +u64 bgetq_slow(struct fastbuf *f) +{ + u32 l, h; +#ifdef CPU_BIG_ENDIAN + h = bgetl_slow(f); + l = bgetl_slow(f); +#else + l = bgetl_slow(f); + h = bgetl_slow(f); +#endif + return ((u64) h << 32) | l; +} + +u64 bget5_slow(struct fastbuf *f) +{ + u32 l, h; +#ifdef CPU_BIG_ENDIAN + h = bgetc_slow(f); + l = bgetl_slow(f); +#else + l = bgetl_slow(f); + h = bgetc_slow(f); +#endif + return ((u64) h << 32) | l; +} + +void bputw_slow(struct fastbuf *f, uns w) +{ +#ifdef CPU_BIG_ENDIAN + bputc_slow(f, w >> 8); + bputc_slow(f, w); +#else + bputc_slow(f, w); + bputc_slow(f, w >> 8); +#endif +} + +void bputl_slow(struct fastbuf *f, u32 l) +{ +#ifdef CPU_BIG_ENDIAN + bputc_slow(f, l >> 24); + bputc_slow(f, l >> 16); + bputc_slow(f, l >> 8); + bputc_slow(f, l); +#else + bputc_slow(f, l); + bputc_slow(f, l >> 8); + bputc_slow(f, l >> 16); + bputc_slow(f, l >> 24); +#endif +} + +void bputq_slow(struct fastbuf *f, u64 q) +{ +#ifdef CPU_BIG_ENDIAN + bputl_slow(f, q >> 32); + bputl_slow(f, q); +#else + bputl_slow(f, q); + bputl_slow(f, q >> 32); +#endif +} + +void bput5_slow(struct fastbuf *f, u64 o) +{ + u32 hi = o >> 32; + u32 low = o; +#ifdef CPU_BIG_ENDIAN + bputc_slow(f, hi); + bputl_slow(f, low); +#else + bputl_slow(f, low); + bputc_slow(f, hi); +#endif +} diff --git a/lib/ff-string.c b/lib/ff-string.c new file mode 100644 index 00000000..45fefb37 --- /dev/null +++ b/lib/ff-string.c @@ -0,0 +1,173 @@ +/* + * UCW Library -- Fast Buffered I/O: Strings + * + * (c) 1997--2006 Martin Mares + * (c) 2006 Pavel Charvat + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. + */ + +#include "lib/lib.h" +#include "lib/fastbuf.h" +#include "lib/mempool.h" + +byte * /* Non-standard */ +bgets(struct fastbuf *f, byte *b, uns l) +{ + byte *e = b + l - 1; + int k; + + k = bgetc(f); + if (k < 0) + return NULL; + while (b < e) + { + if (k == '\n' || k < 0) + { + *b = 0; + return b; + } + *b++ = k; + k = bgetc(f); + } + 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; +} + +uns +bgets_bb(struct fastbuf *f, bb_t *bb) +{ + byte *buf = bb->ptr, *src; + uns len = 0, buf_len = bb->len, src_len = bdirect_read_prepare(f, &src); + while (src_len) + { + uns cnt = MIN(src_len, buf_len); + for (uns i = cnt; i--;) + { + if (*src == '\n') + { + *buf = 0; + return buf - bb->ptr; + } + *buf++ = *src++; + } + len += cnt; + if (cnt == src_len) + src_len = bdirect_read_prepare(f, &src); + else + src_len -= cnt; + if (cnt == buf_len) + { + bb_do_grow(bb, len + 1); + buf = bb->ptr + len; + buf_len = bb->len - len; + } + else + buf_len -= cnt; + } + *buf = 0; + return len; +} + +byte * +bgets_mp(struct mempool *mp, struct fastbuf *f) +{ +#define BLOCK_SIZE 4096 + struct block { + struct block *prev; + byte data[BLOCK_SIZE]; + } *blocks = NULL; + uns sum = 0; + for (;;) + { + struct block *new_block = alloca(sizeof(struct block)); + byte *b = new_block->data, *e = b + BLOCK_SIZE; + while (b < e) + { + int k = bgetc(f); + if (k == '\n' || k < 0) + { + uns len = b - new_block->data; + byte *result = mp_alloc(mp, sum + len + 1) + sum; + result[len] = 0; + memcpy(result, new_block->data, len); + while (blocks) + { + result -= BLOCK_SIZE; + memcpy(result, blocks->data, BLOCK_SIZE); + blocks = blocks->prev; + } + return result; + } + *b++ = k; + } + new_block->prev = blocks; + blocks = new_block; + sum += BLOCK_SIZE; + } +#undef BLOCK_SIZE +} + +int +bgets_stk_step(struct fastbuf *f, byte *old_buf, byte *buf, uns len) +{ + if (old_buf) + { + len = len >> 1; + memcpy(buf, old_buf, len); + buf += len; + } + while (len--) + { + int k = bgetc(f); + if (k == '\n' || k < 0) + return *buf = 0; + *buf++ = k; + } + return 1; +} + +byte * +bgets0(struct fastbuf *f, byte *b, uns l) +{ + byte *e = b + l - 1; + int k; + + k = bgetc(f); + if (k < 0) + return NULL; + while (b < e) + { + if (k <= 0) + { + *b = 0; + return b; + } + *b++ = k; + k = bgetc(f); + } + die("%s: Line too long", f->name); +}