home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / n / nuweb / Source / src / arena_c next >
Encoding:
Text File  |  1997-02-25  |  975 b   |  50 lines

  1. #include "global.h"
  2. typedef struct chunk {
  3.   struct chunk *next;
  4.   char *limit;
  5.   char *avail;
  6. } Chunk;
  7. static Chunk first = { NULL, NULL, NULL };
  8. static Chunk *arena = &first;
  9. void *arena_getmem(size_t n)
  10. {
  11.   char *q;
  12.   char *p = arena->avail;
  13.   n = (n + 7) & ~7;             /* ensuring alignment to 8 bytes */
  14.   q = p + n;
  15.   if (q <= arena->limit) {
  16.     arena->avail = q;
  17.     return p;
  18.   }
  19.   {
  20.     Chunk *ap = arena;
  21.     Chunk *np = ap->next;
  22.     while (np) {
  23.       char *v = sizeof(Chunk) + (char *) np;
  24.       if (v + n <= np->limit) {
  25.         np->avail = v + n;
  26.         arena = np;
  27.         return v;
  28.       }
  29.       ap = np;
  30.       np = ap->next;
  31.     }
  32.     {
  33.       size_t m = n + 16384;
  34.       np = (Chunk *) malloc(m);
  35.       np->limit = m + (char *) np;
  36.       np->avail = n + sizeof(Chunk) + (char *) np;
  37.       np->next = NULL;
  38.       ap->next = np;
  39.       arena = np;
  40.       return sizeof(Chunk) + (char *) np;
  41.     }
  42.     
  43.   }
  44.   
  45. }
  46. void arena_free(void)
  47. {
  48.   arena = &first;
  49. }
  50.