#line 938 "nuweb.w" #include "global.h" #line 6512 "nuweb.w" typedef struct chunk { struct chunk *next; char *limit; char *avail; } Chunk; #line 6526 "nuweb.w" static Chunk first = { NULL, NULL, NULL }; static Chunk *arena = &first; #line 6540 "nuweb.w" void *arena_getmem(size_t n) { char *q; char *p = arena->avail; n = (n + 7) & ~7; /* ensuring alignment to 8 bytes */ q = p + n; if (q <= arena->limit) { arena->avail = q; return p; } /* Find a new chunk of memory */ #line 6561 "nuweb.w" { Chunk *ap = arena; Chunk *np = ap->next; while (np) { char *v = sizeof(Chunk) + (char *) np; if (v + n <= np->limit) { np->avail = v + n; arena = np; return v; } ap = np; np = ap->next; } /* Allocate a new chunk of memory */ #line 6581 "nuweb.w" { size_t m = n + 10000; np = (Chunk *) malloc(m); np->limit = m + (char *) np; np->avail = n + sizeof(Chunk) + (char *) np; np->next = NULL; ap->next = np; arena = np; return sizeof(Chunk) + (char *) np; } #line 6574 "nuweb.w" } #line 6550 "nuweb.w" } #line 6598 "nuweb.w" void arena_free(void) { arena = &first; }