1 /* darray.h - implement dynamically growing arrays
2  *
3  * Copyright (C) 1998  Jochen Voss.
4  *
5  * $Id: darray.h 4838 2003-04-13 16:43:32Z voss $ */
6 
7 #ifndef FILE_DARRAY_H_SEEN
8 #define FILE_DARRAY_H_SEEN
9 
10 #include <string.h>
11 
12 #ifndef DA_MALLOC
13 #define DA_MALLOC xmalloc
14 #endif /* not DA_MALLOC */
15 #ifndef DA_REALLOC
16 #define DA_REALLOC xrealloc
17 #endif /* not DA_REALLOC */
18 #ifndef DA_INC
19 #define DA_INC 4
20 #endif /* not DA_INC */
21 
22 #define DA_INIT(x,type) \
23 	do { \
24 	  (x).slots = DA_INC; \
25 	  (x).data = (type*)DA_MALLOC((x).slots*sizeof(type)); \
26 	  (x).used = 0; \
27 	} while(0)
28 
29 #define DA_CLEAR(x) \
30 	(x).used = 0
31 
32 #define DA_ADD(x,type,val) \
33 	do { \
34 	  if ((x).used >= (x).slots) { \
35 	    (x).slots += DA_INC; \
36 	    (x).data = (type*)DA_REALLOC ((x).data, \
37 					  (x).slots*sizeof(type)); \
38 	  } \
39 	  (x).data[(x).used] = val; \
40 	  (x).used += 1; \
41 	} while(0)
42 
43 #define DA_ADD_EMPTY(x,type,ptr) \
44 	do { \
45 	  if ((x).used >= (x).slots) { \
46 	    (x).slots += DA_INC; \
47 	    (x).data = (type*)DA_REALLOC ((x).data, \
48 					  (x).slots*sizeof(type)); \
49 	  } \
50 	  ptr = (x).data+(x).used; \
51 	  (x).used += 1; \
52 	} while(0)
53 
54 #define DA_REMOVE(x,type,idx) \
55 	do { \
56 	  int _idx = (idx); \
57 	  memmove((x).data+_idx, (x).data+_idx+1, \
58 		  ((x).used-_idx-1)*sizeof(type)); \
59 	  (x).used -= 1; \
60 	} while(0)
61 
62 #define DA_REMOVE_VALUE(x,type,val) \
63 	do { \
64 	  int _i = 0; \
65 	  while (_i < (x).used) { \
66 	    if ((x).data[_i] == (val)) { \
67 	      memmove((x).data+_i, (x).data+_i+1, \
68 		      ((x).used-_i-1)*sizeof(type)); \
69 	      (x).used -= 1; \
70 	    } else { \
71 	      ++_i; \
72 	    } \
73 	  } \
74 	} while(0)
75 
76 #endif /* FILE_DARRAY_H_SEEN */
77