Refactor evbuffer_readln to use evbuffer_ptr; remove old evbuffer_iterator.

svn:r1403
This commit is contained in:
Nick Mathewson 2009-07-31 17:34:47 +00:00
parent 6dc488bd7e
commit a26d2d1b87

View File

@ -972,23 +972,19 @@ evbuffer_readline(struct evbuffer *buffer)
return evbuffer_readln(buffer, NULL, EVBUFFER_EOL_ANY);
}
struct evbuffer_iterator {
struct evbuffer_chain *chain;
int off;
};
static inline int
evbuffer_strchr(struct evbuffer_iterator *it, const char chr)
evbuffer_strchr(struct evbuffer_ptr *it, const char chr)
{
struct evbuffer_chain *chain = it->chain;
unsigned i = it->off;
struct evbuffer_chain *chain = it->_internal.chain;
unsigned i = it->_internal.pos_in_chain;
int count = 0;
while (chain != NULL) {
char *buffer = (char *)chain->buffer + chain->misalign;
for (; i < chain->off; ++i, ++count) {
if (buffer[i] == chr) {
it->chain = chain;
it->off = i;
it->_internal.chain = chain;
it->_internal.pos_in_chain = i;
it->pos += count;
return (count);
}
}
@ -1000,10 +996,10 @@ evbuffer_strchr(struct evbuffer_iterator *it, const char chr)
}
static inline int
evbuffer_strpbrk(struct evbuffer_iterator *it, const char *chrset)
evbuffer_strpbrk(struct evbuffer_ptr *it, const char *chrset)
{
struct evbuffer_chain *chain = it->chain;
unsigned i = it->off;
struct evbuffer_chain *chain = it->_internal.chain;
unsigned i = it->_internal.pos_in_chain;
int count = 0;
while (chain != NULL) {
char *buffer = (char *)chain->buffer + chain->misalign;
@ -1011,8 +1007,9 @@ evbuffer_strpbrk(struct evbuffer_iterator *it, const char *chrset)
const char *p = chrset;
while (*p) {
if (buffer[i] == *p++) {
it->chain = chain;
it->off = i;
it->_internal.chain = chain;
it->_internal.pos_in_chain = i;
it->pos += count;
return (count);
}
}
@ -1026,10 +1023,16 @@ evbuffer_strpbrk(struct evbuffer_iterator *it, const char *chrset)
static inline int
evbuffer_strspn(
struct evbuffer_chain *chain, unsigned i, const char *chrset)
struct evbuffer_ptr *ptr, const char *chrset)
{
int count = 0;
while (chain != NULL) {
struct evbuffer_chain *chain = ptr->_internal.chain;
unsigned i = ptr->_internal.pos_in_chain;
if (!chain)
return -1;
while (1) {
char *buffer = (char *)chain->buffer + chain->misalign;
for (; i < chain->off; ++i) {
const char *p = chrset;
@ -1037,43 +1040,41 @@ evbuffer_strspn(
if (buffer[i] == *p++)
goto next;
}
ptr->_internal.chain = chain;
ptr->_internal.pos_in_chain = i;
ptr->pos += count;
return count;
next:
++count;
}
i = 0;
chain = chain->next;
if (! chain->next) {
ptr->_internal.chain = chain;
ptr->_internal.pos_in_chain = i;
ptr->pos += count;
return count;
}
return (count);
chain = chain->next;
}
}
static inline int
evbuffer_getchr(struct evbuffer_iterator *it, char *pchr)
static inline char
evbuffer_getchr(struct evbuffer_ptr *it)
{
struct evbuffer_chain *chain = it->chain;
int off = it->off;
struct evbuffer_chain *chain = it->_internal.chain;
int off = it->_internal.pos_in_chain;
while ((size_t)off >= chain->off) {
off -= chain->off;
chain = chain->next;
if (chain == NULL)
return (-1);
}
*pchr = chain->buffer[chain->misalign + off];
it->chain = chain;
it->off = off;
return (0);
return chain->buffer[chain->misalign + off];
}
char *
evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
enum evbuffer_eol_style eol_style)
{
struct evbuffer_iterator it;
struct evbuffer_ptr it;
char *line, chr;
unsigned int n_to_copy, extra_drain;
int count = 0;
@ -1085,8 +1086,8 @@ evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
goto done;
}
it.chain = buffer->first;
it.off = 0;
if (evbuffer_ptr_set(buffer, &it, 0, EVBUFFER_PTR_SET) < 0)
goto done;
/* the eol_style determines our first stop character and how many
* characters we are going to drain afterwards. */
@ -1097,15 +1098,16 @@ evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
goto done;
n_to_copy = count;
extra_drain = evbuffer_strspn(it.chain, it.off, "\r\n");
extra_drain = evbuffer_strspn(&it, "\r\n");
break;
case EVBUFFER_EOL_CRLF_STRICT: {
int tmp;
while ((tmp = evbuffer_strchr(&it, '\r')) != -1) {
count += tmp;
++it.off;
if (evbuffer_getchr(&it, &chr) == -1)
if (evbuffer_ptr_set(buffer, &it, 1, EVBUFFER_PTR_ADD)
< 0)
goto done;
chr = evbuffer_getchr(&it);
if (chr == '\n') {
n_to_copy = count;
break;