From: Frédéric Marchal Date: Mon, 15 Feb 2010 13:47:50 +0000 (+0000) Subject: Some lines were skipped when reading a file with longline_read X-Git-Tag: v2.3-pre2~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4e25148ce9f5dd0a6086356d1fd0a272bb06339;p=thirdparty%2Fsarg.git Some lines were skipped when reading a file with longline_read --- diff --git a/util.c b/util.c index 29ea194..f20e01f 100644 --- a/util.c +++ b/util.c @@ -1717,11 +1717,10 @@ char *longline_read(FILE *fp_in,struct longlinestruct *line) line->start=line->end; skipcr=1; - while (skipcr || line->end>=line->length || (line->buffer[line->end]!='\n' && line->buffer[line->end]!='\r')) { + while (1) { if (line->end>=line->length) { if (line->start>0) { - for (i=line->start ; iend ; i++) - line->buffer[i-line->start]=line->buffer[i]; + for (i=line->start ; ilength ; i++) line->buffer[i-line->start]=line->buffer[i]; line->length-=line->start; line->end-=line->start; line->start=0; @@ -1735,10 +1734,11 @@ char *longline_read(FILE *fp_in,struct longlinestruct *line) } line->buffer=newbuf; } - nread=fread(line->buffer+line->end,1,line->size-line->end,fp_in); + nread=(feof(fp_in)) ? 0 : fread(line->buffer+line->length,1,line->size-line->length,fp_in); if (nread==0) { - if (line->end<=line->start) return(NULL); + if (skipcr || line->end<=line->start) return(NULL); if (line->end>=line->size) { + line->end=line->size; line->size++; newbuf=realloc(line->buffer,line->size); if (!newbuf) { @@ -1752,9 +1752,13 @@ char *longline_read(FILE *fp_in,struct longlinestruct *line) } line->length+=nread; } - if (skipcr && line->buffer[line->end]!='\n' && line->buffer[line->end]!='\r') { - skipcr=0; - line->start=line->end; + if (skipcr) { + if (line->buffer[line->end]!='\n' && line->buffer[line->end]!='\r') { + skipcr=0; + line->start=line->end; + } + } else { + if (line->buffer[line->end]=='\n' || line->buffer[line->end]=='\r') break; } line->end++; }