version 1.9, 2007/02/02 04:24:09 |
version 1.10, 2007/02/02 04:34:49 |
|
|
struct rcs_buf { |
struct rcs_buf { |
u_int cb_flags; |
u_int cb_flags; |
|
|
/* buffer handle and size */ |
/* buffer handle, buffer size, and data length */ |
u_char *cb_buf; |
u_char *cb_buf; |
size_t cb_size; |
size_t cb_size; |
|
|
/* start and length of valid data in buffer */ |
|
u_char *cb_cur; |
|
size_t cb_len; |
size_t cb_len; |
}; |
}; |
|
|
#define SIZE_LEFT(b) (b->cb_size - (size_t)(b->cb_cur - b->cb_buf) \ |
#define SIZE_LEFT(b) (b->cb_size - b->cb_len) |
- b->cb_len) |
|
|
|
static void rcs_buf_grow(BUF *, size_t); |
static void rcs_buf_grow(BUF *, size_t); |
|
|
|
|
|
|
b->cb_flags = flags; |
b->cb_flags = flags; |
b->cb_size = len; |
b->cb_size = len; |
b->cb_cur = b->cb_buf; |
|
b->cb_len = 0; |
b->cb_len = 0; |
|
|
return (b); |
return (b); |
|
|
goto out; |
goto out; |
} |
} |
buf = rcs_buf_alloc(st.st_size, flags); |
buf = rcs_buf_alloc(st.st_size, flags); |
for (bp = buf->cb_cur; ; bp += (size_t)ret) { |
for (bp = buf->cb_buf; ; bp += (size_t)ret) { |
len = SIZE_LEFT(buf); |
len = SIZE_LEFT(buf); |
ret = read(fd, bp, len); |
ret = read(fd, bp, len); |
if (ret == -1) { |
if (ret == -1) { |
|
|
rcs_buf_empty(BUF *b) |
rcs_buf_empty(BUF *b) |
{ |
{ |
memset(b->cb_buf, 0, b->cb_size); |
memset(b->cb_buf, 0, b->cb_size); |
b->cb_cur = b->cb_buf; |
|
b->cb_len = 0; |
b->cb_len = 0; |
} |
} |
|
|
|
|
{ |
{ |
u_char *bp; |
u_char *bp; |
|
|
bp = b->cb_cur + 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)) { |
/* extend */ |
/* extend */ |
if (b->cb_flags & BUF_AUTOEXT) |
if (b->cb_flags & BUF_AUTOEXT) |
|
|
errx(1, "rcs_buf_putc failed"); |
errx(1, "rcs_buf_putc failed"); |
|
|
/* the buffer might have been moved */ |
/* the buffer might have been moved */ |
bp = b->cb_cur + b->cb_len; |
bp = b->cb_buf + b->cb_len; |
} |
} |
*bp = (u_char)c; |
*bp = (u_char)c; |
b->cb_len++; |
b->cb_len++; |
|
|
u_char |
u_char |
rcs_buf_getc(BUF *b, size_t pos) |
rcs_buf_getc(BUF *b, size_t pos) |
{ |
{ |
return (b->cb_cur[pos]); |
return (b->cb_buf[pos]); |
} |
} |
|
|
/* |
/* |
|
|
size_t left, rlen; |
size_t left, rlen; |
u_char *bp, *bep; |
u_char *bp, *bep; |
|
|
bp = b->cb_cur + b->cb_len; |
bp = b->cb_buf + b->cb_len; |
bep = b->cb_buf + b->cb_size; |
bep = b->cb_buf + b->cb_size; |
left = bep - bp; |
left = bep - bp; |
rlen = len; |
rlen = len; |
|
|
if (left < len) { |
if (left < len) { |
if (b->cb_flags & BUF_AUTOEXT) { |
if (b->cb_flags & BUF_AUTOEXT) { |
rcs_buf_grow(b, len - left); |
rcs_buf_grow(b, len - left); |
bp = b->cb_cur + b->cb_len; |
bp = b->cb_buf + b->cb_len; |
} else |
} else |
rlen = bep - bp; |
rlen = bep - bp; |
} |
} |
|
|
ssize_t ret; |
ssize_t ret; |
|
|
len = b->cb_len; |
len = b->cb_len; |
bp = b->cb_cur; |
bp = b->cb_buf; |
|
|
do { |
do { |
ret = write(fd, bp, len); |
ret = write(fd, bp, len); |
|
|
rcs_buf_grow(BUF *b, size_t len) |
rcs_buf_grow(BUF *b, size_t len) |
{ |
{ |
void *tmp; |
void *tmp; |
size_t diff; |
|
|
|
diff = b->cb_cur - b->cb_buf; |
|
tmp = xrealloc(b->cb_buf, 1, b->cb_size + len); |
tmp = xrealloc(b->cb_buf, 1, b->cb_size + len); |
b->cb_buf = tmp; |
b->cb_buf = tmp; |
b->cb_size += len; |
b->cb_size += len; |
|
|
/* readjust pointers in case the buffer moved in memory */ |
|
b->cb_cur = b->cb_buf + diff; |
|
} |
} |