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