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