#include "xwrap.h" #ifndef L4LIB_DYNAMIC_ARRAY #define L4LIB_DYNAMIC_ARRAY #include /* 取得 FILE */ /*********** 一維陣列 ***********/ typedef struct l4lib_dyn_arr{ int arr_itemsize; /* 每個項目的大小 */ int arr_curlen; /* 陣列總長度 */ int arr_maxlen; /* 陣列最大長度 */ void* arr_data; /* 資料區 */ } Array ; Array* array_create_setmax(int, int, int); Array* array_create(int, int); void array_free(Array*); int array_pushback(Array*, const void*); #define array_popback(arr) (((arr)->arr_curlen)--) #define array_getlen(arr) ((arr)->arr_curlen) int array_setlen(Array*, int); #define array_getmax(arr) ((arr)->arr_maxlen) int array_setmax(Array*, int); int array_strip(Array*); #define array_itemsize(arr) ((arr)->arr_itemsize) #define array_data(arr) ((arr)->arr_data) #define array_v(arr, type, num) \ (*(((type*)((arr)->arr_data))+(num))) #define array_vp(arr, num) \ ((void*)(((char*)((arr)->arr_data))+(((arr)->arr_itemsize)*(num)))) #define array_readline() (array_filereadline_delim(stdin, '\n')) #define array_readline_delim(delim) (array_filereadline_delim(stdin, (delim))) #define array_filereadline(infile) (array_filereadline_delim((infile), '\n')) Array* array_filereadline_delim(FILE*, int); Array* array_dup(const Array*); int array_combine(Array*, const Array*); void* array_drop_struct(Array*); Array* array_make_struct(void*, int, int, int); /*********** 二維陣列 (其實是用一維陣列來模擬,功能有限) ***********/ typedef struct l4lib_dyn_2darr{ int arr_itemsize; /* 每個項目的大小 */ int arr_lenx; /* 陣列 x 方向長度 */ int arr_leny; /* 陣列 y 方向長度 */ void* arr_data; /* 資料區 */ } ArrayTwo ; ArrayTwo* array_two_create(int, int, int); void array_two_free(ArrayTwo*); #define array_two_getlenx(arr) ((arr)->arr_lenx) #define array_two_getleny(arr) ((arr)->arr_leny) #define array_two_itemsize(arr) ((arr)->arr_itemsize) #define array_two_data(arr) ((arr)->arr_data) #define array_two_v(arr, type, numx, numy) \ (*(((type*)((arr)->arr_data))+((numx)*(array_two_getleny(arr)))+(numy))) #define array_two_vp(arr, numx, numy) \ ((void*)(((char*)((arr)->arr_data))+ \ ((arr)->arr_itemsize)*((numx)*(array_two_getleny(arr))+(numy)))) #endif