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 Colombiers_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