00001 #ifndef ARG_PARSER_CPP
00002 #define ARG_PARSER_CPP
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
00036
00037 #include "arg_parser.h"
00038
00039
00040 std::string arg_parser::global_args;
00041
00042 void
00043 arg_parser::set_global_args(int argc, const char* const argv[]) {
00044 for(int i = 0; (i < argc); i++) {
00045 global_args += " ";
00046 global_args += argv[i];
00047 }
00048
00049 global_args = global_args.substr(1);
00050 }
00051
00052 void
00053 arg_parser::get_arg_array(arg_record ptr[]) {
00054
00055 array_of_arg_records = ptr;
00056 int i = 0;
00057
00058 for (;;) {
00059 if (array_of_arg_records[i].arg_text == NULL) {
00060 break;
00061 } else {
00062 i++;
00063 if (i > 100) {
00064
00065
00066
00067 std::cerr << "More than 100 arguments?\n";
00068 exit(-1);
00069 }
00070 }
00071 }
00072 num_args = i;
00073 }
00074
00075
00076 bool
00077 arg_parser::check_args(int &argc, char *argv[], bool caxoe) {
00078
00079
00080 int i,j;
00081
00082
00083 for (i = 1; i < argc ; i++) {
00084
00085
00086 bool matched_one = false;
00087 for (j = 0; j < num_args; j++) {
00088
00089
00090 switch (array_of_arg_records[j].type) {
00091 case BOOLEAN:{
00092
00093 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00094
00095 matched_one = true;
00096
00097 remove_arg(i, argc, argv);
00098 *(bool*)(array_of_arg_records[j].data) = true;
00099 }
00100 break;
00101 }
00102 case INTEGER:{
00103 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00104 matched_one = true;
00105 remove_arg( i, argc, argv );
00106 *(int*)(array_of_arg_records[j].data) = atoi(argv[i]);
00107 remove_arg( i, argc, argv );
00108 }
00109 break;
00110 }
00111 case STRING:{
00112
00113 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00114
00115 matched_one = true;
00116 remove_arg(i, argc, argv);
00117 *(char**)(array_of_arg_records[j].data) = argv[i];
00118 remove_arg(i, argc, argv);
00119 }
00120 break;
00121 }
00122 case STRING_LIST:{
00123 char *substring = NULL;
00124 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0){
00125 remove_arg(i, argc, argv);
00126 substring = argv[i];
00127 }
00128 else{
00129 int character;
00130 bool one_did_not_match = false;
00131 for( character = 0;
00132 character < (int) strlen(array_of_arg_records[j].arg_text);
00133 character++ ){
00134 if( array_of_arg_records[j].arg_text[character] != argv[i][character] ){
00135 one_did_not_match = true;
00136 }
00137 }
00138 if( one_did_not_match == false ){
00139 substring = argv[i] + (strlen( array_of_arg_records[j].arg_text )*sizeof(char));
00140 }
00141 }
00142 if( substring != NULL ){
00143 matched_one = true;
00144
00145 remove_arg(i, argc, argv);
00146 }
00147 break;
00148 }
00149 case DOUBLE:{
00150 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00151 matched_one = true;
00152 remove_arg( i, argc, argv );
00153 *(double*)(array_of_arg_records[j].data) = atof(argv[i]);
00154 remove_arg( i, argc, argv );
00155 }
00156 break;
00157 }
00158 case FLOAT:{
00159 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00160 matched_one = true;
00161 remove_arg( i, argc, argv );
00162 *(float*)(array_of_arg_records[j].data) = (float) atof(argv[i]);
00163 remove_arg( i, argc, argv );
00164 }
00165 break;
00166 }
00167 #ifndef _WINDOWS
00168 case LONG_LONG:{
00169 if (i < argc && strcmp(argv[i], array_of_arg_records[j].arg_text) == 0) {
00170 matched_one = true;
00171 remove_arg( i, argc, argv );
00172 *(long long*)(array_of_arg_records[j].data) = strtol(argv[i], NULL, 10);
00173 remove_arg( i, argc, argv );
00174 }
00175 break;
00176 }
00177 #endif
00178 default:
00179 std::cerr << "Invalid arg type in arg array!\n";
00180 exit(-1);
00181 }
00182
00183 if( matched_one == true ){
00184
00185 j = 0;
00186 i = 0;
00187 matched_one = false;
00188 }
00189 }
00190 }
00191
00192 return check_remaining( argc, argv, caxoe );
00193 }
00194
00195
00196 void
00197 arg_parser::remove_arg( int arg_to_remove, int &argc, char **argv ){
00198
00199 int i;
00200 for( i = arg_to_remove; i < argc - 1; i++ ){
00201 argv[i] = argv[i+1];
00202 }
00203 argv[i] = NULL;
00204
00205 argc--;
00206 }
00207
00208
00209 bool
00210 arg_parser::check_remaining(int argc, char **argv,
00211 bool complain_and_exit_on_error ){
00212 int i;
00213
00214 for(i = 0; i < argc; i++){
00215
00216 if( strcmp(argv[i], "-help") == 0 ){
00217 std::cout << "Valid arguments are:\n";
00218 std::cout << *this << std::endl;
00219 exit( 0 );
00220 }
00221
00222 if( argv[i][0] == '-' ){
00223
00224 if( complain_and_exit_on_error == true) {
00225 std::cerr << "Invalid argument \"" << argv[i] << "\"\n";
00226 std::cerr << "Valid arguments: \n";
00227 std::cerr << *this << std::endl;
00228 exit( -1 );
00229 }
00230 return false;
00231 }
00232 }
00233
00234 return true;
00235 }
00236
00237 #endif