From e3d7e7952715a780a37fe3f12d6f0a181ac70ac8 Mon Sep 17 00:00:00 2001 From: LAN-TW Date: Thu, 13 Sep 2012 01:10:44 +0800 Subject: =?UTF-8?q?l4arg:=20=E5=88=9D=E6=AC=A1=E5=AE=8C=E6=88=90=E5=B0=87?= =?UTF-8?q?=E5=AD=97=E4=B8=B2=E8=A7=A3=E7=82=BA=20argv=20=E7=9A=84?= =?UTF-8?q?=E9=83=A8=E4=BB=BD=EF=BC=8C=E4=BD=86=E5=B0=9A=E6=9C=AA=E6=B8=AC?= =?UTF-8?q?=E8=A9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l4arg/Makefile | 4 +-- l4arg/l4arg.h | 24 ++++++++++++++++ l4arg/toargv.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 l4arg/l4arg.h create mode 100644 l4arg/toargv.c 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 +#include +#include + +/* 基本上優先順序是 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; +} -- cgit v1.2.3