diff --git a/common/uipriv.h b/common/uipriv.h index 629366e5..335b7094 100644 --- a/common/uipriv.h +++ b/common/uipriv.h @@ -30,31 +30,11 @@ extern bool uiprivSysCheckThread(void); // alloc.c #define sharedbitsPrefix uipriv #include "../sharedbits/alloc_header.h" -typedef struct uiprivArray uiprivArray; -struct uiprivArray { - void *buf; - size_t len; - size_t cap; - size_t elemsize; - size_t nGrow; - const char *what; -}; +#include "../sharedbits/array_header.h" #define uiprivArrayStaticInit(T, grow, whatstr) { NULL, 0, 0, sizeof (T), grow, whatstr } -#define uiprivArrayInit(arr, T, grow, whatstr) \ - memset(&(arr), 0, sizeof (uiprivArray)); \ - arr.elemsize = sizeof (T); \ - arr.nGrow = grow; \ - arr.what = whatstr; -#define uiprivArrayFree(arr) \ - uiprivFree(arr.buf); \ - memset(&arr, 0, sizeof (uiprivArray)); +#define uiprivArrayInit(arr, T, nGrow, what) uiprivArrayInitFull(&(arr), sizeof (T), nGrow, what) +#define uiprivArrayFree(arr) uiprivArrayFreeFull(&(arr)) #define uiprivArrayAt(arr, T, n) (((T *) (arr.buf)) + (n)) -extern void *uiprivArrayAppend(uiprivArray *arr, size_t n); -extern void *uiprivArrayInsertAt(uiprivArray *arr, size_t pos, size_t n); -extern void uiprivArrayDelete(uiprivArray *arr, size_t pos, size_t n); -extern void uiprivArrayDeleteItem(uiprivArray *arr, void *p, size_t n); -extern void *uiprivArrayBsearch(const uiprivArray *arr, const void *key, int (*compare)(const void *, const void *)); -extern void uiprivArrayQsort(uiprivArray *arr, int (*compare)(const void *, const void *)); #undef sharedbitsPrefix // errors.c diff --git a/sharedbits/array_header.h b/sharedbits/array_header.h index 268be7e4..22f46255 100644 --- a/sharedbits/array_header.h +++ b/sharedbits/array_header.h @@ -3,4 +3,33 @@ #include "start.h" +typedef struct sharedbitsPrefixName(Array) sharedbitsPrefixName(Array); + +struct sharedbitsPrefixName(Array) { + void *buf; + size_t len; + size_t cap; + size_t elemsize; + size_t nGrow; + const char *what; +}; + +extern void sharedbitsPrefixName(ArrayInitFull)(sharedbitsPrefixName(Array) *arr, size_t elemsize, size_t nGrow, const char *what); +extern void sharedbitsPrefixName(ArrayFreeFull)(sharedbitsPrefixName(Array) *arr); +extern void *sharedbitsPrefixName(ArrayAppend)(sharedbitsPrefixName(Array) *arr, size_t n); +extern void *sharedbitsPrefixName(ArrayInsertAt)(sharedbitsPrefixName(Array) *arr, size_t pos, size_t n); +extern void sharedbitsPrefixName(ArrayDelete)(sharedbitsPrefixName(Array) *arr, size_t pos, size_t n); +extern void sharedbitsPrefixName(ArrayDeleteItem)(sharedbitsPrefixName(Array) *arr, void *p, size_t n); +extern void *sharedbitsPrefixName(ArrayBsearch)(const sharedbitsPrefixName(Array) *arr, const void *key, int (*compare)(const void *, const void *)); +extern void sharedbitsPrefixName(ArrayQsort)(sharedbitsPrefixName(Array) *arr, int (*compare)(const void *, const void *)); + +/* +you may also want to define the following: + +#define sharedbitsPrefixName(StaticInit)(T, nGrow, what) { NULL, 0, 0, sizeof (T), nGrow, what } +#define sharedbitsPrefixName(Init)(arr, T, nGrow, what) sharedbitsPrefixName(InitFull)(&(arr), sizeof (T), nGrow, what) +#define sharedbitsPrefixName(ArrayFree)(arr) sharedbitsPrefixName(ArrayFreeFull)(&(arr)) +#define sharedbitsPrefixName(ArrayAt)(arr, T, n) (((T *) (arr.buf)) + (n)) +*/ + #include "end.h" diff --git a/sharedbits/array_impl.h b/sharedbits/array_impl.h index 4d476408..8b736594 100644 --- a/sharedbits/array_impl.h +++ b/sharedbits/array_impl.h @@ -3,4 +3,18 @@ #include "start.h" +void sharedbitsPrefixName(ArrayInitFull)(sharedbitsPrefixName(Array) *arr, size_t elemsize, size_t nGrow, const char *what) +{ + memset(arr, 0, sizeof (sharedbitsPrefixName(Array))); + arr->elemsize = elemsize; + arr->nGrow = nGrow; + arr->what = what; +} + +void sharedbitsPrefixName(ArrayFreeFull)(sharedbitsPrefixName(Array) *arr) +{ + sharedbitsPrefixName(Free)(arr->buf); + memset(arr, 0, sizeof (sharedbitsPrefixName(Array))); +} + #include "end.h" diff --git a/test/lib/testingpriv.h b/test/lib/testingpriv.h index c8f655d0..8bf04ac7 100644 --- a/test/lib/testingpriv.h +++ b/test/lib/testingpriv.h @@ -9,31 +9,11 @@ extern void testingprivInternalError(const char *fmt, ...); #define testingprivNewArray(T, n) ((T *) testingprivAlloc(n * sizeof (T), #T "[]")) #define testingprivResizeArray(x, T, old, new) ((T *) testingprivRealloc(x, old * sizeof (T), new * sizeof (T), #T "[]")) -typedef struct testingprivArray testingprivArray; -struct testingprivArray { - void *buf; - size_t len; - size_t cap; - size_t elemsize; - size_t nGrow; - const char *what; -}; -#define testingprivArrayStaticInit(T, grow, whatstr) { NULL, 0, 0, sizeof (T), grow, whatstr } -#define testingprivArrayInit(arr, T, grow, whatstr) \ - memset(&(arr), 0, sizeof (testingprivArray)); \ - arr.elemsize = sizeof (T); \ - arr.nGrow = grow; \ - arr.what = whatstr; -#define testingprivArrayFree(arr) \ - testingprivFree(arr.buf); \ - memset(&arr, 0, sizeof (testingprivArray)); +#include "../../sharedbits/array_header.h" +#define testingprivArrayStaticInit(T, nGrow, what) { NULL, 0, 0, sizeof (T), nGrow, what } +#define testingprivArrayInit(arr, T, nGrow, what) testingprivArrayInitFull(&(arr), sizeof (T), nGrow, what) +#define testingprivArrayFree(arr) testingprivArrayFreeFull(&(arr)) #define testingprivArrayAt(arr, T, n) (((T *) (arr.buf)) + (n)) -extern void *testingprivArrayAppend(testingprivArray *arr, size_t n); -extern void *testingprivArrayInsertAt(testingprivArray *arr, size_t pos, size_t n); -extern void testingprivArrayDelete(testingprivArray *arr, size_t pos, size_t n); -extern void testingprivArrayDeleteItem(testingprivArray *arr, void *p, size_t n); -extern void *testingprivArrayBsearch(const testingprivArray *arr, const void *key, int (*compare)(const void *, const void *)); -extern void testingprivArrayQsort(testingprivArray *arr, int (*compare)(const void *, const void *)); #undef sharedbitsPrefix