> Anyone worked out an idiom that would allow me to > use Brdline()/Blinelen() to read a file which > contains continuation lines? > > I want to read a text file which consists of lines terminated > by newlines, but lines with leading whitespace are considered > to be continuation lines. > > Brdline() is very neat allowing me to parse input lines inside the > Biobuf buffer without copying them to "user space", however if I > do a Brdline(), get a line and then attempt to do another Brdline() > I am in danger of releaseing the buffer space used by the first read. > > I am happy if the answer is "Brdline() cannot do this", I just feel like > I am missing a trick, and there is elegant solution.
/* * Bgetrune seems like overkill, but avoids passing up bad runes. */ int Brdlinec(Biobuf *b, char *s, char *e) { char *p; int x, slash; Rune r; for(p = s; e-p > UTFmax+1;){ x = Bgetrune(b); if(x == -1) return -1; r = x; if(r == '\\'){ x = Bgetrune(b); if(x == -1) return -1; if(x == '\n') continue; p += runetochar(p, &r); r = x; }else if(r == '\n') break; p += runetochar(p, r); } *p = 0; return p-e; }