aboutsummaryrefslogtreecommitdiffstats
path: root/l4arg
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2012-09-14 17:56:53 +0800
committerLAN-TW <lantw44@gmail.com>2012-09-14 17:56:53 +0800
commitde126eff57df844c3eca18afeb0530ceeecff8d6 (patch)
tree3d881c6a7c7d95f65b72f75dda56d29d5ae5fe5c /l4arg
parentc0cf367120cba837dc93ca38a197de940f3dabca (diff)
downloadl4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.gz
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.bz2
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.lz
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.xz
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.zst
l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.zip
l4arg: 測試並修正許多會造成程式異常終止的錯誤
Diffstat (limited to 'l4arg')
-rw-r--r--l4arg/l4arg.h3
-rw-r--r--l4arg/qarg.c6
-rw-r--r--l4arg/toargv.c39
3 files changed, 31 insertions, 17 deletions
diff --git a/l4arg/l4arg.h b/l4arg/l4arg.h
index b4da062..68352c8 100644
--- a/l4arg/l4arg.h
+++ b/l4arg/l4arg.h
@@ -17,6 +17,9 @@ L4QARG* l4qarg_parse(const char*);
void l4qarg_free(L4QARG*);
#define l4qarg_n(qargitem) ((qargitem).arg_name)
#define l4qarg_v(qargitem) ((qargitem).arg_value)
+#define l4qarg_hasvalue(qargitem) (((qargitem).arg_value != NULL))
+#define l4qarg_end(qargitem) \
+ ((((qargitem).arg_name) == NULL) && (((qargitem).arg_value) == NULL))
#ifdef __cplusplus
}
diff --git a/l4arg/qarg.c b/l4arg/qarg.c
index aab818f..412967c 100644
--- a/l4arg/qarg.c
+++ b/l4arg/qarg.c
@@ -14,7 +14,7 @@ L4QARG* l4qarg_parse(const char* str){
char* pos;
for(i=0; pargv[i]!=NULL; i++);
allc = i + 1;
- qargarr = (L4QARG*) malloc(sizeof(L4QARG*) * allc);
+ qargarr = (L4QARG*) malloc(sizeof(L4QARG) * allc);
if(qargarr == NULL){
l4arg_toargv_free(pargv);
return NULL;
@@ -25,8 +25,8 @@ L4QARG* l4qarg_parse(const char* str){
qargarr[i].arg_name = pargv[i];
qargarr[i].arg_value = NULL;
}else{
- pos = '\0';
- qargarr[i].arg_name = pos;
+ *pos = '\0';
+ qargarr[i].arg_name = pargv[i];
pos++;
qargarr[i].arg_value = (char*) malloc(strlen(pos)+1);
if(qargarr[i].arg_value == NULL){
diff --git a/l4arg/toargv.c b/l4arg/toargv.c
index 4b507b0..433ad1a 100644
--- a/l4arg/toargv.c
+++ b/l4arg/toargv.c
@@ -18,7 +18,7 @@ char** l4arg_toargv(const char* str,
char escaped = 0, quoted = 0, delimed = 0;
L4DA* parr;
L4DA* tmpstr;
- char* addstr;
+ char* addstr, tmpchar;
char** rval;
parr = l4da_create(sizeof(char*), 0);
if(parr == NULL){
@@ -47,6 +47,7 @@ char** l4arg_toargv(const char* str,
abort_l4arg_toargv;
}
delimed = 0;
+ continue;
}
if(strchr(esc, str[i]) != NULL){
escaped = 1;
@@ -57,20 +58,24 @@ char** l4arg_toargv(const char* str,
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;
+ if(l4da_getlen(tmpstr) > 0){
+ tmpchar = '\0';
+ if(l4da_pushback(tmpstr, &tmpchar) < 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;
+ continue;
}
if(l4da_pushback(tmpstr, &str[i]) < 0){
abort_l4arg_toargv;
@@ -78,7 +83,8 @@ char** l4arg_toargv(const char* str,
delimed = 0;
}
if(!delimed){
- if(l4da_pushback(tmpstr, '\0') < 0){
+ tmpchar = '\0';
+ if(l4da_pushback(tmpstr, &tmpchar) < 0){
abort_l4arg_toargv;
}
addstr = (char*)l4da_drop_struct(tmpstr);
@@ -87,6 +93,11 @@ char** l4arg_toargv(const char* str,
return NULL;
}
}
+ addstr = NULL;
+ if(l4da_pushback(parr, &addstr) < 0){
+ l4da_free(parr);
+ return NULL;
+ }
rval = (char**)l4da_drop_struct(parr);
return rval;
}