Blame


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