00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 #ifndef _PARGLIST
00122 #define _PARGLIST
00123 
00124 #ifdef P_USE_PRAGMA
00125 #pragma interface
00126 #endif
00127 
00132 class PArgList : public PObject
00133 {
00134   PCLASSINFO(PArgList, PObject);
00135 
00136   public:
00149     PArgList(
00150       const char * theArgPtr = NULL,        
00151       const char * argumentSpecPtr = NULL,  
00152       BOOL optionsBeforeParams = TRUE       
00153     );
00155     PArgList(
00156       const PString & theArgStr,             
00157       const char * argumentSpecPtr = NULL,   
00158       BOOL optionsBeforeParams = TRUE        
00159     );
00161     PArgList(
00162       const PString & theArgStr,             
00163       const PString & argumentSpecStr,       
00164       BOOL optionsBeforeParams = TRUE        
00165     );
00167     PArgList(
00168       int theArgc,                           
00169       char ** theArgv,                       
00170       const char * argumentSpecPtr = NULL,   
00171       BOOL optionsBeforeParams = TRUE        
00172     );
00174     PArgList(
00175       int theArgc,                           
00176       char ** theArgv,                       
00177       const PString & argumentSpecStr,       
00178       BOOL optionsBeforeParams = TRUE        
00179     );
00181 
00186     virtual void PrintOn(
00187       ostream & strm  
00188     ) const;
00189 
00193     virtual void ReadFrom(
00194       istream & strm  
00195     );
00197 
00202     void SetArgs(
00203       const PString & theArgStr 
00204     );
00206     void SetArgs(
00207       int theArgc,     
00208       char ** theArgv  
00209     );
00211     void SetArgs(
00212       const PStringArray & theArgs 
00213     );
00214 
00237     virtual BOOL Parse(
00238       const char * theArgumentSpec,    
00239       BOOL optionsBeforeParams = TRUE  
00240     );
00242     virtual BOOL Parse(
00243       const PString & theArgumentStr,  
00244       BOOL optionsBeforeParams = TRUE  
00245     );
00247 
00255     virtual PINDEX GetOptionCount(
00256       char optionChar        
00257     ) const;
00259     virtual PINDEX GetOptionCount(
00260       const char * optionStr 
00261     ) const;
00263     virtual PINDEX GetOptionCount(
00264       const PString & optionName 
00265     ) const;
00266 
00272     BOOL HasOption(
00273       char optionChar             
00274     ) const;
00276     BOOL HasOption(
00277       const char * optionStr     
00278     ) const;
00280     BOOL HasOption(
00281       const PString & optionName 
00282     ) const;
00283 
00292     virtual PString GetOptionString(
00293       char optionChar,          
00294       const char * dflt = NULL  
00295     ) const;
00297     virtual PString GetOptionString(
00298       const char * optionStr,   
00299       const char * dflt = NULL  
00300     ) const;
00302     virtual PString GetOptionString(
00303       const PString & optionName, 
00304       const char * dflt = NULL    
00305     ) const;
00306 
00314     PINDEX GetCount() const;
00315 
00320     PStringArray GetParameters(
00321       PINDEX first = 0,
00322       PINDEX last = P_MAX_INDEX
00323     ) const;
00324 
00329     PString GetParameter(
00330       PINDEX num   
00331     ) const;
00332 
00338     PString operator[](
00339       PINDEX num   
00340     ) const;
00341 
00345     void Shift(
00346       int sh 
00347     );
00348 
00352     PArgList & operator<<(
00353       int sh 
00354     );
00355 
00359     PArgList & operator>>(
00360       int sh 
00361     );
00363 
00370     virtual void IllegalArgumentIndex(
00371       PINDEX idx 
00372     ) const;
00373 
00378     virtual void UnknownOption(
00379       const PString & option   
00380     ) const;
00381 
00387     virtual void MissingArgument(
00388       const PString & option  
00389     ) const;
00391 
00392   protected:
00394     PStringArray argumentArray;
00396     PString      optionLetters;
00398     PStringArray optionNames;
00400     PIntArray    optionCount;
00402     PStringArray optionString;
00404     PIntArray    parameterIndex;
00406     int          shift;
00407 
00408   private:
00409     BOOL ParseOption(PINDEX idx, PINDEX offset, PINDEX & arg, const PIntArray & canHaveOptionString);
00410     PINDEX GetOptionCountByIndex(PINDEX idx) const;
00411     PString GetOptionStringByIndex(PINDEX idx, const char * dflt) const;
00412 };
00413 
00414 
00415 #ifdef P_CONFIG_FILE
00416 
00420 class PConfigArgs : public PArgList
00421 {
00422     PCLASSINFO(PConfigArgs, PArgList);
00423   public:
00426     PConfigArgs(
00427       const PArgList & args   
00428     );
00430 
00438     virtual PINDEX GetOptionCount(
00439       char optionChar  
00440     ) const;
00442     virtual PINDEX GetOptionCount(
00443       const char * optionStr 
00444     ) const;
00446     virtual PINDEX GetOptionCount(
00447       const PString & optionName 
00448     ) const;
00449 
00458     virtual PString GetOptionString(
00459       char optionChar,          
00460       const char * dflt = NULL  
00461     ) const;
00462 
00464     virtual PString GetOptionString(
00465       const char * optionStr,   
00466       const char * dflt = NULL  
00467     ) const;
00468 
00470     virtual PString GetOptionString(
00471       const PString & optionName, 
00472       const char * dflt = NULL    
00473     ) const;
00475 
00484     void Save(
00485       const PString & optionName   
00486     );
00487 
00490     void SetSectionName(
00491       const PString & section 
00492     ) { sectionName = section; }
00493 
00496     const PString & GetSectionName() const { return sectionName; }
00497 
00501     void SetNegationPrefix(
00502       const PString & prefix 
00503     ) { negationPrefix = prefix; }
00504 
00508     const PString & GetNegationPrefix() const { return negationPrefix; }
00510 
00511 
00512   protected:
00513     PString CharToString(char ch) const;
00514     PConfig config;
00515     PString sectionName;
00516     PString negationPrefix;
00517 };
00518 
00519 #endif // P_CONFIG_FILE
00520 
00521 #endif
00522 
00523