19a747e4fSDavid du Colombier #include <u.h> 29a747e4fSDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <bio.h> 49a747e4fSDavid du Colombier #include <ip.h> 59a747e4fSDavid du Colombier #include <plumb.h> 69a747e4fSDavid du Colombier #include <thread.h> 79a747e4fSDavid du Colombier #include <fcall.h> 89a747e4fSDavid du Colombier #include <9p.h> 99a747e4fSDavid du Colombier #include "dat.h" 109a747e4fSDavid du Colombier #include "fns.h" 119a747e4fSDavid du Colombier 129a747e4fSDavid du Colombier void 139a747e4fSDavid du Colombier initibuf(Ibuf *b, Ioproc *io, int fd) 149a747e4fSDavid du Colombier { 159a747e4fSDavid du Colombier b->fd = fd; 169a747e4fSDavid du Colombier b->io = io; 179a747e4fSDavid du Colombier b->rp = b->wp = b->buf; 189a747e4fSDavid du Colombier } 199a747e4fSDavid du Colombier 209a747e4fSDavid du Colombier int 219a747e4fSDavid du Colombier readibuf(Ibuf *b, char *buf, int len) 229a747e4fSDavid du Colombier { 239a747e4fSDavid du Colombier int n; 249a747e4fSDavid du Colombier 259a747e4fSDavid du Colombier n = b->wp - b->rp; 269a747e4fSDavid du Colombier if(n > 0){ 279a747e4fSDavid du Colombier if(n > len) 289a747e4fSDavid du Colombier n = len; 299a747e4fSDavid du Colombier memmove(buf, b->rp, n); 309a747e4fSDavid du Colombier b->rp += n; 319a747e4fSDavid du Colombier return n; 329a747e4fSDavid du Colombier } 33*3ff48bf5SDavid du Colombier return ioread(b->io, b->fd, buf, len); 349a747e4fSDavid du Colombier } 359a747e4fSDavid du Colombier 369a747e4fSDavid du Colombier void 379a747e4fSDavid du Colombier unreadline(Ibuf *b, char *line) 389a747e4fSDavid du Colombier { 399a747e4fSDavid du Colombier int i, n; 409a747e4fSDavid du Colombier 419a747e4fSDavid du Colombier i = strlen(line); 429a747e4fSDavid du Colombier n = b->wp - b->rp; 439a747e4fSDavid du Colombier memmove(&b->buf[i+1], b->rp, n); 449a747e4fSDavid du Colombier memmove(b->buf, line, i); 459a747e4fSDavid du Colombier b->buf[i] = '\n'; 469a747e4fSDavid du Colombier b->rp = b->buf; 479a747e4fSDavid du Colombier b->wp = b->rp+i+1+n; 489a747e4fSDavid du Colombier } 499a747e4fSDavid du Colombier 509a747e4fSDavid du Colombier int 519a747e4fSDavid du Colombier readline(Ibuf *b, char *buf, int len) 529a747e4fSDavid du Colombier { 539a747e4fSDavid du Colombier int n; 549a747e4fSDavid du Colombier char *p; 559a747e4fSDavid du Colombier 569a747e4fSDavid du Colombier len--; 579a747e4fSDavid du Colombier 589a747e4fSDavid du Colombier for(p = buf;;){ 599a747e4fSDavid du Colombier if(b->rp >= b->wp){ 60*3ff48bf5SDavid du Colombier n = ioread(b->io, b->fd, b->wp, sizeof(b->buf)/2); 619a747e4fSDavid du Colombier if(n < 0) 629a747e4fSDavid du Colombier return -1; 639a747e4fSDavid du Colombier if(n == 0) 649a747e4fSDavid du Colombier break; 659a747e4fSDavid du Colombier b->wp += n; 669a747e4fSDavid du Colombier } 679a747e4fSDavid du Colombier n = *b->rp++; 689a747e4fSDavid du Colombier if(len > 0){ 699a747e4fSDavid du Colombier *p++ = n; 709a747e4fSDavid du Colombier len--; 719a747e4fSDavid du Colombier } 729a747e4fSDavid du Colombier if(n == '\n') 739a747e4fSDavid du Colombier break; 749a747e4fSDavid du Colombier } 759a747e4fSDavid du Colombier 769a747e4fSDavid du Colombier /* drop trailing white */ 779a747e4fSDavid du Colombier for(;;){ 789a747e4fSDavid du Colombier if(p <= buf) 799a747e4fSDavid du Colombier break; 809a747e4fSDavid du Colombier n = *(p-1); 819a747e4fSDavid du Colombier if(n != ' ' && n != '\t' && n != '\r' && n != '\n') 829a747e4fSDavid du Colombier break; 839a747e4fSDavid du Colombier p--; 849a747e4fSDavid du Colombier } 859a747e4fSDavid du Colombier 869a747e4fSDavid du Colombier *p = 0; 879a747e4fSDavid du Colombier return p-buf; 889a747e4fSDavid du Colombier } 899a747e4fSDavid du Colombier 90