#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include "libString.h" | |
/* Append an input line to a String. | |
* | |
* Returns a pointer to the character string (or 0). | |
* Leading whitespace and newlines are removed. | |
* | |
* Empty lines and lines starting with '#' are ignored. | |
*/ | |
extern char * | |
s_getline(Biobuf *fp, String *to) | |
{ | |
int c; | |
int len=0; | |
s_terminate(to); | |
/* end of input */ | |
if ((c = Bgetc(fp)) < 0) | |
return 0; | |
/* take care of inconsequentials */ | |
for(;;) { | |
/* eat leading white */ | |
while(c==' ' || c=='\t' || c=='\n' || c=='\r') | |
c = Bgetc(fp); | |
if(c < 0) | |
return 0; | |
/* take care of comments */ | |
if(c == '#'){ | |
do { | |
c = Bgetc(fp); | |
if(c < 0) | |
return 0; | |
} while(c != '\n'); | |
continue; | |
} | |
/* if we got here, we've gotten something useful */ | |
break; | |
} | |
/* gather up a line */ | |
for(;;) { | |
len++; | |
switch(c) { | |
case -1: | |
s_terminate(to); | |
return len ? to->ptr-len : 0; | |
case '\\': | |
c = Bgetc(fp); | |
if (c != '\n') { | |
s_putc(to, '\\'); | |
s_putc(to, c); | |
} | |
break; | |
case '\n': | |
s_terminate(to); | |
return len ? to->ptr-len : 0; | |
default: | |
s_putc(to, c); | |
break; | |
} | |
c = Bgetc(fp); | |
} | |
} |