1*80ee5cbfSDavid du Colombier #include <u.h> 2*80ee5cbfSDavid du Colombier #include <libc.h> 3*80ee5cbfSDavid du Colombier #include <bio.h> 4*80ee5cbfSDavid du Colombier #include "String.h" 5*80ee5cbfSDavid du Colombier 6*80ee5cbfSDavid du Colombier /* Append an input line to a String. 7*80ee5cbfSDavid du Colombier * 8*80ee5cbfSDavid du Colombier * Returns a pointer to the character string (or 0). 9*80ee5cbfSDavid du Colombier * Trailing newline is left on. 10*80ee5cbfSDavid du Colombier */ 11*80ee5cbfSDavid du Colombier extern char * s_read_line(Biobuf * fp,String * to)12*80ee5cbfSDavid du Colombiers_read_line(Biobuf *fp, String *to) 13*80ee5cbfSDavid du Colombier { 14*80ee5cbfSDavid du Colombier char *cp; 15*80ee5cbfSDavid du Colombier int llen; 16*80ee5cbfSDavid du Colombier 17*80ee5cbfSDavid du Colombier if(to->ref > 1) 18*80ee5cbfSDavid du Colombier sysfatal("can't s_read_line a shared string"); 19*80ee5cbfSDavid du Colombier s_terminate(to); 20*80ee5cbfSDavid du Colombier cp = Brdline(fp, '\n'); 21*80ee5cbfSDavid du Colombier if(cp == 0) 22*80ee5cbfSDavid du Colombier return 0; 23*80ee5cbfSDavid du Colombier llen = Blinelen(fp); 24*80ee5cbfSDavid du Colombier if(to->end - to->ptr < llen) 25*80ee5cbfSDavid du Colombier s_grow(to, llen); 26*80ee5cbfSDavid du Colombier memmove(to->ptr, cp, llen); 27*80ee5cbfSDavid du Colombier cp = to->ptr; 28*80ee5cbfSDavid du Colombier to->ptr += llen; 29*80ee5cbfSDavid du Colombier s_terminate(to); 30*80ee5cbfSDavid du Colombier return cp; 31*80ee5cbfSDavid du Colombier } 32