00001 #ifndef gARG_X_H
00002 #define gARG_X_H
00003
00004 #include "glist.h"
00005 #include "gstring.h"
00006 #include "gcontrol.h"
00007
00008 #define MAX_REAL_LVAL 2147483648.0
00009
00010
00011
00012
00013
00014 enum eParamConfig {
00015 e_ParamNotUsed,
00016 e_ParamUsedSingle,
00017 e_ParamUsedRepeat,
00018 e_ParamDashSimple,
00019 e_ParamNonPosix,
00020 };
00021
00022 class gParam : public gList {
00023 public:
00024
00025 enum eParamCriteria {
00026 e_Normal,
00027 e_StopSplitOnFirst = 1,
00028 e_NormalQuoted
00029 };
00030
00031
00032 gParam () ;
00033 gParam (gString& copy, char* sParamSplit=nil, eParamCriteria aParamCriteria=e_Normal) ;
00034 gParam (char* s, char* sParamSplit=nil, eParamCriteria aParamCriteria=e_Normal) ;
00035 virtual ~gParam () ;
00036
00037
00038 gString strParamSplit;
00039 static bool doAutoTrim;
00040
00041
00042 gStorage* GetNewObjectFromFormat (char* s) ;
00043 virtual unsigned Find (gString& s, gString& sSubStr, int iCriteria) ;
00044
00045 protected:
00046 eParamCriteria paramCriteria;
00047
00048
00049 int thisSplit (char* s, gString& strSplit, gList& resL) ;
00050
00051 private:
00052
00053 gParam (gParam& ) ;
00054 gParam& operator= (gParam& ) ;
00055 };
00056
00057 struct sParamRaw {
00058
00059 enum eParamFollow {
00060 e_ParamNoVal,
00061 e_ParamThisArg,
00062 e_ParamNextArg
00063 };
00064
00065 sParamRaw (eParamFollow aParamFollow=e_ParamNoVal) ;
00066 ~sParamRaw () ;
00067
00068
00069 eParamFollow paramFollow;
00070 gString sufStr;
00071 gString paramSep;
00072 gList members;
00073 unsigned posControl;
00074 gStorage* myParamVal;
00075
00076 gStorage* GetParamVal () ;
00077 bool BuildParamVal (char* s) ;
00078 bool AddMember (char* s) ;
00079 };
00080
00081 class gParamVal : public gControl {
00082 public:
00083 gParamVal ()
00084 : gControl( e_StoreExtend ),
00085 cVal( 0 ),
00086 lVal( MAX_LONG_L ),
00087 realVal( MAX_REAL_LVAL ),
00088 repeats( -1 ),
00089 errorCode( 0 ) {
00090 }
00091 virtual ~gParamVal () {
00092 }
00093
00094
00095 t_uchar cVal;
00096 gString allStr;
00097 gString sufStr;
00098 gString sVal;
00099 long long lVal;
00100 float realVal;
00101 short repeats;
00102 int errorCode;
00103
00104
00105 bool GetChar (t_uchar& chr) {
00106 if ( cVal==0 ) return false;
00107 chr = cVal;
00108 return true;
00109 }
00110 long GetLongValue () {
00111 long val;
00112 if ( GetLong(val)==false ) return 0;
00113 return (int)val;
00114 }
00115 bool GetLong (long& val) {
00116 if ( lVal==MAX_LONG_L ) return false;
00117 val = (long)lVal;
00118 return true;
00119 }
00120 bool GetFloat (float& val) {
00121 if ( realVal>=MAX_REAL_LVAL ) return false;
00122 val = realVal;
00123 return true;
00124 }
00125
00126
00127 bool SetLong (long val) {
00128 lVal = val;
00129 realVal = (long)val;
00130 return true;
00131 }
00132 bool SetString (char* s) {
00133 lVal = MAX_LONG_L;
00134 realVal = MAX_REAL_LVAL;
00135 sVal = s;
00136 return s!=nil;
00137 }
00138
00139 void CopyParam (gParamVal& copy) ;
00140 virtual bool AddToList (gList& resL) ;
00141 virtual bool FillParam (gString& newSVal, gStorage* aObj) ;
00142
00143
00144 gParamVal* FindObj (gList& copyL, t_uchar chr, unsigned& idx) ;
00145 unsigned FindMainChar (gList& copyL, t_uchar chr) ;
00146
00147
00148 virtual gStorage* NewObject () ;
00149 virtual t_uchar* ToString (t_uchar* uBuf) ;
00150
00151
00152 virtual void Show (bool doShowAll=true) ;
00153
00154 private:
00155
00156 gParamVal (gParamVal& ) ;
00157 gParamVal& operator= (gParamVal& ) ;
00158 };
00159
00160 class gParamElem : public gList {
00161 public:
00162 gParamElem (eParamConfig aParamConfig=e_ParamNotUsed) ;
00163 virtual ~gParamElem () ;
00164
00165
00166 eParamConfig paramConfig;
00167 t_uchar mainChr;
00168 sParamRaw sRaw;
00169
00170
00171 t_uchar MainChar () {
00172 return mainChr==0 ? ' ' : mainChr;
00173 }
00174
00175
00176 unsigned Add (gString& copy) ;
00177 unsigned Add (char* s) ;
00178
00179 virtual gStorage* NewObject () ;
00180
00181 private:
00182
00183 gParamElem (gParamElem& ) ;
00184 gParamElem& operator= (gParamElem& ) ;
00185 };
00186
00187 class gArg : public gList {
00188 public:
00189 gArg (char** argv, char** envp=nil) ;
00190 virtual ~gArg () ;
00191
00192
00193 gString prog;
00194 gList env;
00195 gList param;
00196 gList opt;
00197 gList errors;
00198 short nParamDashWordSimple;
00199
00200
00201 unsigned NumberParams () {
00202 return param.N();
00203 }
00204 char* Program () {
00205 return programName.Str();
00206 }
00207 gParamVal* GetOptionPtr (unsigned idx) ;
00208
00209
00210 int AddParams (t_uint16 paramStart, char* s) ;
00211 int FlushParams () ;
00212
00213
00214 bool NoArg () {
00215 return N()==0;
00216 }
00217 bool FindOption (char c) ;
00218 bool FindOption (char* s) ;
00219 bool FindOption (char* s, int& val) ;
00220 bool FindOption (char* s, long& val) ;
00221 bool FindOption (char c, gString& sRes) ;
00222 bool FindOption (char* s, gString& sRes) ;
00223 bool FindOptionOccurr (char* s, short& nRepeats) ;
00224 bool FindOptionOccurr (char* s, bool& b1) ;
00225 bool FindOptionOccurr (char* s, bool& b1, bool& b2) ;
00226
00227
00228 virtual t_uchar* ToString (t_uchar* uBuf) ;
00229 virtual bool SaveGuts (FILE* f) { return true; }
00230 virtual bool RestoreGuts (FILE* f) { return true; }
00231
00232
00233 virtual void Show (bool doShowAll=true) ;
00234
00235 protected:
00236 gParamElem* internParams;
00237 unsigned keepPos;
00238
00239
00240 bool thisProgramName () ;
00241 bool thisAddOneParam (t_uint16 paramStart, char* sParam, gList& resL) ;
00242
00243 bool thisBuildInternParam (gList& paramIn, char* strSepSplit) ;
00244
00245 bool thisProcessParamElem (gParam& aParam, gParamElem& paramElem) ;
00246
00247 bool thisProcessParamElem (gParam& aParam,
00248 gParamElem& paramElem,
00249 bool& isDashWordSimple) ;
00250
00251 unsigned thisFindParamFromChr (t_uchar inChr,
00252 unsigned nParams,
00253 gParamElem* intParams) ;
00254
00255 unsigned thisFindParamFromStr (char* s,
00256 unsigned nParams,
00257 gParamElem* intParams,
00258 bool& doMatch,
00259 unsigned& possibleParamIdx) ;
00260
00261 bool thisFillParamFromChr (t_uchar inChr,
00262 unsigned nParams,
00263 gParamElem* intParams,
00264 gParamVal& paramVal) ;
00265
00266 bool thisFillParamFromStr (char* s,
00267 unsigned paramRef,
00268 unsigned nParams,
00269 gParamElem* intParams,
00270 gParamVal& paramVal) ;
00271
00272 int thisFlushAll (gList& inputL,
00273 gList& paramIn,
00274 unsigned nParams,
00275 gParamElem* intParams,
00276 gList& resArgL,
00277 gList& resOptL,
00278 gList& resErrL) ;
00279
00280 private:
00281 eParamConfig paramLetter[256];
00282 gString programName;
00283
00284
00285 gArg (gArg& ) ;
00286 gArg& operator= (gArg& ) ;
00287 };
00288
00289 #endif //gARG_X_H
00290