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;
}
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) {
}
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++;
}