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
initibuf(Ibuf * b,Ioproc * io,int fd)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
readibuf(Ibuf * b,char * buf,int len)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*1066d6deSDavid du Colombier return ioreadn(b->io, b->fd, buf, len);
349a747e4fSDavid du Colombier }
359a747e4fSDavid du Colombier
369a747e4fSDavid du Colombier void
unreadline(Ibuf * b,char * line)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
readline(Ibuf * b,char * buf,int len)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){
603ff48bf5SDavid 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