ref: f43df64325efb80fc48a85009df016477238b21b
dir: /sys/src/libString/s_getline.c/
#include <u.h> #include <libc.h> #include <bio.h> #include "String.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); } }