xref: /plan9/sys/src/libString/s_read.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 enum
7*80ee5cbfSDavid du Colombier {
8*80ee5cbfSDavid du Colombier 	Minread=	256,
9*80ee5cbfSDavid du Colombier };
10*80ee5cbfSDavid du Colombier 
11*80ee5cbfSDavid du Colombier /* Append up to 'len' input bytes to the string 'to'.
12*80ee5cbfSDavid du Colombier  *
13*80ee5cbfSDavid du Colombier  * Returns the number of characters read.
14*80ee5cbfSDavid du Colombier  */
15*80ee5cbfSDavid du Colombier extern int
s_read(Biobuf * fp,String * to,int len)16*80ee5cbfSDavid du Colombier s_read(Biobuf *fp, String *to, int len)
17*80ee5cbfSDavid du Colombier {
18*80ee5cbfSDavid du Colombier 	int rv;
19*80ee5cbfSDavid du Colombier 	int n;
20*80ee5cbfSDavid du Colombier 
21*80ee5cbfSDavid du Colombier 	if(to->ref > 1)
22*80ee5cbfSDavid du Colombier 		sysfatal("can't s_read a shared string");
23*80ee5cbfSDavid du Colombier 	for(rv = 0; rv < len; rv += n){
24*80ee5cbfSDavid du Colombier 		n = to->end - to->ptr;
25*80ee5cbfSDavid du Colombier 		if(n < Minread){
26*80ee5cbfSDavid du Colombier 			s_grow(to, Minread);
27*80ee5cbfSDavid du Colombier 			n = to->end - to->ptr;
28*80ee5cbfSDavid du Colombier 		}
29*80ee5cbfSDavid du Colombier 		if(n > len - rv)
30*80ee5cbfSDavid du Colombier 			n = len - rv;
31*80ee5cbfSDavid du Colombier 		n = Bread(fp, to->ptr, n);
32*80ee5cbfSDavid du Colombier 		if(n <= 0)
33*80ee5cbfSDavid du Colombier 			break;
34*80ee5cbfSDavid du Colombier 		to->ptr += n;
35*80ee5cbfSDavid du Colombier 	}
36*80ee5cbfSDavid du Colombier 	s_terminate(to);
37*80ee5cbfSDavid du Colombier 	return rv;
38*80ee5cbfSDavid du Colombier }
39