aboutsummaryrefslogblamecommitdiffstats
path: root/basic/l4basic.h
blob: 9c9cd3ccdcb495e10ba9d5d1ffa41937de79f0ca (plain) (tree)

















































































































































                                                                                         

#ifndef L4LIB_DYNAMIC_ARRAY
#define L4LIB_DYNAMIC_ARRAY

#include <stdio.h> /* 取得 FILE */

#if 0 
/* 這兩個常數僅供 create 類函式作為參數使用*/
#define L4DARR_NONE 0   /* 起始大小為零 */
#define L4DARR_AUTO -1  /* 自動決定起始大小 */
#endif

/*********** 一維陣列 ***********/

typedef struct l4lib_dyn_arr{
    int arr_itemsize;       /* 每個項目的大小 */
    int arr_curlen;         /* 陣列總長度 */
    int arr_maxlen;         /* 陣列最大長度 */
    void* arr_data;         /* 資料區 */
} L4DA ;

L4DA* l4da_create_setmax(int, int, int);
/* #define l4da_create(itemsize, len) \
    (l4da_create_setmax((itemsize), (len), (len))) */
L4DA* l4da_create(int, int);
void l4da_free(L4DA*);
int l4da_pushback(L4DA*, void*);
#define l4da_popback(arr) (((arr)->arr_curlen)--)
#define l4da_getlen(arr) ((arr)->arr_curlen)
int l4da_setlen(L4DA*, int);
#define l4da_getmax(arr) ((arr)->arr_maxlen)
int l4da_setmax(L4DA*, int);
int l4da_strip(L4DA*);
#define l4da_itemsize(arr) ((arr)->arr_itemsize)
#define l4da_v(arr, type, num) \
    (*(((type*)((arr)->arr_data))+(num)))
#define l4da_vp(arr, num) \
    ((void*)(((char*)((arr)->arr_data))+(((arr)->arr_itemsize)*(num))))

#define l4da_readline (l4da_filereadline_delim(stdin, '\n'))
#define l4da_readline_delim(delim) (l4da_filereadline_delim(stdin, (delim)))
#define l4da_filereadline(infile) (l4da_filereadline_delim((infile), '\n'))
L4DA* l4da_filereadline_delim(FILE*, int);

L4DA* l4da_dup(const L4DA*);
int l4da_combine(L4DA*, const L4DA*);

/*********** 二維陣列 (其實是用一維陣列來模擬,功能有限) ***********/

typedef struct l4lib_dyn_2darr{
    int arr_itemsize;       /* 每個項目的大小 */
    int arr_lenx;           /* 陣列 x 方向長度 */
    int arr_leny;       /* 陣列 y 方向長度 */
    void* arr_data;         /* 資料區 */
} L4DA2 ;

L4DA2* l4da2_create(int, int, int);
void l4da2_free(L4DA2*);
#define l4da2_getlenx(arr) ((arr)->arr_lenx)
#define l4da2_getleny(arr) ((arr)->arr_leny)
#define l4da2_itemsize(arr) ((arr)->arr_itemsize)
#define l4da2_v(arr, type, numx, numy) \
    (*(((type*)((arr)->arr_data))+((numx)*(l4da2_getlenx(arr)))+(numy)))
#define l4da2_vp(arr, numx, numy) \
    ((void*)(((char*)((arr)->arr_data))+ \
    ((arr)->arr_itemsize)*((numx)*(l4da2_getlenx(arr))+(numy))))

#if 0
typedef struct l4lib_xycoord{ /* 為了方便一次傳兩個數字回來 */
    int x;
    int y;
} L4XY;

typedef struct l4lib_dyn_2darr{
    int arr_itemsize;       /* 每個項目的大小 */
    L4XY arr_curlen;        /* 陣列總長度 */
    L4XY arr_maxlen;        /* 陣列最大長度 */
    void** arr_data;        /* 資料區 */
} L4DA2 ;

L4DA2* l4da2_create_setmax(int, L4XY, L4XY);
/* #define l4da2_create(itemsize, len) \
    (l4da2_create_setmax((itemsize), (len), (len))) */
L4DA2* l4da2_create(int, L4XY);
void l4da2_free(L4DA2*);
L4XY l4da2_getlen(L4DA2*);
int l4da2_setlen(L4DA2*, L4XY);
L4XY l4da2_getmax(L4DA2*);
int l4da2_setmax(L4DA2*, L4XY);
int l4da2_strip(L4DA2*);
#define l4da2_itemsize(arr) ((arr)->arr_itemsize)
#define l4da2_v(arr, type, numx, numy) \
    (*((*(((type**)((arr)->arr_data))+(numx)))+(numy)))
#define l4da2_vp(arr, type, numx, numy) \
    ((*(((type**)((arr)->arr_data))+(numx)))+(numy))
#define l4da2_v_coord(arr, type, num) \
    (l4da2_v((arr), (type), ((num).x)), ((num).y))
#define l4da2_vp_coord(arr, num) \
    (l4da2_vp((arr), (type), ((num).x)), ((num).y))
#endif


/*********** List ***********/

struct l4lib_list_node{ /* list 中每一個項目用的資料結構,會有很多個 */
    struct l4lib_list_node* node_prev;
    struct l4lib_list_node* node_next;
    void* node_data;
};

typedef struct l4lib_list{ /* 管理 list 用的,每個 list 只有一個 */
    struct l4lib_list_node* list_first;
    struct l4lib_list_node* list_last;
    struct l4lib_list_node* list_current;
    int list_prevcount;
    int list_nextcount;
    int list_len;
} L4LL;

/* 這兩個常數僅供 l4ll_remove 使用 */
#define L4LL_PREV 1 /* 刪除後移至上一項 */
#define L4LL_NEXT 2 /* 刪除後移至下一項 */

/* 這兩個常數僅供 l4ll_goto 使用 */
#define L4LL_FRONT 3
#define L4LL_BACK 4

L4LL* l4ll_create(void);
void l4ll_free(L4LL*);
void* l4ll_getcur(L4LL*);
void* l4ll_getback(L4LL*);
void* l4ll_getfront(L4LL*);
int l4ll_pushback(L4LL*, void*);
int l4ll_pushfront(L4LL*, void*);
int l4ll_popback(L4LL*);
int l4ll_popfront(L4LL*);
int l4ll_remove(L4LL*, int);
int l4ll_insprev(L4LL*);
int l4ll_insnext(L4LL*);
int l4ll_goto(L4LL*, int, int);
#define l4ll_getlen(list)
#define l4ll_getc(list)
#define l4ll_getpc(list)
#define l4ll_getnc(list)

#endif