00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <cstdlib>
00036 #include <cctype>
00037 #include <cstring>
00038 #include "utils/bitcompat.h"
00039 #include "options.h"
00040
00041
00042
00043 int get_options(int argc, char** argv,option* opttable)
00044 {
00045 option *opt;
00046 char *p, *next_char;
00047
00048 int optind, optno, optfirstind;
00049 optno = optind = 1;
00050 for ( ; optind<argc; )
00051 {
00052
00053 while( argv[optind][0] != '-' )
00054 if ( ++optind == argc )
00055 return optno;
00056
00057 optfirstind = optind;
00058
00059 if ( argv[optind][1] == '-' )
00060 {
00061
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
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
00080 p = next_char+1;
00081 goto param_value;
00082 }
00083
00084 if (*next_char != '\0')
00085 break;
00086 if ( opt->type == optionBool)
00087 goto param_value;
00088
00089 goto param_found;
00090 }
00091 }
00092 }
00093
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
00105 if ( strchr(opt->names,*p) != NULL )
00106 {
00107 if ( opt->type != optionBool )
00108 {
00109
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
00123 if (*next_char != '\0' || ++optind == argc)
00124 return -optind;
00125 p = argv[optind];
00126 param_value:
00127
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
00151 if (optfirstind != optno)
00152 {
00153
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 }