Blame


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