xref: /plan9/sys/src/cmd/webfs/buf.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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