Go to the source code of this file.
Compounds | |
struct | _option |
Typedefs | |
typedef _option | option |
Enumerations | |
enum | TProgramOptions { optionBool, optionLong, optionString } |
Functions | |
int | get_options (int argc, char **argv, option *opttable) |
|
|
|
Definition at line 28 of file options.h.
00029 { optionBool, optionLong, optionString }; |
|
Definition at line 43 of file options.cpp. References _option::names, optionBool, optionLong, optionString, _option::type, and _option::val. Referenced by ReadOptions().
00044 { 00045 option *opt; 00046 char *p, *next_char; 00047 // prima non opzione e inizio indice opzioni 00048 int optind, optno, optfirstind; 00049 optno = optind = 1; 00050 for ( ; optind<argc; ) 00051 { 00052 // se non e' un'opzione ritorna 00053 while( argv[optind][0] != '-' ) 00054 if ( ++optind == argc ) 00055 return optno; 00056 00057 optfirstind = optind; 00058 00059 if ( argv[optind][1] == '-' ) 00060 { 00061 // caso '--' ritorna indica successivo elemento 00062 if (argv[optind][2] == '\0' ) 00063 return optind+1; 00064 for(opt = opttable; ; ++opt) 00065 { 00066 if ( opt->names == NULL ) 00067 return -optind; 00068 p = opt->names; 00069 00070 // caso parametri lunghi 00071 for( ;*(p=p+strlen(p)+1); ) 00072 { 00073 int l = strlen(p); 00074 if ( strncmp(p,argv[optind]+2,l) == 0 ) 00075 { 00076 next_char = &argv[optind][2+l]; 00077 if ( opt->type != optionBool && *next_char == '=' ) 00078 { 00079 // --arg=value 00080 p = next_char+1; 00081 goto param_value; 00082 } 00083 // prova con un'altra opzione 00084 if (*next_char != '\0') 00085 break; 00086 if ( opt->type == optionBool) 00087 goto param_value; 00088 // --arg value 00089 goto param_found; 00090 } 00091 } 00092 } 00093 // non raggiunge mai questo punto 00094 } 00095 else 00096 { 00097 for(p = argv[optind]+1; *p != '\0' ;++p) 00098 { 00099 for( opt = opttable; ; ++opt) 00100 { 00101 if ( opt->names == NULL ) 00102 return -optind; 00103 00104 // caso parametri a caratteri singoli 00105 if ( strchr(opt->names,*p) != NULL ) 00106 { 00107 if ( opt->type != optionBool ) 00108 { 00109 // -a value 00110 next_char = p+1; 00111 goto param_found; 00112 } 00113 *(bool*)(opt->val) = true; 00114 break; 00115 } 00116 } 00117 } 00118 goto option_found; 00119 } 00120 00121 param_found: 00122 // il valore dell'opzione e' il successivo parametro 00123 if (*next_char != '\0' || ++optind == argc) 00124 return -optind; 00125 p = argv[optind]; 00126 param_value: 00127 // scrivi dati in output 00128 switch(opt->type) 00129 { 00130 case optionBool: 00131 *(bool*)(opt->val) = true; 00132 break; 00133 case optionString: 00134 *(const char**)(opt->val) = p; 00135 break; 00136 case optionLong: 00137 { 00138 char *pend; 00139 if ( !isdigit(*p) ) 00140 return -optind; 00141 *(long*)(opt->val) = strtol(p,&pend,0); 00142 if ( *pend != '\0' ) 00143 return -optind; 00144 } 00145 break; 00146 } 00147 00148 option_found: 00149 ++optind; 00150 // sposta in fondo gli argomenti non flag 00151 if (optfirstind != optno) 00152 { 00153 // shifta num volte opzioni all'inizio 00154 for (;optind != optfirstind;) 00155 { 00156 int n = optfirstind; 00157 char *temp = argv[n]; 00158 for(;--n >= optno;) 00159 argv[n+1] = argv[n]; 00160 argv[optno] = temp; 00161 ++optno; 00162 ++optfirstind; 00163 } 00164 } 00165 else 00166 optno = optind; 00167 00168 } 00169 return optno; 00170 } |