aboutsummaryrefslogtreecommitdiffstats
path: root/arg.c
diff options
context:
space:
mode:
Diffstat (limited to 'arg.c')
-rw-r--r--arg.c145
1 files changed, 138 insertions, 7 deletions
diff --git a/arg.c b/arg.c
index cae18d7..7a0cd64 100644
--- a/arg.c
+++ b/arg.c
@@ -1,5 +1,7 @@
#include "arg.h"
+#include "debug.h"
+
//for local usage only?
int __search_arg( char *in, def_arg *arg );
/*from s_arg_[TYPE] create type arg_[TYPE]*/
@@ -65,7 +67,24 @@ arg_t* arg_load( int argc, char **argv, def_arg *argl )
}
case ARGT_RANGE:
{
- //printf("%d is range\n",i);
+ printf("%d is range\n",i);
+ /*
+ CHK_ARG(i,1);
+
+ if (argl[pos].used == 1)
+ {
+ printf("Allready used %s\n",argv[i]);
+ break;
+ }
+
+ arg_range *range = __create_arg(argl[pos].type, argl[pos].def);
+
+
+
+ i += 1;
+
+ */
+
break;
}
case ARGT_FLOAT:
@@ -75,8 +94,91 @@ arg_t* arg_load( int argc, char **argv, def_arg *argl )
}
case ARGT_LIST:
{
+ s_arg_list *parse_params = NULL;
+ char *iter=NULL,*st=NULL,*s=NULL;
+
//printf("%d is list\n",i);
+ CHK_ARG(i,1);
+
+
+ if (argl[pos].used == 1)
+ {
+ printf("Allready used %d\n", argv[i]);
+ break;
+ }
+
+ //super algo for parsing
+ parse_params = malloc(sizeof(arg_list));
+ memset(parse_params, 0, sizeof(arg_list));
+ iter = argv[i+1];
+ st = iter;
+ while ((*iter)!='\0')
+ {
+ if (((*iter)=='|'))
+ {
+ if ((iter)>st)
+ {
+ s = malloc(iter-st+1);
+ memcpy(s, st, iter-st);
+ s[iter-st]=0;
+ //realloc and add new pointer
+ parse_params->num += 1;
+ char *realoc_ptr = realloc(parse_params->vals, sizeof(void *)*parse_params->num);
+ if (realoc_ptr)
+ {
+ parse_params->vals = (void **)realoc_ptr;
+ parse_params->vals[parse_params->num-1] = s;
+ } else
+ {
+ parse_params->num -= 1;
+ }
+ st = iter+1;
+ } else
+ {
+ st = iter+1;
+ }
+ }
+ iter++;
+ if (*iter=='\0')
+ {
+ if ((iter)>st)
+ {
+ s = malloc(iter-st+1);
+ memcpy(s, st, iter-st);
+ s[iter-st]=0;
+ parse_params->num += 1;
+ char *realoc_ptr = realloc(parse_params->vals, sizeof(void *)*parse_params->num);
+ if (realoc_ptr)
+ {
+ parse_params->vals = (void **)realoc_ptr;
+ parse_params->vals[parse_params->num-1] = s;
+ } else
+ {
+ parse_params->num -= 1;
+ }
+ st = iter+1;
+ }
+ }
+ }
+
+ arg_list *list = __create_arg(argl[pos].type, parse_params);
+
+ //check param values
+
+ if (-1==__add_arg(ret, ARGT_LIST, list))
+ {
+ ENL();
+ }
+
+
+ argl[pos].used = 1;
+
+ used[i] = 1;
+ used[i+1] = 1;
+
+ i+=1;
break;
+
}
case ARGT_FILE:
{
@@ -115,7 +217,7 @@ arg_t* arg_load( int argc, char **argv, def_arg *argl )
break;
}
- // enouht that this is triggered
+ // enought that this is triggered
case ARGT_FLAG:
{
arg_flag *flg = NULL;
@@ -326,6 +428,18 @@ void arg_print( arg_t *arg )
printf("IP\n");
break;
}
+ case ARGT_LIST:
+ {
+ int k;
+ arg_list *lst = (arg_list *)v->val;
+ printf("Lst | ");
+ for (k=0;k<lst->num;k++)
+ {
+ printf("%s ", lst->vals[k]);
+ }
+ printf("\n");
+ break;
+ }
case ARGT_VAL:
{
arg_val *val = (void *)v->val;
@@ -418,9 +532,13 @@ void* __create_arg( int type, void *val )
case ARGT_LIST:
{
arg_list *list = NULL;
- s_arg_list *s_list = NULL;
+ s_arg_list *s_list = val;
- list = arg_c_list( s_list->num, s_list->vals );
+ //so NULL where given as we use *->* then be carefull
+ if (s_list != NULL)
+ {
+ list = arg_c_list( s_list->num, s_list->vals );
+ }
ret = list;
break;
@@ -467,20 +585,33 @@ void* __create_arg( int type, void *val )
int __add_arg( arg_t *arg, int type, void *val )
{
- int ret = 0;
argv_t *argv = NULL;
- arg->arg = realloc( arg->arg, sizeof(void*)*(arg->size+1) );
+ void *new_ptr = NULL;
+
+ new_ptr = realloc( arg->arg, sizeof(void*)*(arg->size+1) );
+ if (new_ptr == NULL)
+ {
+ ENL();
+ return -1;
+ }
+ arg->arg = new_ptr;
arg->size += 1;
argv = malloc(sizeof(argv_t));
+ if (argv == NULL)
+ {
+ //do resize back reallocated arg->arg
+ ENL();
+ return -1;
+ }
memset(argv, 0, sizeof(argv_t));
argv->type = type;
argv->val = val;
arg->arg[arg->size-1] = argv;
- return ret;
+ return 0;
}