00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __PARAMETERS_H__
00019 #define __PARAMETERS_H__
00020
00021 #include "StringMap.h"
00022
00023 #include <ctype.h>
00024 #include <stddef.h>
00025
00026 class ParameterList;
00027
00028 class Parameter
00029 {
00030 protected:
00031 char ch;
00032 char * description;
00033 void * var;
00034
00035 static int nameCol;
00036 static int statusCol;
00037
00038 virtual void Translate(const char * value) = 0;
00039 virtual bool TranslateExtras(const char * value, const char * extras);
00040
00041 static bool CheckInteger(const char * value);
00042 static bool CheckDouble(const char * value);
00043
00044 String * warnings;
00045
00046 public:
00047
00048 Parameter(char c, const char * desc, void * v);
00049
00050 virtual ~Parameter()
00051 {
00052 delete [] description;
00053 }
00054
00055 virtual bool Read(int argc, char ** argv, int argn);
00056 virtual void Status() = 0;
00057
00058 static void SetNameLen(int len)
00059 {
00060 nameCol = len;
00061 }
00062 static void SetStatusLen(int len)
00063 {
00064 statusCol = len;
00065 }
00066
00067 void SetWarningBuffer(String & buffer)
00068 {
00069 warnings = &buffer;
00070 }
00071 void warning(const char * format, ...);
00072
00073 friend class ParameterList;
00074 };
00075
00076 class IntParameter : public Parameter
00077 {
00078 public:
00079 IntParameter(char c, const char * desc, int & v)
00080 : Parameter(c, desc, &v)
00081 {}
00082
00083 virtual void Status();
00084
00085 protected:
00086 virtual void Translate(const char * value);
00087 virtual bool TranslateExtras(const char * value, const char * extras);
00088 };
00089
00090 class HiddenInteger : public IntParameter
00091 {
00092 public:
00093 HiddenInteger(char c, const char * desc, int & v)
00094 : IntParameter(c, desc, v)
00095 {}
00096
00097 virtual void Status() { }
00098 };
00099
00100
00101 class SwitchParameter : public Parameter
00102 {
00103 public:
00104 SwitchParameter(char c, const char * desc, bool & v)
00105 : Parameter(c, desc, &v)
00106 {}
00107
00108 virtual void Status();
00109
00110 protected:
00111 virtual void Translate(const char * value);
00112 };
00113
00114 class HiddenSwitch : public SwitchParameter
00115 {
00116 public:
00117 HiddenSwitch(char c, const char * desc, bool & v)
00118 : SwitchParameter(c, desc, v)
00119 {}
00120
00121 virtual void Status() { }
00122 };
00123
00124 class DoubleParameter : public Parameter
00125 {
00126 public:
00127 DoubleParameter(char c, const char * desc, double & v);
00128
00129 virtual void Status();
00130
00131 DoubleParameter & SetPrecision(int precision)
00132 {
00133 this->precision = precision;
00134
00135 return *this;
00136 }
00137
00138 protected:
00139 virtual void Translate(const char * value);
00140 virtual bool TranslateExtras(const char * value, const char * extras);
00141
00142 int precision;
00143 };
00144
00145 class HiddenDouble : public DoubleParameter
00146 {
00147 public:
00148 HiddenDouble(char c, const char * desc, double &v)
00149 : DoubleParameter(c, desc, v)
00150 {}
00151
00152 virtual void Status() { }
00153 };
00154
00155 class StringParameter : public Parameter
00156 {
00157 public:
00158 StringParameter(char c, const char * desc, String & v, bool allowBlank = true)
00159 : Parameter(c, desc, &v)
00160 {
00161 required = !allowBlank;
00162 }
00163
00164 virtual void Status();
00165
00166 protected:
00167 bool required;
00168
00169 virtual void Translate(const char * value);
00170 virtual bool TranslateExtras(const char * value, const char * extras);
00171 };
00172
00173 class HiddenString : public StringParameter
00174 {
00175 public:
00176 HiddenString(char c, const char * desc, String & v)
00177 : StringParameter(c, desc, v)
00178 {}
00179
00180 virtual void Status() { }
00181 };
00182
00183 struct OptionList
00184 {
00185 char ch;
00186 char * description;
00187 int code;
00188 };
00189
00190 #define BEGIN_OPTION_LIST(name) ; OptionList name[] = {
00191 #define END_OPTION_LIST(none) , {0, none, 0} };
00192
00193 class ListParameter : public Parameter
00194 {
00195 public:
00196 ListParameter(char c, const char * desc, int & v, OptionList * opt);
00197
00198 virtual void Status();
00199
00200 protected:
00201 String key;
00202 OptionList * options;
00203 virtual void Translate(const char * value);
00204 };
00205
00206 class SetParameter : public Parameter
00207 {
00208 public:
00209 SetParameter(char c, const char * desc, int & v, OptionList * opt);
00210
00211 virtual void Status();
00212
00213 protected:
00214 String key;
00215 OptionList * options;
00216 virtual void Translate(const char * value);
00217 };
00218
00219 struct LongParameterList
00220 {
00221 const char * description;
00222 void * value;
00223 bool exclusive;
00224 int type;
00225 bool touched;
00226 };
00227
00228 #define LP_BOOL_PARAMETER 1
00229 #define LP_INT_PARAMETER 2
00230 #define LP_DOUBLE_PARAMETER 3
00231 #define LP_STRING_PARAMETER 4
00232 #define LP_LEGACY_PARAMETERS 99
00233
00234 #define BEGIN_LONG_PARAMETERS(array) LongParameterList array[] = {\
00235 { NULL, NULL, false, 0, 0},
00236 #define LONG_PARAMETER_GROUP(label) { label, NULL, false, 0, 0},
00237 #define LONG_PARAMETER(label,boolptr) { label, boolptr, false, 1, 0},
00238 #define EXCLUSIVE_PARAMETER(label,boolptr) { label, boolptr, true, 1, 0},
00239 #define LONG_INTPARAMETER(label,intptr) { label, intptr, false, 2, 0},
00240 #define LONG_SMARTINTPARAMETER(label,intptr) { label, intptr, true, 2, 0},
00241 #define LONG_DOUBLEPARAMETER(label,doubleptr) { label, doubleptr, false, 3, 0},
00242 #define LONG_STRINGPARAMETER(label,stringptr) { label, stringptr, false, 4, 0},
00243 #define BEGIN_LEGACY_PARAMETERS() { "$$$", NULL, false, 99, 0},
00244 #define END_LONG_PARAMETERS() { NULL, NULL, false, 0, 0}};
00245
00246 class LongParameters : public Parameter
00247 {
00248 public:
00249 LongParameters(const char * desc, LongParameterList * list);
00250
00251 virtual void Status();
00252
00253 LongParameters * SetPrecision(int precision)
00254 {
00255 this->precision = precision;
00256
00257 return this;
00258 }
00259
00260 protected:
00261 StringMap index;
00262 StringMap legacyIndex;
00263
00264 LongParameterList * list;
00265 int group_len;
00266 int precision;
00267
00268 virtual void Translate(const char * value);
00269 virtual bool TranslateExtras(const char * value, const char * extras);
00270
00271 void ExplainAmbiguity(const char * value);
00272
00273 void Status(LongParameterList * ptr, int & line_len, bool & need_a_comma);
00274 };
00275
00276 class ParameterList
00277 {
00278 protected:
00279 Parameter ** pl;
00280 int count;
00281 int size;
00282
00283 void MakeString(int argc, char ** argv, int start = 1);
00284
00285 public:
00286 char * string;
00287
00288 ParameterList(int s = 36)
00289 {
00290 size = s;
00291 count = 0;
00292 pl = new Parameter * [size];
00293 string = NULL;
00294 }
00295
00296 virtual ~ParameterList();
00297
00298 void Add(Parameter * p);
00299
00300
00301 virtual void Read(int argc, char ** argv, int start = 1);
00302
00303
00304
00305 virtual int ReadWithTrailer(int argc, char ** argv, int start = 1);
00306
00307
00308 virtual void Status();
00309
00310
00311 String warnings;
00312 String messages;
00313
00314
00315 void Enforce(bool & var, bool value, const char * reason, ...);
00316 void Enforce(int & var, int value, const char * reason, ...);
00317 void Enforce(double & var, double value, const char * reason, ...);
00318 void Enforce(String & var, const char * value, const char * reason, ...);
00319 };
00320
00321 #endif