*** empty log message ***
authorhachti <hachti>
Mon, 20 Nov 2006 07:31:13 +0000 (07:31 +0000)
committerhachti <hachti>
Mon, 20 Nov 2006 07:31:13 +0000 (07:31 +0000)
pc-tools/ldc2/src/argread.cpp [deleted file]
pc-tools/ldc2/src/argread.hh [deleted file]
pc-tools/ldc2/src/argument_reader.cpp [new file with mode: 0644]
pc-tools/ldc2/src/argument_reader.hh [new file with mode: 0644]
pc-tools/ldc2/src/main.cpp

diff --git a/pc-tools/ldc2/src/argread.cpp b/pc-tools/ldc2/src/argread.cpp
deleted file mode 100644 (file)
index 116dbb8..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#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;
-}
-
-
-  
-  
diff --git a/pc-tools/ldc2/src/argread.hh b/pc-tools/ldc2/src/argread.hh
deleted file mode 100644 (file)
index 7cd3aff..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#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
diff --git a/pc-tools/ldc2/src/argument_reader.cpp b/pc-tools/ldc2/src/argument_reader.cpp
new file mode 100644 (file)
index 0000000..e927a37
--- /dev/null
@@ -0,0 +1,268 @@
+#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;
+}
diff --git a/pc-tools/ldc2/src/argument_reader.hh b/pc-tools/ldc2/src/argument_reader.hh
new file mode 100644 (file)
index 0000000..1222176
--- /dev/null
@@ -0,0 +1,75 @@
+#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
index f8274103d6d8db868da086181623cc8d94043dd3..237d9971aaf52f397df9c8aa982964369df7fb96 100644 (file)
@@ -21,9 +21,6 @@ void tape_stop(void* m){
   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());
@@ -38,17 +35,38 @@ int main(int argc, char ** args){
   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{