xref: /plan9/sys/src/cmd/mk/bufblock.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include	"mk.h"
2*3e12c5d1SDavid du Colombier 
3*3e12c5d1SDavid du Colombier static Bufblock *freelist;
4*3e12c5d1SDavid du Colombier #define	QUANTA	4096
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier Bufblock *
newbuf(void)7*3e12c5d1SDavid du Colombier newbuf(void)
8*3e12c5d1SDavid du Colombier {
9*3e12c5d1SDavid du Colombier 	Bufblock *p;
10*3e12c5d1SDavid du Colombier 
11*3e12c5d1SDavid du Colombier 	if (freelist) {
12*3e12c5d1SDavid du Colombier 		p = freelist;
13*3e12c5d1SDavid du Colombier 		freelist = freelist->next;
14*3e12c5d1SDavid du Colombier 	} else {
15*3e12c5d1SDavid du Colombier 		p = (Bufblock *) Malloc(sizeof(Bufblock));
16*3e12c5d1SDavid du Colombier 		p->start = Malloc(QUANTA*sizeof(*p->start));
17*3e12c5d1SDavid du Colombier 		p->end = p->start+QUANTA;
18*3e12c5d1SDavid du Colombier 	}
19*3e12c5d1SDavid du Colombier 	p->current = p->start;
20*3e12c5d1SDavid du Colombier 	*p->start = 0;
21*3e12c5d1SDavid du Colombier 	p->next = 0;
22*3e12c5d1SDavid du Colombier 	return p;
23*3e12c5d1SDavid du Colombier }
24*3e12c5d1SDavid du Colombier 
25*3e12c5d1SDavid du Colombier void
freebuf(Bufblock * p)26*3e12c5d1SDavid du Colombier freebuf(Bufblock *p)
27*3e12c5d1SDavid du Colombier {
28*3e12c5d1SDavid du Colombier 	p->next = freelist;
29*3e12c5d1SDavid du Colombier 	freelist = p;
30*3e12c5d1SDavid du Colombier }
31*3e12c5d1SDavid du Colombier 
32*3e12c5d1SDavid du Colombier void
growbuf(Bufblock * p)33*3e12c5d1SDavid du Colombier growbuf(Bufblock *p)
34*3e12c5d1SDavid du Colombier {
35*3e12c5d1SDavid du Colombier 	int n;
36*3e12c5d1SDavid du Colombier 	Bufblock *f;
37*3e12c5d1SDavid du Colombier 	char *cp;
38*3e12c5d1SDavid du Colombier 
39*3e12c5d1SDavid du Colombier 	n = p->end-p->start+QUANTA;
40*3e12c5d1SDavid du Colombier 		/* search the free list for a big buffer */
41*3e12c5d1SDavid du Colombier 	for (f = freelist; f; f = f->next) {
42*3e12c5d1SDavid du Colombier 		if (f->end-f->start >= n) {
43*3e12c5d1SDavid du Colombier 			memcpy(f->start, p->start, p->end-p->start);
44*3e12c5d1SDavid du Colombier 			cp = f->start;
45*3e12c5d1SDavid du Colombier 			f->start = p->start;
46*3e12c5d1SDavid du Colombier 			p->start = cp;
47*3e12c5d1SDavid du Colombier 			cp = f->end;
48*3e12c5d1SDavid du Colombier 			f->end = p->end;
49*3e12c5d1SDavid du Colombier 			p->end = cp;
50*3e12c5d1SDavid du Colombier 			f->current = f->start;
51*3e12c5d1SDavid du Colombier 			break;
52*3e12c5d1SDavid du Colombier 		}
53*3e12c5d1SDavid du Colombier 	}
54*3e12c5d1SDavid du Colombier 	if (!f) {		/* not found - grow it */
55*3e12c5d1SDavid du Colombier 		p->start = Realloc(p->start, n);
56*3e12c5d1SDavid du Colombier 		p->end = p->start+n;
57*3e12c5d1SDavid du Colombier 	}
58*3e12c5d1SDavid du Colombier 	p->current = p->start+n-QUANTA;
59*3e12c5d1SDavid du Colombier }
60*3e12c5d1SDavid du Colombier 
61*3e12c5d1SDavid du Colombier void
bufcpy(Bufblock * buf,char * cp,int n)62*3e12c5d1SDavid du Colombier bufcpy(Bufblock *buf, char *cp, int n)
63*3e12c5d1SDavid du Colombier {
64*3e12c5d1SDavid du Colombier 
65*3e12c5d1SDavid du Colombier 	while (n--)
66*3e12c5d1SDavid du Colombier 		insert(buf, *cp++);
67*3e12c5d1SDavid du Colombier }
68*3e12c5d1SDavid du Colombier 
69*3e12c5d1SDavid du Colombier void
insert(Bufblock * buf,int c)70*3e12c5d1SDavid du Colombier insert(Bufblock *buf, int c)
71*3e12c5d1SDavid du Colombier {
72*3e12c5d1SDavid du Colombier 
73*3e12c5d1SDavid du Colombier 	if (buf->current >= buf->end)
74*3e12c5d1SDavid du Colombier 		growbuf(buf);
75*3e12c5d1SDavid du Colombier 	*buf->current++ = c;
76*3e12c5d1SDavid du Colombier }
77*3e12c5d1SDavid du Colombier 
78*3e12c5d1SDavid du Colombier void
rinsert(Bufblock * buf,Rune r)79*3e12c5d1SDavid du Colombier rinsert(Bufblock *buf, Rune r)
80*3e12c5d1SDavid du Colombier {
81*3e12c5d1SDavid du Colombier 	int n;
82*3e12c5d1SDavid du Colombier 
83*3e12c5d1SDavid du Colombier 	n = runelen(r);
84*3e12c5d1SDavid du Colombier 	if (buf->current+n > buf->end)
85*3e12c5d1SDavid du Colombier 		growbuf(buf);
86*3e12c5d1SDavid du Colombier 	runetochar(buf->current, &r);
87*3e12c5d1SDavid du Colombier 	buf->current += n;
88*3e12c5d1SDavid du Colombier }
89