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