Reworked the parsing loop

This commit is contained in:
Pierre Pronchery 2014-09-08 06:03:23 +02:00
parent d298bfd4cc
commit f61f2c2d81

View File

@ -998,34 +998,40 @@ static int _parse_do(Hayes * hayes, HayesChannel * channel);
static int _hayes_parse(Hayes * hayes, HayesChannel * channel) static int _hayes_parse(Hayes * hayes, HayesChannel * channel)
{ {
int ret = 0; int ret = 0;
size_t i = 0; size_t i;
char * p; char * p;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() cnt=%lu\n", __func__, fprintf(stderr, "DEBUG: %s() cnt=%lu\n", __func__,
(unsigned long)channel->rd_buf_cnt); (unsigned long)channel->rd_buf_cnt);
#endif #endif
while(i < channel->rd_buf_cnt) for(i = 0; i < channel->rd_buf_cnt;)
{ {
if(channel->rd_buf[i++] != '\r' if(channel->rd_buf[i] == '\r')
&& channel->rd_buf[i - 1] != '\n') {
continue; if(i + 1 < channel->rd_buf_cnt
channel->rd_buf[i - 1] = '\0'; && channel->rd_buf[i + 1] == '\n')
if(i < channel->rd_buf_cnt && channel->rd_buf[i] == '\n') channel->rd_buf[i++] = '\0';
}
else if(channel->rd_buf[i] != '\n')
{
i++; i++;
continue;
}
channel->rd_buf[i] = '\0';
if(channel->rd_buf[0] != '\0') if(channel->rd_buf[0] != '\0')
ret |= _parse_do(hayes, channel); ret |= _parse_do(hayes, channel);
channel->rd_buf_cnt -= i; channel->rd_buf_cnt -= i;
memmove(channel->rd_buf, &channel->rd_buf[i], memmove(channel->rd_buf, &channel->rd_buf[i + 1],
channel->rd_buf_cnt); channel->rd_buf_cnt);
if((p = realloc(channel->rd_buf, channel->rd_buf_cnt)) != NULL)
/* we can ignore errors... */
channel->rd_buf = p;
else if(channel->rd_buf_cnt == 0)
/* ...except when it's not one */
channel->rd_buf = NULL;
i = 0; i = 0;
} }
if((p = realloc(channel->rd_buf, channel->rd_buf_cnt)) != NULL)
/* we can ignore errors... */
channel->rd_buf = p;
else if(channel->rd_buf_cnt == 0)
/* ...except when it's not one */
channel->rd_buf = NULL;
return ret; return ret;
} }