Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "libString.h"
6 /* Append an input line to a String.
7 *
8 * Returns a pointer to the character string (or 0).
9 * Leading whitespace and newlines are removed.
10 *
11 * Empty lines and lines starting with '#' are ignored.
12 */
13 extern char *
14 s_getline(Biobuf *fp, String *to)
15 {
16 int c;
17 int len=0;
19 s_terminate(to);
21 /* end of input */
22 if ((c = Bgetc(fp)) < 0)
23 return 0;
25 /* take care of inconsequentials */
26 for(;;) {
27 /* eat leading white */
28 while(c==' ' || c=='\t' || c=='\n' || c=='\r')
29 c = Bgetc(fp);
31 if(c < 0)
32 return 0;
34 /* take care of comments */
35 if(c == '#'){
36 do {
37 c = Bgetc(fp);
38 if(c < 0)
39 return 0;
40 } while(c != '\n');
41 continue;
42 }
44 /* if we got here, we've gotten something useful */
45 break;
46 }
48 /* gather up a line */
49 for(;;) {
50 len++;
51 switch(c) {
52 case -1:
53 s_terminate(to);
54 return len ? to->ptr-len : 0;
55 case '\\':
56 c = Bgetc(fp);
57 if (c != '\n') {
58 s_putc(to, '\\');
59 s_putc(to, c);
60 }
61 break;
62 case '\n':
63 s_terminate(to);
64 return len ? to->ptr-len : 0;
65 default:
66 s_putc(to, c);
67 break;
68 }
69 c = Bgetc(fp);
70 }
71 }