diff options
author | LAN-TW <lantw44@gmail.com> | 2012-09-14 17:56:53 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2012-09-14 17:56:53 +0800 |
commit | de126eff57df844c3eca18afeb0530ceeecff8d6 (patch) | |
tree | 3d881c6a7c7d95f65b72f75dda56d29d5ae5fe5c | |
parent | c0cf367120cba837dc93ca38a197de940f3dabca (diff) | |
download | l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.gz l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.tar.zst l4basic-de126eff57df844c3eca18afeb0530ceeecff8d6.zip |
l4arg: 測試並修正許多會造成程式異常終止的錯誤
-rw-r--r-- | l4arg/l4arg.h | 3 | ||||
-rw-r--r-- | l4arg/qarg.c | 6 | ||||
-rw-r--r-- | l4arg/toargv.c | 39 |
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; } |