diff options
author | LAN-TW <lantw44@gmail.com> | 2012-09-13 01:10:44 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2012-09-13 01:10:44 +0800 |
commit | e3d7e7952715a780a37fe3f12d6f0a181ac70ac8 (patch) | |
tree | 879713e22ce18a03079d9e95a21a54497ee97349 | |
parent | 286793cc984b2b5b05bb51ee2f73778a571dc0d4 (diff) | |
download | l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar.gz l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar.bz2 l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar.lz l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar.xz l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.tar.zst l4basic-e3d7e7952715a780a37fe3f12d6f0a181ac70ac8.zip |
l4arg: 初次完成將字串解為 argv 的部份,但尚未測試
-rw-r--r-- | l4arg/Makefile | 4 | ||||
-rw-r--r-- | l4arg/l4arg.h | 24 | ||||
-rw-r--r-- | l4arg/toargv.c | 91 |
3 files changed, 117 insertions, 2 deletions
diff --git a/l4arg/Makefile b/l4arg/Makefile index 59e00a4..ac57e9c 100644 --- a/l4arg/Makefile +++ b/l4arg/Makefile @@ -1,8 +1,8 @@ CC=cc AR=ar RM=rm -CFLAGS=-Wall -g -I. -OBJ= +CFLAGS=-Wall -g -I. -I../l4darr +OBJ=toargv.o LIBFILE=libl4arg.a .PHONY: all clean diff --git a/l4arg/l4arg.h b/l4arg/l4arg.h new file mode 100644 index 0000000..8a70376 --- /dev/null +++ b/l4arg/l4arg.h @@ -0,0 +1,24 @@ +#ifndef L4LIB_ARG_PARSER +#define L4LIB_ARG_PARSER + +#ifdef __cplusplus +extern "C" { +#endif + +char** l4arg_toargv(const char*, const char*, const char*, const char*); + +typedef struct l4lib_qarg { + char* arg_name; + char* arg_value; +} L4QARG; + +L4QARG* l4qarg_parse(const char*); +void l4qarg_free(L4QARG*); +#define l4qarg_n(qargitem) ((qargitem).arg_name) +#define l4qarg_v(qargitem) ((qargitem).arg_value) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/l4arg/toargv.c b/l4arg/toargv.c new file mode 100644 index 0000000..35a9ae8 --- /dev/null +++ b/l4arg/toargv.c @@ -0,0 +1,91 @@ +#include <string.h> +#include <l4arg.h> +#include <l4darr.h> + +/* 基本上優先順序是 escape -> quoting -> delimiter */ + +#define abort_l4arg_toargv \ + do{ \ + l4da_free(parr); \ + l4da_free(tmpstr); \ + return NULL; \ + }while(0) + +char** l4arg_toargv(const char* str, + const char* delim, const char* quoting, const char* esc){ + int i; + char escaped = 0, quoted = 0, delimed = 0; + L4DA* parr; + L4DA* tmpstr; + char* addstr; + char** rval; + parr = l4da_create(sizeof(char*), 0); + if(parr == NULL){ + return NULL; + } + tmpstr = l4da_create(sizeof(char), 0); + if(tmpstr == NULL){ + l4da_free(parr); + return NULL; + } + for(i=0; str[i]!='\0'; i++){ + if(escaped){ + if(l4da_pushback(tmpstr, &str[i]) < 0){ + abort_l4arg_toargv; + } + escaped = 0; + delimed = 0; + continue; + } + if(quoted){ + if(strchr(quoting, str[i]) != NULL){ + quoted = 0; + continue; + } + if(l4da_pushback(tmpstr, &str[i]) < 0){ + abort_l4arg_toargv; + } + delimed = 0; + } + if(strchr(esc, str[i]) != NULL){ + escaped = 1; + continue; + } + if(strchr(quoting, str[i]) != NULL){ + quoted = 1; + continue; + } + if(strchr(delim, str[i]) != NULL){ + if(l4da_pushback(tmpstr, '\0') < 0){ + abort_l4arg_toargv; + } + addstr = (char*)l4da_drop_struct(tmpstr); + if(l4da_pushback(parr, &addstr) < 0){ + l4da_free(parr); + return NULL; + } + tmpstr = l4da_create(sizeof(char), 0); + if(tmpstr == NULL){ + l4da_free(parr); + return NULL; + } + delimed = 1; + } + if(l4da_pushback(tmpstr, &str[i]) < 0){ + abort_l4arg_toargv; + } + delimed = 0; + } + if(!delimed){ + if(l4da_pushback(tmpstr, '\0') < 0){ + abort_l4arg_toargv; + } + addstr = (char*)l4da_drop_struct(tmpstr); + if(l4da_pushback(parr, &addstr) < 0){ + l4da_free(parr); + return NULL; + } + } + rval = (char**)l4da_drop_struct(parr); + return rval; +} |