]> git.ipfire.org Git - thirdparty/sarg.git/commitdiff
Some lines were skipped when reading a file with longline_read
authorFrédéric Marchal <fmarchal@users.sourceforge.net>
Mon, 15 Feb 2010 13:47:50 +0000 (13:47 +0000)
committerFrédéric Marchal <fmarchal@users.sourceforge.net>
Mon, 15 Feb 2010 13:47:50 +0000 (13:47 +0000)
util.c

diff --git a/util.c b/util.c
index 29ea194b93ded9d7cdee05a351da3cf58ffca9b2..f20e01f6371f4a1a9e4f46e636c42ea76ee6a907 100644 (file)
--- 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 ; i<line->end ; i++)
-               line->buffer[i-line->start]=line->buffer[i];
+            for (i=line->start ; i<line->length ; 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++;
    }