1 #define MODULE_LOG_PREFIX "array"
4 #include "oscam-string.h"
6 void array_clear(void **arr_data
, int32_t *arr_num_entries
)
16 bool array_clone(void **src_arr_data
, int32_t *src_arr_num_entries
, uint32_t entry_size
, void **dst_arr_data
, int32_t *dst_arr_num_entries
)
18 array_clear(dst_arr_data
, dst_arr_num_entries
);
19 if (!src_arr_data
|| !dst_arr_data
|| !*src_arr_data
)
21 if (!cs_malloc(dst_arr_data
, *src_arr_num_entries
* entry_size
))
23 memcpy(*dst_arr_data
, *src_arr_data
, *src_arr_num_entries
* entry_size
);
24 *dst_arr_num_entries
= *src_arr_num_entries
;
28 bool array_add(void **arr_data
, int32_t *arr_num_entries
, uint32_t entry_size
, void *new_entry
)
30 if (!cs_realloc(arr_data
, (*arr_num_entries
+ 1) * entry_size
))
32 memcpy(*arr_data
+ (*arr_num_entries
* entry_size
), new_entry
, entry_size
);
33 *arr_num_entries
+= 1;
37 /* Array functions for different types */
38 #define DECLARE_ARRAY_FUNCS(NAME, BASE_TYPE, DATA_TYPE, DATA_FIELD, NUM_FIELD) \
39 void NAME##_clear(BASE_TYPE *in) \
42 void *pin = in->DATA_FIELD; /* Prevent warnings about strict-aliasing rules */ \
43 array_clear(&pin, &in->NUM_FIELD); \
44 in->DATA_FIELD = pin; \
47 bool NAME##_clone(BASE_TYPE *src, BASE_TYPE *dst) \
49 if (!src || !dst) return false; \
50 void *psrc = src->DATA_FIELD, *pdst = dst->DATA_FIELD; /* Prevent warnings about strict-aliasing rules */ \
51 bool ret = array_clone(&psrc, &src->NUM_FIELD, sizeof(*src->DATA_FIELD), &pdst, &dst->NUM_FIELD); \
52 dst->DATA_FIELD = pdst; \
56 bool NAME##_add(BASE_TYPE *in, DATA_TYPE *td) \
58 if (!in) return false; \
59 void *pin = in->DATA_FIELD; /* Prevent warnings about strict-aliasing rules */ \
60 bool ret = array_add(&pin, &in->NUM_FIELD, sizeof(*in->DATA_FIELD), td); \
61 in->DATA_FIELD = pin; \
65 DECLARE_ARRAY_FUNCS(ftab
, FTAB
, FILTER
, filts
, nfilts
); // Declare ftab_clear(), ftab_clone(), ftab_add()
66 DECLARE_ARRAY_FUNCS(tuntab
, TUNTAB
, TUNTAB_DATA
, ttdata
, ttnum
); // Declare tuntab_clear(), tuntab_clone(), tuntab_add()
67 DECLARE_ARRAY_FUNCS(ecm_whitelist
, ECM_WHITELIST
, ECM_WHITELIST_DATA
, ewdata
, ewnum
); // Declare ecm_whitelist_clear(), ecm_whitelist_clone(), ecm_whitelist_add()
68 DECLARE_ARRAY_FUNCS(ecm_hdr_whitelist
, ECM_HDR_WHITELIST
, ECM_HDR_WHITELIST_DATA
, ehdata
, ehnum
); // Declare ecm_hdr_whitelist_clear(), ecm_hdr_whitelist_clone(), ecm_hdr_whitelist_add()
69 DECLARE_ARRAY_FUNCS(caidvaluetab
, CAIDVALUETAB
, CAIDVALUETAB_DATA
, cvdata
, cvnum
); // Declare caidvaluetab_clear(), caidvaluetab_clone(), caidvaluetab_add()
70 DECLARE_ARRAY_FUNCS(caidtab
, CAIDTAB
, CAIDTAB_DATA
, ctdata
, ctnum
); // Declare caidtab_clear(), caidtab_clone(), caidtab_add()
71 DECLARE_ARRAY_FUNCS(cecspvaluetab
, CECSPVALUETAB
, CECSPVALUETAB_DATA
, cevdata
, cevnum
); // Declare cecspvaluetab_clear(), cecspvaluetab_clone(), cecspvaluetab_add()
72 DECLARE_ARRAY_FUNCS(cwcheckvaluetab
, CWCHECKTAB
, CWCHECKTAB_DATA
, cwcheckdata
, cwchecknum
); // Declare cwcheckvaluetab_clear(), cwcheckvaluetab_clone(), cwcheckvaluetab_add()
74 #undef DECLARE_ARRAY_FUNCS