r18264@catbus: nickm | 2008-02-20 12:48:21 -0500

fix bufs in buf_pos_t implementation.


svn:r13623
This commit is contained in:
Nick Mathewson 2008-02-20 17:48:39 +00:00
parent 5dd9d16b94
commit 7521ef9a00
3 changed files with 16 additions and 14 deletions

View File

@ -17,6 +17,8 @@ Changes in version 0.2.0.20-?? - 2008-02-??
number we've gotten from accept(). This bug made us fail to count number we've gotten from accept(). This bug made us fail to count
all sockets that we were using for incoming connections. Bugfix on all sockets that we were using for incoming connections. Bugfix on
0.2.0.x 0.2.0.x
- Fix code used to find strings within buffers, when those strings
are not in the first chunk of the buffer.
o Minor features (performance): o Minor features (performance):
- Tune parameters for cell pool allocation to minimize amount of - Tune parameters for cell pool allocation to minimize amount of

View File

@ -998,9 +998,8 @@ move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen)
/** Internal structure: represents a position in a buffer. */ /** Internal structure: represents a position in a buffer. */
typedef struct buf_pos_t { typedef struct buf_pos_t {
const chunk_t *chunk; /**< Which chunk are we pointing to? */ const chunk_t *chunk; /**< Which chunk are we pointing to? */
int pos; /**< Which character inside the chunk's data are we pointing to? */ off_t pos;/**< Which character inside the chunk's data are we pointing to? */
int pos_absolute; /**< Which character inside the buffer are we pointing to? size_t chunk_pos; /**< Total length of all previous chunks. */
*/
} buf_pos_t; } buf_pos_t;
/** Initialize <b>out</b> to point to the first character of <b>buf</b>.*/ /** Initialize <b>out</b> to point to the first character of <b>buf</b>.*/
@ -1009,7 +1008,7 @@ buf_pos_init(const buf_t *buf, buf_pos_t *out)
{ {
out->chunk = buf->head; out->chunk = buf->head;
out->pos = 0; out->pos = 0;
out->pos_absolute = 0; out->chunk_pos = 0;
} }
/** Advance <b>out</b> to the first appearance of <b>ch</b> at the current /** Advance <b>out</b> to the first appearance of <b>ch</b> at the current
@ -1019,19 +1018,19 @@ static int
buf_find_pos_of_char(char ch, buf_pos_t *out) buf_find_pos_of_char(char ch, buf_pos_t *out)
{ {
const chunk_t *chunk; const chunk_t *chunk;
int offset = 0; /*XXXX020 should this be pos_absolute? Otherwise, bug. */
int pos; int pos;
tor_assert(out && out->chunk && out->pos < (int)out->chunk->datalen); tor_assert(out);
if (out->chunk)
tor_assert(out->pos < out->chunk->datalen);
pos = out->pos; pos = out->pos;
for (chunk = out->chunk; chunk; chunk = chunk->next) { for (chunk = out->chunk; chunk; chunk = chunk->next) {
char *cp = memchr(chunk->data+pos, ch, chunk->datalen-pos); char *cp = memchr(chunk->data+pos, ch, chunk->datalen-pos);
if (cp) { if (cp) {
out->chunk = chunk; out->chunk = chunk;
out->pos = cp - chunk->data; out->pos = cp - chunk->data;
out->pos_absolute = offset + (cp - chunk->data); return out->chunk_pos + out->pos;
return out->pos_absolute;
} else { } else {
offset += chunk->datalen; out->chunk_pos += chunk->datalen;
pos = 0; pos = 0;
} }
} }
@ -1043,15 +1042,14 @@ buf_find_pos_of_char(char ch, buf_pos_t *out)
static INLINE int static INLINE int
buf_pos_inc(buf_pos_t *pos) buf_pos_inc(buf_pos_t *pos)
{ {
if ((size_t)pos->pos == pos->chunk->datalen) { ++pos->pos;
if (pos->pos == pos->chunk->datalen) {
if (!pos->chunk->next) if (!pos->chunk->next)
return -1; return -1;
pos->chunk_pos += pos->chunk->datalen;
pos->chunk = pos->chunk->next; pos->chunk = pos->chunk->next;
pos->pos = 0; pos->pos = 0;
} else {
++pos->pos;
} }
++pos->pos_absolute;
return 0; return 0;
} }
@ -1084,7 +1082,7 @@ buf_find_string_offset(const buf_t *buf, const char *s, size_t n)
buf_pos_init(buf, &pos); buf_pos_init(buf, &pos);
while (buf_find_pos_of_char(*s, &pos) >= 0) { while (buf_find_pos_of_char(*s, &pos) >= 0) {
if (buf_matches_at_pos(&pos, s, n)) { if (buf_matches_at_pos(&pos, s, n)) {
return pos.pos_absolute; return pos.chunk_pos + pos.pos;
} else { } else {
if (buf_pos_inc(&pos)<0) if (buf_pos_inc(&pos)<0)
return -1; return -1;

View File

@ -255,6 +255,8 @@ test_buffers(void)
buf_free(buf); buf_free(buf);
buf_free(buf2); buf_free(buf2);
/*XXXX020 Test code to find chars and strings on buffers. */
#if 0 #if 0
{ {
int s; int s;