From mboxrd@z Thu Jan 1 00:00:00 1970 From: erik quanstrom Date: Wed, 19 Sep 2012 09:35:51 -0400 To: 9fans@9fans.net Message-ID: <18674d790afd2a7602091b8d8e704712@brasstown.quanstro.net> In-Reply-To: <22e43e02e32dd37beb7f8c52105e45b6@quintile.net> References: <22e43e02e32dd37beb7f8c52105e45b6@quintile.net> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: Re: [9fans] Brdline() and continuation lines Topicbox-Message-UUID: ba4e5ada-ead7-11e9-9d60-3106f5b1d025 > 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; }