Discussion:
[9fans] Brdline() and continuation lines
(too old to reply)
Steve Simon
2012-09-19 08:48:51 UTC
Permalink
Hi,

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.

-Steve
erik quanstrom
2012-09-19 13:35:51 UTC
Permalink
Post by Steve Simon
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;
}
Charles Forsyth
2012-09-19 13:49:25 UTC
Permalink
I don't see how it can do it.
Post by Steve Simon
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.
Loading...