mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-24 11:41:58 +00:00
88 lines
1.3 KiB
C
88 lines
1.3 KiB
C
#include "mk.h"
|
|
|
|
static Bufblock *freelist;
|
|
#define QUANTA 4096
|
|
|
|
Bufblock *
|
|
newbuf(void)
|
|
{
|
|
Bufblock *p;
|
|
|
|
if (freelist) {
|
|
p = freelist;
|
|
freelist = freelist->next;
|
|
} else {
|
|
p = (Bufblock *) Malloc(sizeof(Bufblock));
|
|
p->start = Malloc(QUANTA*sizeof(*p->start));
|
|
p->end = p->start+QUANTA;
|
|
}
|
|
p->current = p->start;
|
|
*p->start = 0;
|
|
p->next = 0;
|
|
return p;
|
|
}
|
|
|
|
void
|
|
freebuf(Bufblock *p)
|
|
{
|
|
p->next = freelist;
|
|
freelist = p;
|
|
}
|
|
|
|
void
|
|
growbuf(Bufblock *p)
|
|
{
|
|
int n;
|
|
Bufblock *f;
|
|
char *cp;
|
|
|
|
n = p->end-p->start+QUANTA;
|
|
/* search the free list for a big buffer */
|
|
for (f = freelist; f; f = f->next) {
|
|
if (f->end-f->start >= n) {
|
|
memcpy(f->start, p->start, p->end-p->start);
|
|
cp = f->start;
|
|
f->start = p->start;
|
|
p->start = cp;
|
|
cp = f->end;
|
|
f->end = p->end;
|
|
p->end = cp;
|
|
f->current = f->start;
|
|
break;
|
|
}
|
|
}
|
|
if (!f) { /* not found - grow it */
|
|
p->start = Realloc(p->start, n);
|
|
p->end = p->start+n;
|
|
}
|
|
p->current = p->start+n-QUANTA;
|
|
}
|
|
|
|
void
|
|
bufcpy(Bufblock *buf, char *cp, int n)
|
|
{
|
|
|
|
while (n--)
|
|
insert(buf, *cp++);
|
|
}
|
|
|
|
void
|
|
insert(Bufblock *buf, int c)
|
|
{
|
|
|
|
if (buf->current >= buf->end)
|
|
growbuf(buf);
|
|
*buf->current++ = c;
|
|
}
|
|
|
|
void
|
|
rinsert(Bufblock *buf, Rune r)
|
|
{
|
|
int n;
|
|
|
|
n = runelen(r);
|
|
if (buf->current+n > buf->end)
|
|
growbuf(buf);
|
|
runetochar(buf->current, &r);
|
|
buf->current += n;
|
|
}
|