diff options
Diffstat (limited to 'l4basic/l4arg/qarg.c')
-rw-r--r-- | l4basic/l4arg/qarg.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/l4basic/l4arg/qarg.c b/l4basic/l4arg/qarg.c new file mode 100644 index 0000000..412967c --- /dev/null +++ b/l4basic/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 = 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); +} |