Version bumped to 1.0.0 for the initial release.
[wllib.git] / dyna-add.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include "wllib.h"
4
5 #define DA_QUANTUM (1024)
6
7 struct da_list {
8         struct da_list *succ;
9         unsigned used;
10         da_num a[DA_QUANTUM];
11         } *da_head,*da_putp,*da_read;
12
13 unsigned da_readn;
14 unsigned long da_total;
15
16 #ifdef NEED_DA_POS
17 struct da_pos {
18         struct da_list *read;
19         unsigned readn;
20         };
21
22 void da_putpos(struct da_pos *p)
23 {
24         p->read=da_read;
25         p->readn=da_readn;
26 }
27
28 void da_getpos(struct da_pos *p)
29 {
30         da_read=p->read;
31         da_readn=p->readn;
32 }
33 #endif
34
35 #define da_init
36
37 void da_put(long n)
38 {
39 struct da_list **lpp=NULL;
40         if (!da_head) lpp=&da_head;
41         else if (da_putp->used==DA_QUANTUM) lpp=&da_putp->succ;
42         if (lpp) {
43                 if (!(da_putp=malloc(sizeof(*da_putp)))) iofail();
44                 (*lpp=da_putp)->succ=NULL;
45                 da_putp->used=0;
46                 }
47         da_putp->a[da_putp->used++]=n;
48         da_total++;
49 }
50
51 void da_reset(void)
52 {
53         da_read=da_head;
54         da_readn=0;
55 }
56
57 int da_get(long *n)
58 {
59         if (da_read) {
60                 *n=da_read->a[da_readn++];
61                 if (da_readn==da_read->used) {
62                         da_read=da_read->succ;
63                         da_readn=0;
64                         }
65                 return(1);
66                 }
67         return(0);
68 }