version 1.45, 2006/04/10 19:49:44 |
version 1.46, 2006/04/11 00:49:49 |
|
|
#define SIZE_LEFT(b) (b->cb_size - (size_t)(b->cb_cur - b->cb_buf) \ |
#define SIZE_LEFT(b) (b->cb_size - (size_t)(b->cb_cur - b->cb_buf) \ |
- b->cb_len) |
- b->cb_len) |
|
|
static ssize_t cvs_buf_grow(BUF *, size_t); |
static void cvs_buf_grow(BUF *, size_t); |
|
|
/* |
/* |
* cvs_buf_alloc() |
* cvs_buf_alloc() |
|
|
size_t rlen = 0; |
size_t rlen = 0; |
|
|
if (b->cb_size < (len + off)) { |
if (b->cb_size < (len + off)) { |
if ((b->cb_flags & BUF_AUTOEXT) && |
if ((b->cb_flags & BUF_AUTOEXT)) |
(cvs_buf_grow(b, len + off - b->cb_size) < 0)) |
cvs_buf_grow(b, len + off - b->cb_size); |
fatal("cvs_buf_set failed"); |
|
else |
else |
rlen = b->cb_size - off; |
rlen = b->cb_size - off; |
} else |
} else |
|
|
bp = b->cb_cur + b->cb_len; |
bp = b->cb_cur + b->cb_len; |
if (bp == (b->cb_buf + b->cb_size)) { |
if (bp == (b->cb_buf + b->cb_size)) { |
/* extend */ |
/* extend */ |
if (!(b->cb_flags & BUF_AUTOEXT) || |
if (b->cb_flags & BUF_AUTOEXT) |
(cvs_buf_grow(b, (size_t)BUF_INCR) < 0)) |
cvs_buf_grow(b, (size_t)BUF_INCR); |
|
else |
fatal("cvs_buf_putc failed"); |
fatal("cvs_buf_putc failed"); |
|
|
/* the buffer might have been moved */ |
/* the buffer might have been moved */ |
|
|
|
|
if (left < len) { |
if (left < len) { |
if (b->cb_flags & BUF_AUTOEXT) { |
if (b->cb_flags & BUF_AUTOEXT) { |
if (cvs_buf_grow(b, len - left) < 0) |
cvs_buf_grow(b, len - left); |
fatal("cvs_buf_append failed"); |
|
bp = b->cb_cur + b->cb_len; |
bp = b->cb_cur + b->cb_len; |
} else |
} else |
rlen = bep - bp; |
rlen = bep - bp; |
|
|
* |
* |
* Grow the buffer <b> by <len> bytes. The contents are unchanged by this |
* Grow the buffer <b> by <len> bytes. The contents are unchanged by this |
* operation regardless of the result. |
* operation regardless of the result. |
* Returns the new size on success, or -1 on failure. |
|
*/ |
*/ |
static ssize_t |
static void |
cvs_buf_grow(BUF *b, size_t len) |
cvs_buf_grow(BUF *b, size_t len) |
{ |
{ |
void *tmp; |
void *tmp; |
size_t diff; |
size_t diff; |
|
|
diff = b->cb_cur - b->cb_buf; |
diff = b->cb_cur - b->cb_buf; |
/* Buffer not allocated yet */ |
tmp = xrealloc(b->cb_buf, 1, b->cb_size + len); |
if (b->cb_size == 0) |
b->cb_buf = tmp; |
tmp = xmalloc(len); |
|
else |
|
tmp = xrealloc(b->cb_buf, 1, b->cb_size + len); |
|
b->cb_buf = (u_char *)tmp; |
|
b->cb_size += len; |
b->cb_size += len; |
|
|
/* readjust pointers in case the buffer moved in memory */ |
/* readjust pointers in case the buffer moved in memory */ |
b->cb_cur = b->cb_buf + diff; |
b->cb_cur = b->cb_buf + diff; |
|
|
return (ssize_t)b->cb_size; |
|
} |
} |
|
|
#if !defined(RCSPROG) |
#if !defined(RCSPROG) |