diff options
author | lantw44 <lantw44@gmail.com> | 2012-08-30 00:05:33 +0800 |
---|---|---|
committer | lantw44 <lantw44@gmail.com> | 2012-08-30 00:05:33 +0800 |
commit | 516f31006b9c1b47f85b31deef28b78276f2c4bb (patch) | |
tree | 78c1971b2ca1f48dea81c18c3f31561e93319aba | |
download | l4basic-516f31006b9c1b47f85b31deef28b78276f2c4bb.tar.gz l4basic-516f31006b9c1b47f85b31deef28b78276f2c4bb.tar.zst l4basic-516f31006b9c1b47f85b31deef28b78276f2c4bb.zip |
Initial commit - copy project files
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | l4arg/Makefile | 14 | ||||
-rw-r--r-- | l4bds/Makefile | 14 | ||||
-rw-r--r-- | l4bds/l4bds.h | 65 | ||||
-rw-r--r-- | l4darr/Makefile | 14 | ||||
-rw-r--r-- | l4darr/d1array.c | 110 | ||||
-rw-r--r-- | l4darr/d1arrstr.c | 43 | ||||
-rw-r--r-- | l4darr/d2array.c | 9 | ||||
-rw-r--r-- | l4darr/l4darr.h | 61 |
9 files changed, 342 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cc3afdc --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +.PHONY: all clean install uninstall +all: + $(MAKE) -C l4darr all + $(MAKE) -C l4bds all + $(MAKE) -C l4arg all +clean: + $(MAKE) -C l4darr clean + $(MAKE) -C l4bds clean + $(MAKE) -C l4arg clean +install: + @echo "You should statically link your program against it instead of installing it!" + diff --git a/l4arg/Makefile b/l4arg/Makefile new file mode 100644 index 0000000..001a7e9 --- /dev/null +++ b/l4arg/Makefile @@ -0,0 +1,14 @@ +CC=cc +AR=ar +RM=rm +CFLAGS=-Wall -g -I. +OBJ= +LIBFILE=l4arg.a + +.PHONY: all clean + +all: $(LIBFILE) +$(LIBFILE): $(OBJ) + $(AR) rcs $(LIBFILE) $(OBJ) +clean: + $(RM) -f $(LIBFILE) $(OBJ) diff --git a/l4bds/Makefile b/l4bds/Makefile new file mode 100644 index 0000000..07c4235 --- /dev/null +++ b/l4bds/Makefile @@ -0,0 +1,14 @@ +CC=cc +AR=ar +RM=rm +CFLAGS=-Wall -g -I. +OBJ= +LIBFILE=l4bds.a + +.PHONY: all clean + +all: $(LIBFILE) +$(LIBFILE): $(OBJ) + $(AR) rcs $(LIBFILE) $(OBJ) +clean: + $(RM) -f $(LIBFILE) $(OBJ) diff --git a/l4bds/l4bds.h b/l4bds/l4bds.h new file mode 100644 index 0000000..31cd747 --- /dev/null +++ b/l4bds/l4bds.h @@ -0,0 +1,65 @@ +#ifndef L4LIB_BASIC_DATA_STRUCTURE +#define L4LIB_BASIC_DATA_STRUCTURE + +/*********** 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) + +/*********** stack ***********/ + +#define l4stack_create() +#define l4stack_push(list, value) +#define l4stack_pop(list) +#define l4stack_getlen(list) +#define l4stack_value(list) +#define l4stack_free(list) + +/*********** queue ***********/ + +#define l4queue_create() +#define l4queue_push(list, value) +#define l4queue_pop(list) +#define l4queue_getlen(list) +#define l4queue_value(list) +#define l4queue_free(list) + +#endif diff --git a/l4darr/Makefile b/l4darr/Makefile new file mode 100644 index 0000000..ecb479c --- /dev/null +++ b/l4darr/Makefile @@ -0,0 +1,14 @@ +CC=cc +AR=ar +RM=rm +CFLAGS=-Wall -g -I. +OBJ=d1array.o d1arrstr.o d2array.o +LIBFILE=l4darr.a + +.PHONY: all clean + +all: $(LIBFILE) +$(LIBFILE): $(OBJ) + $(AR) rcs $(LIBFILE) $(OBJ) +clean: + $(RM) -f $(LIBFILE) $(OBJ) diff --git a/l4darr/d1array.c b/l4darr/d1array.c new file mode 100644 index 0000000..99d646f --- /dev/null +++ b/l4darr/d1array.c @@ -0,0 +1,110 @@ +#include <stdlib.h> +#include <string.h> +#include <l4darr.h> + +L4DA* l4da_create_setmax(int itemsize, int len, int maxlen){ + if(itemsize <= 0 || len < 0 || maxlen < len){ + return NULL; + } + L4DA* arr = (L4DA*)malloc(sizeof(L4DA)); + if(arr == NULL){ + return NULL; + } + arr->arr_itemsize = itemsize; + arr->arr_curlen = len; + arr->arr_maxlen = maxlen; + if(maxlen != 0){ + arr->arr_data = malloc(itemsize * maxlen); + if(arr->arr_data == NULL){ + free(arr); + return NULL; + } + }else{ + arr->arr_data = NULL; + } + return arr; +} + +L4DA* l4da_create(int itemsize, int len){ + return l4da_create_setmax(itemsize, len, len); +} + +void l4da_free(L4DA* arr){ + if(arr->arr_data != NULL){ + free(arr->arr_data); + } + free(arr); +} + +int l4da_pushback(L4DA* arr, void* data){ + if((arr->arr_maxlen) < (arr->arr_curlen + 1)){ + if(arr->arr_maxlen != 0){ + if(l4da_setmax(arr, arr->arr_maxlen*2) < 0){ + return -1; + } + }else{ + if(l4da_setmax(arr, 1) < 0){ + return -1; + } + } + } + memcpy(l4da_vp(arr, arr->arr_curlen), data, arr->arr_itemsize); + arr->arr_curlen++; + return 0; +} + +int l4da_setlen(L4DA* arr, int len){ + if(len > (arr->arr_maxlen)){ + if(l4da_setmax(arr, len) < 0){ + return -1; + }else{ + arr->arr_curlen = len; + } + }else{ + arr->arr_curlen = len; + return 0; + } + return 0; +} + +int l4da_setmax(L4DA* arr, int max){ + void* newptr; + if(arr->arr_data == NULL){ + newptr = malloc((arr->arr_itemsize)*max); + if(newptr == NULL){ + return -1; + }else{ + arr->arr_maxlen = max; + arr->arr_data = newptr; + return 0; + } + } + newptr = realloc(arr->arr_data, (arr->arr_itemsize)*max); + if(newptr == NULL){ + return -1; + }else{ + arr->arr_maxlen = max; + arr->arr_data = newptr; + } + return 0; +} + +int l4da_strip(L4DA* arr){ + if(arr->arr_data == NULL){ + return 0; + } + L4DA* newptr; + /* 其實縮小空間營該一定會成功才對...... + * 不過還是保險一點,加個判斷式,別說 memory leak 是我害的 + * 當然也是避免編譯器一直跳 warning + */ + if((arr->arr_maxlen) > (arr->arr_curlen)){ + arr->arr_maxlen = arr->arr_curlen; + newptr = realloc(arr->arr_data, (arr->arr_curlen)*(arr->arr_itemsize)); + if(newptr == NULL){ + return -1; + } + arr->arr_data = newptr; + } + return 0; +} diff --git a/l4darr/d1arrstr.c b/l4darr/d1arrstr.c new file mode 100644 index 0000000..212760e --- /dev/null +++ b/l4darr/d1arrstr.c @@ -0,0 +1,43 @@ +#include <string.h> +#include <l4darr.h> + +L4DA* l4da_dup(const L4DA* arr){ + L4DA* newarr = l4da_create_setmax( + l4da_itemsize(arr), l4da_getlen(arr), l4da_getmax(arr)); + if(newarr == NULL){ + return NULL; + } + memcpy(newarr->arr_data, arr->arr_data, + l4da_getlen(arr) * l4da_itemsize(arr)); + return newarr; +} + +int l4da_combine(L4DA* arr, const L4DA* att){ + if(l4da_itemsize(arr) != l4da_itemsize(att)){ + return -2; + } + if(l4da_setlen(arr, l4da_getlen(arr) + l4da_getlen(att)) < 0){ + return -1; + } + memcpy(l4da_vp(arr, l4da_getlen(arr)), att->arr_data, + l4da_getlen(att) * l4da_itemsize(att)); + return 0; +} + +L4DA* l4da_filereadline_delim(FILE* infile, int chr){ + L4DA* newarr = l4da_create(1, 0); + if(newarr == NULL){ + return NULL; + } + int c; + char towrite; + do{ + c = getc(infile); + towrite = c; + if(l4da_pushback(newarr, (void*)&towrite) < 0){ + l4da_free(newarr); + return NULL; + } + }while(c != chr); + return newarr; +} diff --git a/l4darr/d2array.c b/l4darr/d2array.c new file mode 100644 index 0000000..d0dc88f --- /dev/null +++ b/l4darr/d2array.c @@ -0,0 +1,9 @@ +#include <stdlib.h> +#include <l4darr.h> + +L4DA2* l4da2_create_setmax(int itemsize, L4XY len, L4XY maxlen){ + if(len.x < 0 || len.y < 0 || maxlen.x < 0 || maxlen.y < 0) + return NULL; + } + L4DA2* arr = (L4DA2*)malloc(); +} diff --git a/l4darr/l4darr.h b/l4darr/l4darr.h new file mode 100644 index 0000000..fd2d267 --- /dev/null +++ b/l4darr/l4darr.h @@ -0,0 +1,61 @@ +#ifndef L4LIB_DYNAMIC_ARRAY +#define L4LIB_DYNAMIC_ARRAY + +#include <stdio.h> /* 取得 FILE */ + +/*********** 一維陣列 ***********/ + +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)))) + +#endif |