| #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); |
| } |
| } |