00001 #ifndef _CTBargv_HXX
00002 #define _CTBargv_HXX 1
00003
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <strstream.h>
00017
00018 class CTBargv {
00019
00020 public:
00021
00022 CTBargv();
00023 CTBargv(int argc, char* argv[]);
00024
00025 ~CTBargv();
00026
00027 int Argc() const;
00028 const char* Argv(int i_ind) const;
00029
00030 bool Locate(const char* c_opt, int i_npar = 0);
00031
00032 const char* NextArg();
00033
00034 void CheckUnused();
00035 bool CheckErrors();
00036 bool CheckErrors(ostream& os);
00037
00038 void SetupStream(istrstream& istr);
00039 void CheckStream(istrstream& istr);
00040
00041 void ToStream(ostream& os = cout) const;
00042
00043 const char* operator[](int i_ind) const;
00044
00045 private:
00046
00047 struct argdsc {
00048 argdsc();
00049 char* mc_arg;
00050 int mi_nchar;
00051 int mi_ncharleft;
00052 bool mb_used;
00053 int mi_errorflags;
00054 };
00055
00056 static const int mi_error_conv = 0x0001;
00057 static const int mi_error_npar = 0x0002;
00058 static const int mi_error_unused = 0x0004;
00059
00060 int mi_argc;
00061 char* mc_args;
00062 argdsc* m_argv;
00063 int mi_curarg;
00064 };
00065
00066 ostream& operator<<(ostream& os, const CTBargv& av);
00067
00068 template <class T>
00069 CTBargv& operator>>(
00070 CTBargv& av,
00071 T& obj);
00072
00073
00074
00075
00076 template <class T>
00077 inline CTBargv& operator>>(
00078 CTBargv& av,
00079 T& obj)
00080 {
00081 const char* c_arg = av.NextArg();
00082
00083 if (c_arg) {
00084 istrstream istr(c_arg);
00085 av.SetupStream(istr);
00086 istr >> obj;
00087 av.CheckStream(istr);
00088 }
00089 return av;
00090 }
00091
00092
00093
00094
00095
00096
00097 inline CTBargv& operator>>(
00098 CTBargv& av,
00099 const char*& obj)
00100 {
00101 const char* c_arg = av.NextArg();
00102
00103 if (c_arg) {
00104 obj = c_arg;
00105 }
00106 return av;
00107 }
00108
00109
00110
00111 #if !(defined(CTB__OutLine) || defined(CTBargv__OutLine))
00112 #include "CTBargv.icc"
00113 #endif
00114
00115 #endif