+++ /dev/null
-#include "argread.hh"
-#include <stdio.h>
-
-argreader::argreader(string n_name){
- progname=n_name;
-}
-
-void argreader::add_param (string shortname, string longname,
- string description, int * status,
- string * target, string placeholder){
- if (target!=NULL) if(status!=NULL)
- arguments.insert(arguments.end(),parameter(shortname,longname,description,status,target,placeholder));
-}
-
-void argreader::add_free_param(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));
-}
-
-vector<string> argreader::read_args(int argc, char ** args){
- vector<string> result;
- vector<string> argv;
- for (char ** akt=args; *akt ;akt++) argv.insert(argv.end(),string(*akt));
-
- unsigned int free_parms_count=0;
- for (vector<string>::iterator akt_p=argv.begin()+1;akt_p<argv.end();akt_p++){ //Argument loop
-
- // Look for long argument
- if ((akt_p->substr(0,2)=="--")&&(free_parms_count==0)){
- int found=0;
- for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
- if (akt_p->substr(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+1<argv.end()) { // If next word existend
- *(parm_p->status)=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; pos<akt_p->length()&& !stop_char_loop ;pos++){
- int found=0;
- for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
- if (parm_p->shortname[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
- printf("s word next\n");
- if (akt_p+1<argv.end()) { // If next word existend
- *(parm_p->target)=*(++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_count<free_arguments.size()){
- *(free_arguments[free_parms_count].target)=*akt_p;
- }
- free_parms_count++;
- }
- } //looking for not -- args
- } // argv loop
- if (free_parms_count>free_arguments.size()) result.insert(result.begin(),"Too many arguments!");
- if (!result.empty()) get_help(result);
- return result;
-}
-
-
-void argreader::get_help(vector<string> & result){
- result.insert(result.end(),"Usage:");
- string line=" "+progname+" ";
- for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
- line+="[-"+parm_p->shortname;
- if (parm_p->target!=0) line+=parm_p->placeholder;
- line+="] ";
- }
- result.insert(result.end(),line);
-}
-
-vector<string> argreader::get_help(){
- vector<string> result;
- get_help(result);
- return result;
-}
-
-
-/**************************************************/
-
-argreader::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;
-}
-
-argreader::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;
-}
-
-
-
-
+++ /dev/null
-#ifndef ARGREAD_H
-#define ARGREAD_H
-
-#include <vector>
-#include <string>
-
-using namespace std;
-
-#ifndef NULL
-#define NULL (void*)0
-#endif
-
-class argreader{
-public:
- argreader(string n_name);
-
- /*!
- *\brief add a parameter to be looked 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 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 "<filename>" in -f<filename>
- */
- void add_param (string shortname, string longname, string description, int * status,
- string * target=NULL, string placeholder=string("<string>"));
-
- /*!
- * Read in the args passed to main().
- *\returns empty vector on success or the error messages to be output.
- */
- vector<string> read_args(int argc, char ** args);
-
-
- vector<string> & get_free_args();
-
- void get_help(vector<string> & );
- vector<string> get_help();
-
- void add_free_param(string placeholder, string description, int * status, string * target);
-
-
-
-private:
- class parameter{
- public:
- parameter (string shortname, string longname,string description, int * status,
- string * target=NULL, string placeholder=string("<string>"));
- string shortname;
- string longname;
- int * status;
- string * target;
- string description;
- string placeholder;
- };
-
- class free_parameter{
- public:
- free_parameter (string placeholder,string description,
- int * status, string * target);
- int * status;
- string * target;
- string description;
- string placeholder;
- };
-
- vector<parameter>arguments;
- vector<free_parameter>free_arguments;
-
- string progname;
-};
-
-
-#endif
--- /dev/null
+#include "argument_reader.hh"
+#include <stdio.h>
+
+/*!
+ *\brief Constructor.
+ *
+ * This constructor makes a new argument_reader ready to use.
+ *\arg app_name Name of the application as mentioned in the
+ * "Use: <appname> ..." 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 "<filename>" in -f<filename>
+ */
+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 "<input-file>".
+ *\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<string> argument_reader::read_args(int argc, char ** args){
+ vector<string> result;
+ vector<string> argv;
+ for (char ** akt=args; *akt ;akt++) argv.insert(argv.end(),string(*akt));
+
+ unsigned int free_parms_count=0;
+ for (vector<string>::iterator akt_p=argv.begin()+1;akt_p<argv.end();akt_p++){ //Argument loop
+
+ // Look for long argument
+ if ((akt_p->substr(0,2)=="--")&&(free_parms_count==0)){
+ int found=0;
+ for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
+ if (akt_p->substr(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+1<argv.end()) { // If next word existend
+ *(parm_p->status)=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; pos<akt_p->length()&& !stop_char_loop ;pos++){
+ int found=0;
+ for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
+ if (parm_p->shortname[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+1<argv.end()) { // If next word existend
+ *(parm_p->target)=*(++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_count<free_arguments.size()){
+ *(free_arguments[free_parms_count].target)=*akt_p;
+ }
+ free_parms_count++;
+ }
+ } //looking for not -- args
+ } // argv loop
+ if (free_parms_count>free_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<string> to which lots of helpful
+ * strings are appended.
+ */
+void argument_reader::get_help(vector<string> & result){
+
+ result.insert(result.end(),"");
+ string line="Usage: "+progname;
+ for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
+ string addstr=" [-"+parm_p->shortname;
+ 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<free_parameter>::iterator parm_p=free_arguments.begin();parm_p<free_arguments.end();parm_p++){
+ if (line.length()+parm_p->placeholder.length()>79){
+ result.insert(result.end(),line);
+ line=string(7+progname.length(),' ');
+ }
+ line+=" ["+parm_p->placeholder+"]";
+ }
+ result.insert(result.end(),line);
+
+ /*******************************/
+
+ vector<string> left,right;
+ for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
+ line=parm_p->description;
+ 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<free_parameter>::iterator parm_p=free_arguments.begin();parm_p<free_arguments.end();parm_p++){
+ string st2;
+ line=parm_p->description;
+ 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; c<arguments.size();c++)
+ if(left[c].length()>max_width) max_width=left[c].length();
+ for (unsigned int c=0; c<arguments.size();c++){
+ string nl(max_width,' ');
+ nl.replace(0,left[c].length(),left[c]);
+ nl+=" "+right[c];
+ while (nl.length()>80){ // 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(); c<arguments.size()+free_arguments.size();c++)
+ if(left[c].length()>max_width) max_width=left[c].length();
+ for (unsigned int c=arguments.size(); c<arguments.size()+free_arguments.size();c++){
+ string nl(max_width,' ');
+ nl.replace(0,left[c].length(),left[c]);
+ nl+=" "+right[c];
+
+ while (nl.length()>80){ // 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<string> argument_reader::get_help(){
+ vector<string> 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;
+}
--- /dev/null
+#ifndef ARGUMENT_READER_H
+#define ARGUMENT_READER_H
+
+#include <vector>
+#include <string>
+
+using namespace std;
+
+/*!
+ *\brief Hachti's wonderful commandline parser.
+ *
+ * This class is designed to do all the work with the parameters passed to
+ * the main() routine of a program.\n
+ * Usage:\n
+ * - Create an instance.
+ * - Add Parameters/switches with add_param().
+ * - Add Arguments with add_argument().
+ * - Call read_args() with your main routine's arguments.\
+ * The vector returned by read_args() contains all error \
+ * messages. When it's empty, everything is fine!
+ * - Call get_help() if you want nice formatted help output. \
+ * (You want!!!)
+ * Sould be easy to use..... Enjoy.
+ */
+class argument_reader{
+
+public:
+ argument_reader(string n_name);
+
+ void add_param (string shortname,
+ string longname,
+ string description,
+ int * status,
+ string * target=NULL,
+ string placeholder=string("<string>")
+ );
+
+ vector<string> read_args(int argc, char ** args);
+
+ void get_help(vector<string> & target);
+ vector<string> get_help();
+
+ void add_argument(string placeholder, string description, int * status, string * target);
+
+private:
+ class parameter{
+ public:
+ parameter (string shortname, string longname,string description, int * status,
+ string * target=NULL, string placeholder=string("<string>"));
+ string shortname;
+ string longname;
+ int * status;
+ string * target;
+ string description;
+ string placeholder;
+ };
+
+ class free_parameter{
+ public:
+ free_parameter (string placeholder,string description,
+ int * status, string * target);
+ int * status;
+ string * target;
+ string description;
+ string placeholder;
+ };
+
+ vector<parameter>arguments;
+ vector<free_parameter>free_arguments;
+
+ string progname;
+};
+
+
+#endif
printf("tape_stop\n");
}
-
-
-
void dump_vector(vector<string> arguments){
for (vector<string>::iterator iter=arguments.begin();iter<arguments.end();iter++){
printf("%s\n",(*iter).c_str());
string filename;
argreader ar("ldc2");
- ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
ar.add_param("h","help","Give help",&help_needed);
- ar.add_free_param("<file>","File to read data from",&file_set,&filename);
-
-
-
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name Gelaber Gelaber Gelaber Gelaber M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_param("n","name=","Enter other name",&name_set,&name,"<name>");
+ ar.add_free_param("<input-blaaaaaaaaaaaaaaa-filename>","File to read data from",&file_set,&filename);
+
dump_vector(ar.read_args(argc,args));
- if (help_needed==1) dump_vector(ar.get_help());
+ if (help_needed){
+ dump_vector(ar.get_help());
+ exit(1);
+ }
- printf("Hallo %s!\n",name.c_str());
+ printf("\n\n\nHallo %s!\n",name.c_str());
exit(0);
tape_block * myblock=0;
do{