aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlantw44 <lantw44@gmail.com>2012-09-14 01:12:34 +0800
committerlantw44 <lantw44@gmail.com>2012-09-14 01:12:34 +0800
commitc0cf367120cba837dc93ca38a197de940f3dabca (patch)
tree3572b03ac7026959d2b5900b141d536c27d716d5
parente3d7e7952715a780a37fe3f12d6f0a181ac70ac8 (diff)
downloadl4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar.gz
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar.bz2
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar.lz
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar.xz
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.tar.zst
l4basic-c0cf367120cba837dc93ca38a197de940f3dabca.zip
l4arg: 加入 l4arg_toargv_free,用於釋放 l4arg_toargv 配置的記憶體空間
l4arg: 初次完成 l4qarg 部份,尚未測試
-rw-r--r--l4arg/Makefile2
-rw-r--r--l4arg/l4arg.h1
-rw-r--r--l4arg/qarg.c54
-rw-r--r--l4arg/toargv.c9
4 files changed, 65 insertions, 1 deletions
diff --git a/l4arg/Makefile b/l4arg/Makefile
index ac57e9c..8c23687 100644
--- a/l4arg/Makefile
+++ b/l4arg/Makefile
@@ -2,7 +2,7 @@ CC=cc
AR=ar
RM=rm
CFLAGS=-Wall -g -I. -I../l4darr
-OBJ=toargv.o
+OBJ=toargv.o qarg.o
LIBFILE=libl4arg.a
.PHONY: all clean
diff --git a/l4arg/l4arg.h b/l4arg/l4arg.h
index 8a70376..b4da062 100644
--- a/l4arg/l4arg.h
+++ b/l4arg/l4arg.h
@@ -6,6 +6,7 @@ extern "C" {
#endif
char** l4arg_toargv(const char*, const char*, const char*, const char*);
+void l4arg_toargv_free(char**);
typedef struct l4lib_qarg {
char* arg_name;
diff --git a/l4arg/qarg.c b/l4arg/qarg.c
new file mode 100644
index 0000000..aab818f
--- /dev/null
+++ b/l4arg/qarg.c
@@ -0,0 +1,54 @@
+#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 = pos;
+ 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/toargv.c b/l4arg/toargv.c
index 35a9ae8..4b507b0 100644
--- a/l4arg/toargv.c
+++ b/l4arg/toargv.c
@@ -1,4 +1,5 @@
#include <string.h>
+#include <stdlib.h>
#include <l4arg.h>
#include <l4darr.h>
@@ -89,3 +90,11 @@ char** l4arg_toargv(const char* str,
rval = (char**)l4da_drop_struct(parr);
return rval;
}
+
+void l4arg_toargv_free(char** pargv){
+ int i;
+ for(i=0; pargv[i]!=NULL; i++){
+ free(pargv[i]);
+ }
+ free(pargv);
+}