00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _CMDLINEPARSER_H_
00025 #define _CMDLINEPARSER_H_
00026
00027 #include <stlib/Object.h>
00028 #include <stlib/Character.h>
00029 #include <stlib/OrderedCollection.h>
00030 #include <stlib/String.h>
00031
00032 #include <stlib/Callback0.h>
00033 #include <stlib/Callback1.h>
00034
00035 struct option;
00036
00037 namespace Tools {
00038
00039 class CommandLineParser : public Core::Object
00040 {
00041 protected:
00042 OrderedCollection *_arguments;
00043 Callback<void> *extra_argument_handler;
00044 bool parameters_mandatory;
00045
00046 public:
00047 CommandLineParser(void);
00048
00049
00050 virtual String *className(void) const;
00051
00052
00053 template <class TReceiver>
00054 void addMandatoryArgument(char *longArg,
00055 TReceiver *receiver, void (TReceiver::*execFunc)(void))
00056 {
00057 Callback0<TReceiver,void> *callback;
00058 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00059 addArgument(new String(longArg), nil, true, callback);
00060 }
00061
00062 template <class TReceiver>
00063 void addMandatoryArgument(char *longArg, char shortArg,
00064 TReceiver *receiver, void (TReceiver::*execFunc)(void))
00065 {
00066 Callback0<TReceiver,void> *callback;
00067 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00068 addArgument(new String(longArg), Character::value(shortArg),
00069 true, callback);
00070 }
00071
00072 template <class TReceiver, class TParam>
00073 void addMandatoryArgument(char *longArg, char shortArg,
00074 TReceiver *receiver, void (TReceiver::*execFunc)(TParam),
00075 TParam userData)
00076 {
00077 Callback1<TReceiver,void,TParam> *callback;
00078 callback = new Callback1<TReceiver,void,TParam>(receiver, execFunc);
00079 addArgument(new String(longArg), Character::value(shortArg), false,
00080 callback, userData);
00081 }
00082
00083 template <class TReceiver>
00084 void addOptionalArgument(char *longArg,
00085 TReceiver *receiver, void (TReceiver::*execFunc)(void))
00086 {
00087 Callback0<TReceiver,void> *callback;
00088 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00089 addArgument(new String(longArg), nil, false, callback);
00090 }
00091
00092 template <class TReceiver>
00093 void addOptionalArgument(char *longArg, char shortArg,
00094 TReceiver *receiver, void (TReceiver::*execFunc)(void))
00095 {
00096 Callback0<TReceiver,void> *callback;
00097 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00098 addArgument(new String(longArg), Character::value(shortArg),
00099 false, callback);
00100 }
00101
00102 template <class TReceiver, class TParam>
00103 void addOptionalArgument(char *longArg, char shortArg,
00104 TReceiver *receiver, void (TReceiver::*execFunc)(TParam),
00105 TParam userData)
00106 {
00107 Callback1<TReceiver,void,TParam> *callback;
00108 callback = new Callback1<TReceiver,void,TParam>(receiver, execFunc);
00109 addArgument(new String(longArg), Character::value(shortArg), false,
00110 callback, userData);
00111 }
00112
00113 template <class TReceiver>
00114 void addMandatoryArgumentWithParameter(char *longArg,
00115 TReceiver *receiver, void (TReceiver::*execFunc)(String *))
00116 {
00117 Callback1<TReceiver,void,String*> *callback;
00118 callback = new Callback1<TReceiver,void,String*>(receiver, execFunc);
00119 addArgument(new String(longArg), nil, false, callback);
00120 }
00121
00122 template <class TReceiver>
00123 void addMandatoryArgumentWithParameter(char *longArg, char shortArg,
00124 TReceiver *receiver, void (TReceiver::*execFunc)(String *))
00125 {
00126 Callback1<TReceiver,void,String*> *callback;
00127 callback = new Callback1<TReceiver,void,String*>(receiver, execFunc);
00128 addArgument(new String(longArg), Character::value(shortArg),
00129 false, callback);
00130 }
00131
00132 template <class TReceiver>
00133 void addOptionalArgumentWithParameter(char *longArg,
00134 TReceiver *receiver, void (TReceiver::*execFunc)(String *))
00135 {
00136 Callback1<TReceiver,void,String*> *callback;
00137 callback = new Callback1<TReceiver,void,String*>(receiver, execFunc);
00138 addArgument(new String(longArg), nil, false, callback);
00139 }
00140
00141 template <class TReceiver>
00142 void addOptionalArgumentWithParameter(char *longArg, char shortArg,
00143 TReceiver *receiver, void (TReceiver::*execFunc)(String *))
00144 {
00145 Callback1<TReceiver,void,String*> *callback;
00146 callback = new Callback1<TReceiver,void,String*>(receiver, execFunc);
00147 addArgument(new String(longArg), Character::value(shortArg),
00148 false, callback);
00149 }
00150
00151 template <class TReceiver>
00152 void setExtraParametersHandler(TReceiver *receiver,
00153 void (TReceiver::*execFunc)(Array *))
00154 {
00155 Callback1<TReceiver,void,Array*> *callback;
00156 callback = new Callback1<TReceiver,void,Array*>(receiver, execFunc);
00157 extra_argument_handler = callback;
00158 }
00159
00160 virtual void parametersMandatory(bool isMandatory);
00161
00162
00163 virtual void process(int argc, char **argv);
00164
00165
00166 virtual void addArgument(String *longArg, Character *shortArg,
00167 bool mandatory, Callback<void> *callback,
00168 Object *userData = nil);
00169 virtual String *collectShortOptions(void);
00170 virtual struct option *collectLongOptions(void);
00171 virtual void checkMissingArguments(void);
00172 };
00173
00174 };
00175
00176 #endif