aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2012-09-13 01:10:44 +0800
committerLAN-TW <lantw44@gmail.com>2012-09-13 01:10:44 +0800
commite3d7e7952715a780a37fe3f12d6f0a181ac70ac8 (patch)
tree879713e22ce18a03079d9e95a21a54497ee97349
parent286793cc984b2b5b05bb51ee2f73778a571dc0d4 (diff)
downloadl4basic-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/Makefile4
-rw-r--r--l4arg/l4arg.h24
-rw-r--r--l4arg/toargv.c91
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;
+}