aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore14
-rw-r--r--Makefile21
-rw-r--r--l4arg/Makefile24
-rw-r--r--l4arg/qarg.c54
-rw-r--r--l4bds/Makefile24
-rw-r--r--l4darr/Makefile24
-rw-r--r--l4darr/d1arrstr.c47
-rw-r--r--src/Makefile67
-rw-r--r--src/l4arg.c (renamed from l4arg/toargv.c)56
-rw-r--r--src/l4arg.h (renamed from l4arg/l4arg.h)0
-rw-r--r--src/l4array.c (renamed from l4darr/d1array.c)48
-rw-r--r--src/l4array.h (renamed from l4darr/l4darr.h)21
-rw-r--r--src/l4array2.c (renamed from l4darr/d2array.c)2
-rw-r--r--src/l4array2.h25
-rw-r--r--src/l4list.c (renamed from l4bds/list.c)3
-rw-r--r--src/l4list.h (renamed from l4bds/l4bds.h)0
16 files changed, 218 insertions, 212 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..305b898
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+.deps
+.libs
+*~
+*.o
+*.lo
+*.a
+*.la
+*.so
+*.tar
+*.tar.*
+*.swp
+tags
+cscope.out
+\#*\#
diff --git a/Makefile b/Makefile
index b0dd0c8..2667da9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,18 +1,13 @@
-.PHONY: all clean install uninstall
+.PHONY: all clean install uninstall deinstall remove
all:
- $(MAKE) -C l4darr all
- $(MAKE) -C l4bds all
- $(MAKE) -C l4arg all
+ $(MAKE) -C src all
clean:
- $(MAKE) -C l4darr clean
- $(MAKE) -C l4bds clean
- $(MAKE) -C l4arg clean
+ $(MAKE) -C src clean
install:
- $(MAKE) -C l4darr install
- $(MAKE) -C l4bds install
- $(MAKE) -C l4arg install
+ $(MAKE) -C src install
uninstall:
- $(MAKE) -C l4darr uninstall
- $(MAKE) -C l4bds uninstall
- $(MAKE) -C l4arg uninstall
+ $(MAKE) -C src uninstall
+
+deinstall: uninstall
+remove: uninstall
diff --git a/l4arg/Makefile b/l4arg/Makefile
deleted file mode 100644
index 0f2ffe3..0000000
--- a/l4arg/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-CC=cc
-AR=ar
-RM=rm -f
-INSTALL=install -m 644
-LOCAL_CFLAGS=-g
-CFLAGS=-Wall -I. -I../l4darr $(LOCAL_CFLAGS)
-OBJ=toargv.o qarg.o
-LIBFILE=libl4arg.a
-DESTDIR=/
-PREFIX=/usr/local
-LIBDIR=$(DESTDIR)/$(PREFIX)/lib
-
-.PHONY: all clean
-
-all: $(LIBFILE)
-$(LIBFILE): $(OBJ)
- $(AR) rcs $(LIBFILE) $(OBJ)
-clean:
- $(RM) $(LIBFILE) $(OBJ)
-install:
- mkdir -p $(LIBDIR)
- $(INSTALL) $(LIBFILE) $(LIBDIR)
-uninstall:
- $(RM) $(LIBDIR)/$(LIBFILE)
diff --git a/l4arg/qarg.c b/l4arg/qarg.c
deleted file mode 100644
index 412967c..0000000
--- a/l4arg/qarg.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <l4arg.h>
-
-/* 為什麼叫做 qarg 呢?因為這是用來解析很像 QEMU 命令列參數的參數 */
-
-L4QARG* l4qarg_parse(const char* str){
- char** pargv = l4arg_toargv(str, ",", "\"\'", "\\");
- if(pargv == NULL){
- return NULL;
- }
- int i, allc;
- L4QARG* qargarr;
- char* pos;
- for(i=0; pargv[i]!=NULL; i++);
- allc = i + 1;
- qargarr = (L4QARG*) malloc(sizeof(L4QARG) * allc);
- if(qargarr == NULL){
- l4arg_toargv_free(pargv);
- return NULL;
- }
- for(i=0; pargv[i]!=NULL; i++){
- pos = strchr(pargv[i], '=');
- if(pos == NULL){
- qargarr[i].arg_name = pargv[i];
- qargarr[i].arg_value = NULL;
- }else{
- *pos = '\0';
- qargarr[i].arg_name = pargv[i];
- pos++;
- qargarr[i].arg_value = (char*) malloc(strlen(pos)+1);
- if(qargarr[i].arg_value == NULL){
- l4arg_toargv_free(pargv);
- return NULL;
- }
- strcpy(qargarr[i].arg_value, pos);
- }
- }
- free(pargv);
- qargarr[i].arg_name = NULL;
- qargarr[i].arg_value = NULL;
- return qargarr;
-}
-
-void l4qarg_free(L4QARG* qarg){
- int i;
- for(i=0; !(qarg[i].arg_name == NULL && qarg[i].arg_value == NULL); i++){
- free(qarg[i].arg_name);
- if(qarg[i].arg_value != NULL){
- free(qarg[i].arg_value);
- }
- }
- free(qarg);
-}
diff --git a/l4bds/Makefile b/l4bds/Makefile
deleted file mode 100644
index c4c2caa..0000000
--- a/l4bds/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-CC=cc
-AR=ar
-RM=rm -f
-INSTALL=install -m 644
-LOCAL_CFLAGS=-g
-CFLAGS=-Wall -I. $(LOCAL_CFLAGS)
-OBJ=list.o
-LIBFILE=libl4bds.a
-DESTDIR=/
-PREFIX=/usr/local
-LIBDIR=$(DESTDIR)/$(PREFIX)/lib
-
-.PHONY: all clean
-
-all: $(LIBFILE)
-$(LIBFILE): $(OBJ)
- $(AR) rcs $(LIBFILE) $(OBJ)
-clean:
- $(RM) $(LIBFILE) $(OBJ)
-install:
- mkdir -p $(LIBDIR)
- $(INSTALL) -c $(LIBFILE) $(LIBDIR)
-uninstall:
- $(RM) $(LIBDIR)/$(LIBFILE)
diff --git a/l4darr/Makefile b/l4darr/Makefile
deleted file mode 100644
index 4593ccf..0000000
--- a/l4darr/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-CC=cc
-AR=ar
-RM=rm -f
-INSTALL=install -m 644
-LOCAL_CFLAGS=-g
-CFLAGS=-Wall -I. $(LOCAL_CFLAGS)
-OBJ=d1array.o d1arrstr.o d2array.o
-LIBFILE=libl4darr.a
-DESTDIR=/
-PREFIX=/usr/local
-LIBDIR=$(DESTDIR)/$(PREFIX)/lib
-
-.PHONY: all clean
-
-all: $(LIBFILE)
-$(LIBFILE): $(OBJ)
- $(AR) rcs $(LIBFILE) $(OBJ)
-clean:
- $(RM) $(LIBFILE) $(OBJ)
-install:
- mkdir -p $(LIBDIR)
- $(INSTALL) -c $(LIBFILE) $(LIBDIR)
-uninstall:
- $(RM) $(LIBDIR)/$(LIBFILE)
diff --git a/l4darr/d1arrstr.c b/l4darr/d1arrstr.c
deleted file mode 100644
index 2c6e631..0000000
--- a/l4darr/d1arrstr.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#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;
- while((c = getc(infile)) != chr && !feof(infile)){
- towrite = c;
- if(l4da_pushback(newarr, (void*)&towrite) < 0){
- l4da_free(newarr);
- return NULL;
- }
- }
- towrite = '\0';
- if(l4da_pushback(newarr, (void*)&towrite) < 0){
- l4da_free(newarr);
- return NULL;
- }
- return newarr;
-}
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..35de0e9
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,67 @@
+# Programs
+HOST=
+CC= $(HOST)c99
+AR= $(HOST)ar
+RANLIB= $(HOST)ranlib
+RM= rm -f
+MKDIR= mkdir
+MKDIR_P= $(MKDIR) -p
+INSTALL= install -c -m 644
+
+# User flags
+CFLAGS= -g -O2 -pipe
+LDFLAGS=
+
+# Internal flags
+L4B_CFLAGS= -Wall -I. $(CFLAGS)
+L4B_LDFLAGS= $(LDFLAGS)
+
+# Installation
+DESTDIR=
+PREFIX= /usr/local
+LIBDIR= $(DESTDIR)$(PREFIX)/lib
+INCLUDEDIR= $(DESTDIR)$(PREFIX)/include
+
+# Tasks definition
+lib_LIBRARIES= libl4basic.a
+libl4basic_a_OBJECTS= l4array.o l4array2.o l4list.o l4arg.o
+libl4basic_a_HEADERS= $(libl4basic_a_OBJECTS:.o=.h)
+
+# Build dependencies
+l4array_o_DEPENDS=
+l4array2_o_DEPENDS=
+l4list_o_DEPENDS=
+l4arg_o_DEPENDS= l4array.o
+
+.POSIX:
+.PHONY: all clean install install-HEADERS install-LIB \
+ uninstall deinstall remove
+.SUFFIXES: .c.o
+.c.o:
+ $(CC) $(L4B_CFLAGS) -c $< -o $@
+
+all: $(lib_LIBRARIES)
+libl4basic.a: $(libl4basic_a_OBJECTS)
+ $(AR) rcs $@ $(libl4basic_a_OBJECTS)
+ $(RANLIB) $@
+l4array.o: l4array.c l4array.h $(l4array_o_DEPENDS)
+l4array2.o: l4array2.c l4array2.h $(l4array2_o_DEPENDS)
+l4list.o: l4list.c l4list.h $(l4list_o_DEPENDS)
+l4arg.o: l4arg.c l4arg.h $(l4arg_o_DEPENDS)
+
+clean:
+ $(RM) $(lib_LIBRARIES) $(libl4basic_a_OBJECTS)
+
+install: all install-HEADERS install-LIB
+install-LIB:
+ -$(MKDIR_P) $(LIBDIR)
+ $(INSTALL) $(lib_LIBRARIES) $(LIBDIR)
+install-HEADERS:
+ -$(MKDIR_P) $(INCLUDEDIR)
+ $(INSTALL) $(libl4basic_a_HEADERS) $(INCLUDEDIR)
+
+deinstall: uninstall
+remove: uninstall
+uninstall:
+ for i in $(lib_LIBRARIES); do $(RM) $(LIBDIR)/$$i; done
+ for i in $(libl4basic_a_HEADERS); do $(RM) $(INCLUDEDIR)/$$i; done
diff --git a/l4arg/toargv.c b/src/l4arg.c
index 433ad1a..9908665 100644
--- a/l4arg/toargv.c
+++ b/src/l4arg.c
@@ -1,7 +1,8 @@
+#include "l4arg.h"
+#include "l4array.h"
+
#include <string.h>
#include <stdlib.h>
-#include <l4arg.h>
-#include <l4darr.h>
/* 基本上優先順序是 escape -> quoting -> delimiter */
@@ -109,3 +110,54 @@ void l4arg_toargv_free(char** pargv){
}
free(pargv);
}
+
+/* 為什麼叫做 qarg 呢?因為這是用來解析很像 QEMU 命令列參數的參數 */
+
+L4QARG* l4qarg_parse(const char* str){
+ char** pargv = l4arg_toargv(str, ",", "\"\'", "\\");
+ if(pargv == NULL){
+ return NULL;
+ }
+ int i, allc;
+ L4QARG* qargarr;
+ char* pos;
+ for(i=0; pargv[i]!=NULL; i++);
+ allc = i + 1;
+ qargarr = (L4QARG*) malloc(sizeof(L4QARG) * allc);
+ if(qargarr == NULL){
+ l4arg_toargv_free(pargv);
+ return NULL;
+ }
+ for(i=0; pargv[i]!=NULL; i++){
+ pos = strchr(pargv[i], '=');
+ if(pos == NULL){
+ qargarr[i].arg_name = pargv[i];
+ qargarr[i].arg_value = NULL;
+ }else{
+ *pos = '\0';
+ qargarr[i].arg_name = pargv[i];
+ pos++;
+ qargarr[i].arg_value = (char*) malloc(strlen(pos)+1);
+ if(qargarr[i].arg_value == NULL){
+ l4arg_toargv_free(pargv);
+ return NULL;
+ }
+ strcpy(qargarr[i].arg_value, pos);
+ }
+ }
+ free(pargv);
+ qargarr[i].arg_name = NULL;
+ qargarr[i].arg_value = NULL;
+ return qargarr;
+}
+
+void l4qarg_free(L4QARG* qarg){
+ int i;
+ for(i=0; !(qarg[i].arg_name == NULL && qarg[i].arg_value == NULL); i++){
+ free(qarg[i].arg_name);
+ if(qarg[i].arg_value != NULL){
+ free(qarg[i].arg_value);
+ }
+ }
+ free(qarg);
+}
diff --git a/l4arg/l4arg.h b/src/l4arg.h
index 68352c8..68352c8 100644
--- a/l4arg/l4arg.h
+++ b/src/l4arg.h
diff --git a/l4darr/d1array.c b/src/l4array.c
index b14bbea..b57c021 100644
--- a/l4darr/d1array.c
+++ b/src/l4array.c
@@ -1,6 +1,7 @@
+#include "l4array.h"
+
#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){
@@ -130,3 +131,48 @@ L4DA* l4da_make_struct(void* data, int itemsize, int len, int maxlen){
arr->arr_data = data;
return arr;
}
+
+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;
+ while((c = getc(infile)) != chr && !feof(infile)){
+ towrite = c;
+ if(l4da_pushback(newarr, (void*)&towrite) < 0){
+ l4da_free(newarr);
+ return NULL;
+ }
+ }
+ towrite = '\0';
+ if(l4da_pushback(newarr, (void*)&towrite) < 0){
+ l4da_free(newarr);
+ return NULL;
+ }
+ return newarr;
+}
diff --git a/l4darr/l4darr.h b/src/l4array.h
index 860f9b9..192f49d 100644
--- a/l4darr/l4darr.h
+++ b/src/l4array.h
@@ -40,25 +40,4 @@ int l4da_combine(L4DA*, const L4DA*);
void* l4da_drop_struct(L4DA*);
L4DA* l4da_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; /* 資料區 */
-} 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_data(arr) ((arr)->arr_data)
-#define l4da2_v(arr, type, numx, numy) \
- (*(((type*)((arr)->arr_data))+((numx)*(l4da2_getleny(arr)))+(numy)))
-#define l4da2_vp(arr, numx, numy) \
- ((void*)(((char*)((arr)->arr_data))+ \
- ((arr)->arr_itemsize)*((numx)*(l4da2_getleny(arr))+(numy))))
-
#endif
diff --git a/l4darr/d2array.c b/src/l4array2.c
index c2d6e69..24d6db0 100644
--- a/l4darr/d2array.c
+++ b/src/l4array2.c
@@ -1,5 +1,5 @@
+#include "l4array2.h"
#include <stdlib.h>
-#include <l4darr.h>
L4DA2* l4da2_create(int itemsize, int lenx, int leny){
if(lenx <= 0 || leny <= 0 || itemsize <= 0){
diff --git a/src/l4array2.h b/src/l4array2.h
new file mode 100644
index 0000000..e10fc0b
--- /dev/null
+++ b/src/l4array2.h
@@ -0,0 +1,25 @@
+#ifndef L4LIB_DYNAMIC_ARRAY_D2
+#define L4LIB_DYNAMIC_ARRAY_D2
+
+/*********** 二維陣列 (其實是用一維陣列來模擬,功能有限) ***********/
+
+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_data(arr) ((arr)->arr_data)
+#define l4da2_v(arr, type, numx, numy) \
+ (*(((type*)((arr)->arr_data))+((numx)*(l4da2_getleny(arr)))+(numy)))
+#define l4da2_vp(arr, numx, numy) \
+ ((void*)(((char*)((arr)->arr_data))+ \
+ ((arr)->arr_itemsize)*((numx)*(l4da2_getleny(arr))+(numy))))
+
+#endif
diff --git a/l4bds/list.c b/src/l4list.c
index 09ec746..bcde31b 100644
--- a/l4bds/list.c
+++ b/src/l4list.c
@@ -1,6 +1,7 @@
+#include "l4list.h"
+
#include <stdlib.h>
#include <string.h>
-#include <l4bds.h>
L4LL* l4ll_create(void){
L4LL* newlist = (L4LL*)malloc(sizeof(L4LL));
diff --git a/l4bds/l4bds.h b/src/l4list.h
index 2ad7199..2ad7199 100644
--- a/l4bds/l4bds.h
+++ b/src/l4list.h