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