> 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;
}


Reply via email to