xref: /plan9/sys/src/libString/s_read_line.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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 Colombier s_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