version 1.76, 2010/07/23 21:46:05 |
version 1.77, 2010/07/31 16:28:31 |
|
|
#include "buf.h" |
#include "buf.h" |
|
|
#define BUF_INCR 128 |
#define BUF_INCR 128 |
#define BUF_GROW(bp, len) \ |
|
do { \ |
|
b->cb_buf = xrealloc(b->cb_buf, 1, b->cb_size + len); \ |
|
b->cb_size += len; \ |
|
} while (0); |
|
|
|
struct buf { |
struct buf { |
u_char *cb_buf; |
u_char *cb_buf; |
|
|
size_t cb_len; |
size_t cb_len; |
}; |
}; |
|
|
|
#define SIZE_LEFT(b) (b->cb_size - b->cb_len) |
|
|
|
static void buf_grow(BUF *, size_t); |
|
|
BUF * |
BUF * |
buf_alloc(size_t len) |
buf_alloc(size_t len) |
{ |
{ |
|
|
|
|
bp = b->cb_buf + b->cb_len; |
bp = b->cb_buf + b->cb_len; |
if (bp == (b->cb_buf + b->cb_size)) { |
if (bp == (b->cb_buf + b->cb_size)) { |
BUF_GROW(b, BUF_INCR); |
buf_grow(b, BUF_INCR); |
bp = b->cb_buf + b->cb_len; |
bp = b->cb_buf + b->cb_len; |
} |
} |
*bp = (u_char)c; |
*bp = (u_char)c; |
|
|
buf_append(BUF *b, const void *data, size_t len) |
buf_append(BUF *b, const void *data, size_t len) |
{ |
{ |
size_t left; |
size_t left; |
u_char *bp, *bep; |
u_char *bp; |
|
|
bp = b->cb_buf + b->cb_len; |
left = SIZE_LEFT(b); |
bep = b->cb_buf + b->cb_size; |
|
left = bep - bp; |
|
|
|
if (left < len) { |
if (left < len) |
BUF_GROW(b, len - left); |
buf_grow(b, len - left); |
bp = b->cb_buf + b->cb_len; |
|
} |
|
|
|
|
bp = b->cb_buf + b->cb_len; |
memcpy(bp, data, len); |
memcpy(bp, data, len); |
b->cb_len += len; |
b->cb_len += len; |
} |
} |
|
|
return (1); |
return (1); |
|
|
return (memcmp(b1->cb_buf, b2->cb_buf, b1->cb_len)); |
return (memcmp(b1->cb_buf, b2->cb_buf, b1->cb_len)); |
|
} |
|
|
|
/* |
|
* buf_grow() |
|
* |
|
* Grow the buffer <b> by <len> bytes. The contents are unchanged by this |
|
* operation regardless of the result. |
|
*/ |
|
static void |
|
buf_grow(BUF *b, size_t len) |
|
{ |
|
b->cb_buf = xrealloc(b->cb_buf, 1, b->cb_size + len); |
|
b->cb_size += len; |
} |
} |