diff options
author | lantw44 <lantw44@gmail.com> | 2012-09-14 01:12:34 +0800 |
---|---|---|
committer | lantw44 <lantw44@gmail.com> | 2012-09-14 01:12:34 +0800 |
commit | c0cf367120cba837dc93ca38a197de940f3dabca (patch) | |
tree | 3572b03ac7026959d2b5900b141d536c27d716d5 | |
parent | e3d7e7952715a780a37fe3f12d6f0a181ac70ac8 (diff) | |
download | l4basic-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/Makefile | 2 | ||||
-rw-r--r-- | l4arg/l4arg.h | 1 | ||||
-rw-r--r-- | l4arg/qarg.c | 54 | ||||
-rw-r--r-- | l4arg/toargv.c | 9 |
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); +} |