#include #include #include "wllib.h" #define DA_QUANTUM (1024) struct da_list { struct da_list *succ; unsigned used; da_num a[DA_QUANTUM]; } *da_head,*da_putp,*da_read; unsigned da_readn; unsigned long da_total; #ifdef NEED_DA_POS struct da_pos { struct da_list *read; unsigned readn; }; void da_putpos(struct da_pos *p) { p->read=da_read; p->readn=da_readn; } void da_getpos(struct da_pos *p) { da_read=p->read; da_readn=p->readn; } #endif #define da_init void da_put(long n) { struct da_list **lpp=NULL; if (!da_head) lpp=&da_head; else if (da_putp->used==DA_QUANTUM) lpp=&da_putp->succ; if (lpp) { if (!(da_putp=malloc(sizeof(*da_putp)))) iofail(); (*lpp=da_putp)->succ=NULL; da_putp->used=0; } da_putp->a[da_putp->used++]=n; da_total++; } void da_reset(void) { da_read=da_head; da_readn=0; } int da_get(long *n) { if (da_read) { *n=da_read->a[da_readn++]; if (da_readn==da_read->used) { da_read=da_read->succ; da_readn=0; } return(1); } return(0); }