Reworked the parsing loop
This commit is contained in:
parent
d298bfd4cc
commit
f61f2c2d81
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user