fe13331998-03-03Fredrik Hübinette (Hubbe) #define INIT_BLOCK(X) #define EXIT_BLOCK(X) #define BLOCK_ALLOC(DATA,BSIZE) \ \ struct PIKE_CONCAT(DATA,_block) \ { \ struct PIKE_CONCAT(DATA,_block) *next; \ struct DATA x[BSIZE]; \ }; \ \ static struct PIKE_CONCAT(DATA,_block) *PIKE_CONCAT(DATA,_blocks)=0; \ static struct DATA *PIKE_CONCAT3(free_,DATA,s)=0; \ \ struct DATA *PIKE_CONCAT(alloc_,DATA)(void) \ { \ struct DATA *tmp; \ if(!PIKE_CONCAT3(free_,DATA,s)) \ { \ struct PIKE_CONCAT(DATA,_block) *n; \ int e; \ n=(struct PIKE_CONCAT(DATA,_block) *)malloc(sizeof(struct PIKE_CONCAT(DATA,_block))); \ if(!n) \ { \ fprintf(stderr,"Fatal: out of memory.\n"); \ exit(17); \ } \ n->next=PIKE_CONCAT(DATA,_blocks); \ PIKE_CONCAT(DATA,_blocks)=n; \ \ for(e=0;e<BSIZE;e++) \ { \ n->x[e].next=PIKE_CONCAT3(free_,DATA,s); \ PIKE_CONCAT3(free_,DATA,s)=n->x+e; \ } \ } \ \ tmp=PIKE_CONCAT3(free_,DATA,s); \ PIKE_CONCAT3(free_,DATA,s)=tmp->next; \ INIT_BLOCK(tmp); \ return tmp; \ } \ \ inline void PIKE_CONCAT(free_,DATA)(struct DATA *d) \ { \ EXIT_BLOCK(d); \ d->next=PIKE_CONCAT3(free_,DATA,s); \ PIKE_CONCAT3(free_,DATA,s)=d; \ } \ \ void PIKE_CONCAT3(free_all_,DATA,_blocks)(void) \ { \ struct PIKE_CONCAT(DATA,_block) *tmp; \ while((tmp=PIKE_CONCAT(DATA,_blocks))) \ { \ PIKE_CONCAT(DATA,_blocks)=tmp->next; \ free((char *)tmp); \ } \ PIKE_CONCAT(DATA,_blocks)=0; \ } \