1 | #define MODULE_LOG_PREFIX "array"
|
---|
2 |
|
---|
3 | #include "globals.h"
|
---|
4 | #include "oscam-string.h"
|
---|
5 |
|
---|
6 | void array_clear(void **arr_data, int32_t *arr_num_entries)
|
---|
7 | {
|
---|
8 | *arr_num_entries = 0;
|
---|
9 | if (arr_data)
|
---|
10 | {
|
---|
11 | free(*arr_data);
|
---|
12 | *arr_data = NULL;
|
---|
13 | }
|
---|
14 | }
|
---|
15 |
|
---|
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)
|
---|
17 | {
|
---|
18 | array_clear(dst_arr_data, dst_arr_num_entries);
|
---|
19 | if (!src_arr_data || !dst_arr_data || !*src_arr_data)
|
---|
20 | return false;
|
---|
21 | if (!cs_malloc(dst_arr_data, *src_arr_num_entries * entry_size))
|
---|
22 | return false;
|
---|
23 | memcpy(*dst_arr_data, *src_arr_data, *src_arr_num_entries * entry_size);
|
---|
24 | *dst_arr_num_entries = *src_arr_num_entries;
|
---|
25 | return true;
|
---|
26 | }
|
---|
27 |
|
---|
28 | bool array_add(void **arr_data, int32_t *arr_num_entries, uint32_t entry_size, void *new_entry)
|
---|
29 | {
|
---|
30 | if (!cs_realloc(arr_data, (*arr_num_entries + 1) * entry_size))
|
---|
31 | return false;
|
---|
32 | memcpy(*arr_data + (*arr_num_entries * entry_size), new_entry, entry_size);
|
---|
33 | *arr_num_entries += 1;
|
---|
34 | return true;
|
---|
35 | }
|
---|
36 |
|
---|
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) \
|
---|
40 | { \
|
---|
41 | if (!in) return; \
|
---|
42 | void *pin = in->DATA_FIELD; /* Prevent warnings about strict-aliasing rules */ \
|
---|
43 | array_clear(&pin, &in->NUM_FIELD); \
|
---|
44 | in->DATA_FIELD = pin; \
|
---|
45 | } \
|
---|
46 | \
|
---|
47 | bool NAME##_clone(BASE_TYPE *src, BASE_TYPE *dst) \
|
---|
48 | { \
|
---|
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; \
|
---|
53 | return ret; \
|
---|
54 | } \
|
---|
55 | \
|
---|
56 | bool NAME##_add(BASE_TYPE *in, DATA_TYPE *td) \
|
---|
57 | { \
|
---|
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; \
|
---|
62 | return ret; \
|
---|
63 | }
|
---|
64 |
|
---|
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()
|
---|
73 |
|
---|
74 | #undef DECLARE_ARRAY_FUNCS
|
---|