X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=pc-tools%2Fldc2%2Fsrc%2Fargument_reader.cpp;fp=pc-tools%2Fldc2%2Fsrc%2Fargument_reader.cpp;h=e927a37c95f997b7d3421884598385f909aadd5d;hb=632a71a231a9bdd73a670ec686e13dd049921182;hp=0000000000000000000000000000000000000000;hpb=798b0c1d967a7d8ac3c7a867d41bfa7b8e824048;p=h316.git diff --git a/pc-tools/ldc2/src/argument_reader.cpp b/pc-tools/ldc2/src/argument_reader.cpp new file mode 100644 index 0000000..e927a37 --- /dev/null +++ b/pc-tools/ldc2/src/argument_reader.cpp @@ -0,0 +1,268 @@ +#include "argument_reader.hh" +#include + +/*! + *\brief Constructor. + * + * This constructor makes a new argument_reader ready to use. + *\arg app_name Name of the application as mentioned in the + * "Use: ..." help message. + */ +argument_reader::argument_reader(string app_name){ + progname=app_name; +} + + +/*! + *\brief Add a new parameter to be searched for. + *\param shortname A character for the short form. + * For example the 'h' in -h + *\param longname The double dash longname. For example + * "input_file=" in --input_file= or + * "ignore_errors" in --ignore--errors + *\param description A detailed parameter description. + *\param status Pointer to an integer. Will be set to 1 if arg found. + *\target Pointer to a value should be read. + * If no value is needed, pass NULL. + *\placeholder A placeholder for the documentation. + * For example "" in -f + */ +void argument_reader::add_param (string shortname, string longname, + string description, int * status, + string * target, string placeholder){ + + if(status!=NULL) arguments.insert(arguments.end(), + parameter(shortname,longname, description, + status,target,placeholder) + ); +} + + +/*! + *\brief Add an accepted argument to the argument reader. + *\param placeholder Something like "". + *\param description Text describing the argument. + *\param status A pointer to a status variable. Will be set to 0 immediately. + * If the argument is filled in, it will be set to 1. + *\param target A pointer to a c++ string where the argument goes to. + * + *\note Arguments are filled in the order of adding them to the + * argument reader. + * There would be no other way to determine the order. + */ +void argument_reader::add_argument(string placeholder, string description, int * status, string * target){ + if (target!=NULL) if(status!=NULL) + free_arguments.insert(free_arguments.end(),free_parameter(placeholder,description,status,target)); +} + + +/*! + * Read in the args passed to main(). + *\returns empty vector on success or the error messages to be output. + */ +vector argument_reader::read_args(int argc, char ** args){ + vector result; + vector argv; + for (char ** akt=args; *akt ;akt++) argv.insert(argv.end(),string(*akt)); + + unsigned int free_parms_count=0; + for (vector::iterator akt_p=argv.begin()+1;akt_psubstr(0,2)=="--")&&(free_parms_count==0)){ + int found=0; + for (vector::iterator parm_p=arguments.begin();parm_psubstr(2,parm_p->longname.length())==parm_p->longname){ + found=1; + *(parm_p->status)=1; + if (parm_p->target){ + if (akt_p->length()>2+parm_p->longname.length()){ + *(parm_p->target)=akt_p->substr(2+parm_p->longname.length()); + + } else // Word not long enough + if (akt_p+1status)=1; + *(parm_p->target)=*(++akt_p); + } else { // No next word :-( + result.insert(result.end(), + "Parameter --"+parm_p->longname+parm_p->placeholder+" needs an Argument!"); + } + } // arg needed + } + } // search for loop + if (!found) result.insert(result.end(),"Unknown parameter: "+*akt_p); + } else { // No -- param, now look for switches + if (((*akt_p)[0]=='-')&&(free_parms_count==0)){ + int stop_char_loop=0; + for (unsigned int pos=1; poslength()&& !stop_char_loop ;pos++){ + int found=0; + for (vector::iterator parm_p=arguments.begin();parm_pshortname[0]==(*akt_p)[pos]){ + found=1; + (*parm_p->status)=1; + if (parm_p->target){ // Need argument + if (akt_p->length()>pos+1){ + *(parm_p->target)=akt_p->substr(pos+1); + stop_char_loop=1; + } else { // Word not long enough + if (akt_p+1target)=*(++akt_p); + stop_char_loop=1; + } else { // No next word :-( + result.insert(result.end(), + "Parameter --"+parm_p->longname+parm_p->placeholder+" needs an Argument!"); + } + } + } // arg needed + } //if match + } //args loop + if (!found) result.insert(result.end(),"Unknown switch: "+akt_p->substr(pos,1)); + } // char loop + }// switch found + else{ // no switch found + if (free_parms_countfree_arguments.size()) result.insert(result.begin(),"Too many arguments!"); + if (!result.empty()){ + result.insert(result.begin(),"Error!"); + result.insert(result.begin(),""); + } +// if (!result.empty()){ +// get_help(result); +// } + return result; +} + +/*! + *\brief Generate help. + *\arg target Reference to a vector to which lots of helpful + * strings are appended. + */ +void argument_reader::get_help(vector & result){ + + result.insert(result.end(),""); + string line="Usage: "+progname; + for (vector::iterator parm_p=arguments.begin();parm_pshortname; + if (parm_p->target!=0) addstr+=parm_p->placeholder; + addstr+="]"; + if (line.length()+addstr.length()>79){ + result.insert(result.end(),line); + line=string(7+progname.length(),' '); + } + line+=addstr; + } + + for (vector::iterator parm_p=free_arguments.begin();parm_pplaceholder.length()>79){ + result.insert(result.end(),line); + line=string(7+progname.length(),' '); + } + line+=" ["+parm_p->placeholder+"]"; + } + result.insert(result.end(),line); + + /*******************************/ + + vector left,right; + for (vector::iterator parm_p=arguments.begin();parm_pdescription; + string st2=" -"+parm_p->shortname; + if (parm_p->target)st2+=" "+parm_p->placeholder; + st2+=", --"+parm_p->longname; + if (parm_p->target)st2+=parm_p->placeholder; + left.insert(left.end(),st2); + right.insert(right.end(),line); + } + + for (vector::iterator parm_p=free_arguments.begin();parm_pdescription; + st2+=" "+parm_p->placeholder; + left.insert(left.end(),st2); + right.insert(right.end(),line); + } + + if (arguments.size()){ + result.insert(result.end(),""); + result.insert(result.end(),"Options:"); + } + + unsigned int max_width=0; + for (unsigned int c=0; cmax_width) max_width=left[c].length(); + for (unsigned int c=0; c80){ // Too long??? + int limit=nl.find_last_of(' ',80); + printf("limit:%i\n",limit); + result.insert(result.end(),nl.substr(0,limit)); + nl=string(max_width+2,' ')+nl.substr(limit+1); + } + result.insert(result.end(),nl); + } + + if (free_arguments.size()){ + result.insert(result.end(),""); + result.insert(result.end(),"Arguments:"); + } + + max_width=0; + for (unsigned int c=arguments.size(); cmax_width) max_width=left[c].length(); + for (unsigned int c=arguments.size(); c80){ // Too long??? + int limit=nl.find_last_of(' ',80); + printf("limit:%i\n",limit); + result.insert(result.end(),nl.substr(0,limit)); + nl=string(max_width+2,' ')+nl.substr(limit+1); + } + + result.insert(result.end(),nl); + } + result.insert(result.end(),""); +} + +/*! + *\brief Generate help. + *\return A vector containing many helpful strings for the user. + */ +vector argument_reader::get_help(){ + vector result; + get_help(result); + return result; +} + + +/**************************************************/ + +argument_reader::parameter::parameter(string n_shortname, string n_longname,string n_description, int * n_status, + string * n_target, string n_placeholder){ + shortname=n_shortname; + longname=n_longname; + description=n_description; + status=n_status; + target=n_target; + placeholder=n_placeholder; + if (status) *status=0; +} + +argument_reader::free_parameter::free_parameter( string n_placeholder, string n_description, + int * n_status, string * n_target){ + description=n_description; + status=n_status; + target=n_target; + placeholder=n_placeholder; + if (status) *status=0; +}