1*9a747e4fSDavid du Colombier #include <u.h> 2*9a747e4fSDavid du Colombier #include <libc.h> 3*9a747e4fSDavid du Colombier #include <bio.h> 4*9a747e4fSDavid du Colombier #include <ip.h> 5*9a747e4fSDavid du Colombier #include <plumb.h> 6*9a747e4fSDavid du Colombier #include <thread.h> 7*9a747e4fSDavid du Colombier #include <fcall.h> 8*9a747e4fSDavid du Colombier #include <9p.h> 9*9a747e4fSDavid du Colombier #include "dat.h" 10*9a747e4fSDavid du Colombier #include "fns.h" 11*9a747e4fSDavid du Colombier 12*9a747e4fSDavid du Colombier void 13*9a747e4fSDavid du Colombier initibuf(Ibuf *b, Ioproc *io, int fd) 14*9a747e4fSDavid du Colombier { 15*9a747e4fSDavid du Colombier b->fd = fd; 16*9a747e4fSDavid du Colombier b->io = io; 17*9a747e4fSDavid du Colombier b->rp = b->wp = b->buf; 18*9a747e4fSDavid du Colombier } 19*9a747e4fSDavid du Colombier 20*9a747e4fSDavid du Colombier int 21*9a747e4fSDavid du Colombier readibuf(Ibuf *b, char *buf, int len) 22*9a747e4fSDavid du Colombier { 23*9a747e4fSDavid du Colombier int n; 24*9a747e4fSDavid du Colombier 25*9a747e4fSDavid du Colombier n = b->wp - b->rp; 26*9a747e4fSDavid du Colombier if(n > 0){ 27*9a747e4fSDavid du Colombier if(n > len) 28*9a747e4fSDavid du Colombier n = len; 29*9a747e4fSDavid du Colombier memmove(buf, b->rp, n); 30*9a747e4fSDavid du Colombier b->rp += n; 31*9a747e4fSDavid du Colombier return n; 32*9a747e4fSDavid du Colombier } 33*9a747e4fSDavid du Colombier return b->io->read(b->io, b->fd, buf, len); 34*9a747e4fSDavid du Colombier } 35*9a747e4fSDavid du Colombier 36*9a747e4fSDavid du Colombier void 37*9a747e4fSDavid du Colombier unreadline(Ibuf *b, char *line) 38*9a747e4fSDavid du Colombier { 39*9a747e4fSDavid du Colombier int i, n; 40*9a747e4fSDavid du Colombier 41*9a747e4fSDavid du Colombier i = strlen(line); 42*9a747e4fSDavid du Colombier n = b->wp - b->rp; 43*9a747e4fSDavid du Colombier memmove(&b->buf[i+1], b->rp, n); 44*9a747e4fSDavid du Colombier memmove(b->buf, line, i); 45*9a747e4fSDavid du Colombier b->buf[i] = '\n'; 46*9a747e4fSDavid du Colombier b->rp = b->buf; 47*9a747e4fSDavid du Colombier b->wp = b->rp+i+1+n; 48*9a747e4fSDavid du Colombier } 49*9a747e4fSDavid du Colombier 50*9a747e4fSDavid du Colombier int 51*9a747e4fSDavid du Colombier readline(Ibuf *b, char *buf, int len) 52*9a747e4fSDavid du Colombier { 53*9a747e4fSDavid du Colombier int n; 54*9a747e4fSDavid du Colombier char *p; 55*9a747e4fSDavid du Colombier 56*9a747e4fSDavid du Colombier len--; 57*9a747e4fSDavid du Colombier 58*9a747e4fSDavid du Colombier for(p = buf;;){ 59*9a747e4fSDavid du Colombier if(b->rp >= b->wp){ 60*9a747e4fSDavid du Colombier n = b->io->read(b->io, b->fd, b->wp, sizeof(b->buf)/2); 61*9a747e4fSDavid du Colombier if(n < 0) 62*9a747e4fSDavid du Colombier return -1; 63*9a747e4fSDavid du Colombier if(n == 0) 64*9a747e4fSDavid du Colombier break; 65*9a747e4fSDavid du Colombier b->wp += n; 66*9a747e4fSDavid du Colombier } 67*9a747e4fSDavid du Colombier n = *b->rp++; 68*9a747e4fSDavid du Colombier if(len > 0){ 69*9a747e4fSDavid du Colombier *p++ = n; 70*9a747e4fSDavid du Colombier len--; 71*9a747e4fSDavid du Colombier } 72*9a747e4fSDavid du Colombier if(n == '\n') 73*9a747e4fSDavid du Colombier break; 74*9a747e4fSDavid du Colombier } 75*9a747e4fSDavid du Colombier 76*9a747e4fSDavid du Colombier /* drop trailing white */ 77*9a747e4fSDavid du Colombier for(;;){ 78*9a747e4fSDavid du Colombier if(p <= buf) 79*9a747e4fSDavid du Colombier break; 80*9a747e4fSDavid du Colombier n = *(p-1); 81*9a747e4fSDavid du Colombier if(n != ' ' && n != '\t' && n != '\r' && n != '\n') 82*9a747e4fSDavid du Colombier break; 83*9a747e4fSDavid du Colombier p--; 84*9a747e4fSDavid du Colombier } 85*9a747e4fSDavid du Colombier 86*9a747e4fSDavid du Colombier *p = 0; 87*9a747e4fSDavid du Colombier return p-buf; 88*9a747e4fSDavid du Colombier } 89*9a747e4fSDavid du Colombier 90