#ifndef __ARG_H #define __ARG_H #include #include #include #include #define ARGT_NONE 0 //nothing #define ARGT_IP 1 //ip addr #define ARGT_RANGE 2 //range of values #define ARGT_FLOAT 3 //could be float #define ARGT_LIST 4 //list of values #define ARGT_FILE 5 //path to file #define ARGT_VAL 6 //command line direct val #define ARGT_FLAG 7 //flag value on/off #define ARG_ENTRY(P,T,V,H) {.param=P,.type=ARGT_##T,.def=V,.used=0,.help=H} /* used to define table with predefine arguments */ typedef struct def_arg { char *param; //parametr that comes from shell uint32_t type; //type of argument void *def; //define default values, NULL if no default values uint8_t used; char *help; //command description void *result; //result } def_arg; typedef struct argv_t { int type; uint8_t *val; // points to arg_{ip|range|..} } argv_t; typedef struct arg_t { int used; int size; //number of arguments argv_t **arg; //list of pointers to arguments } arg_t; //ip argument default behaviour structure //resulting structure with ip/port values typedef struct arg_ip { int used; uint32_t ip; //IP4 ip addrers uint16_t port;//port number } arg_ip; /* Supported ip addresses: ...1 = 127.0.0.1:[default port] :80 = [default ip]:80 */ typedef struct s_arg_ip { int used; //value is in cmd int def; //says if default should be used if no value in cmd uint32_t ip; uint32_t default_ip; uint16_t port; uint32_t default_port; arg_ip *result; } s_arg_ip; //configure range argument behaviour //configuration structure for range argument typedef struct arg_range { int used; uint32_t start; uint32_t end; uint32_t step; } arg_range; /* number format decimal ones 1k = 1000 1m = 1000k = 1000000 1g = 1000m = 1000000k = 1000000000 10:100 - from 10 till 100 step [default step] 100: - from 100 till [default end] [default step] :200 - from [default start] till 100:200:1 - from 100 till 200 with step 1 */ typedef struct s_arg_range { int used; int def; //says if default should be used if no value in cmd uint32_t start; uint32_t default_start; //default start value uint32_t end; // uint32_t default_end; //default end value uint32_t step; // uint32_t default_step; //default step value arg_range *result; } s_arg_range; //configuration structure for float argument typedef struct arg_float { int used; float val; } arg_float; typedef struct s_arg_float { int used; int def; //says if default should be used if no value in cmd float val; float default_val; arg_float *result; } s_arg_float; //configuration structure for list argument typedef struct arg_list { int used; uint32_t num; char **vals; } arg_list; /* list arguments by name supports PARAM1|PARAM2|PARAM3 */ typedef struct s_arg_list { int used; int def; //says if default should be used if no value in cmd uint32_t num; char **vals; //list of supported arguments char *default_val; //points to default arguments in da list arg_list *result; } s_arg_list; /* configuration structure to default file argument */ /* resulting structure for file argument */ typedef struct arg_file { int used; char *name; char *abspath; } arg_file; typedef struct s_arg_file { int used; int def; //says if default should be used if no value in cmd char *name; //current filename char *default_name; //default filename char *abspath; //dire where to search stuff? char *default_abspath; //default absoulute file path arg_file *result; } s_arg_file; typedef struct arg_val { int used; char *ptr; } arg_val; typedef struct s_arg_val { int used; int def; //says if default should be used if no value in cmd char *ptr; char *default_ptr; arg_val *result; } s_arg_val; //no need as there is no default values typedef struct arg_flag { int used; int flag; } arg_flag; typedef struct s_arg_flag { int used; int flag; //do we need it? arg_flag *result; } s_arg_flag; arg_t* arg_load( int argc, char **argv, def_arg *argl ); void arg_free( arg_t *arg ); int arg_type( arg_t *arg, int num ); argv_t* arg_get( arg_t *arg, int num ); arg_ip* arg_c_ip( uint32_t ip, uint16_t port ); arg_range* arg_c_range( uint32_t start, uint32_t end, uint32_t step ); arg_float* arg_c_float( float val ); arg_list* arg_c_list( uint32_t num, char **vals); arg_file* arg_c_file( char *name ); arg_val* arg_c_val( char *ptr ); arg_flag* arg_c_flag(); void arg_print( arg_t *arg ); #endif