SNAP Library, Developer Reference  2012-10-15 15:06:59
SNAP, a general purpose network analysis and graph mining library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
env.cpp
Go to the documentation of this file.
00001 
00002 // Environment
00003 TEnv::TEnv(const int& _Args, char** _ArgV, const PNotify& _Notify):
00004     ArgV(), HdStr(), MnArgs(1), SilentP(false), Notify(_Notify) {
00005   for (int ArgN = 0; ArgN < _Args; ArgN++)
00006       ArgV.Add(TStr(_ArgV[ArgN]));
00007 }
00008 
00009 TEnv::TEnv(const TStr& _ArgStr, const PNotify& _Notify):
00010     ArgV(), HdStr(), MnArgs(1), SilentP(false), Notify(_Notify) {
00011   _ArgStr.SplitOnAllCh(' ', ArgV);
00012 }
00013 
00014 TStr TEnv::GetExeFNm() const {
00015   TStr ExeFNm=GetArg(0);
00016   if (ExeFNm.IsPrefix("//?")){ // observed on Win64 CGI
00017     ExeFNm=ExeFNm.GetSubStr(3, ExeFNm.Len());
00018   }
00019   return ExeFNm;
00020 }
00021 
00022 TStr TEnv::GetCmLn(const int& FromArgN) const {
00023   TChA CmLnChA;
00024   for (int ArgN=FromArgN; ArgN<GetArgs(); ArgN++){
00025     if (ArgN>FromArgN){CmLnChA+=' ';}
00026     CmLnChA+=GetArg(ArgN);
00027   }
00028   return CmLnChA;
00029 }
00030 
00031 int TEnv::GetPrefixArgN(const TStr& PrefixStr) const {
00032   int ArgN=0;
00033   while (ArgN<GetArgs()){
00034     if (GetArg(ArgN).GetSubStr(0, PrefixStr.Len()-1)==PrefixStr){return ArgN;}
00035     ArgN++;
00036   }
00037   return -1;
00038 }
00039 
00040 TStr TEnv::GetArgPostfix(const TStr& PrefixStr) const {
00041   int ArgN=GetPrefixArgN(PrefixStr); IAssert(ArgN!=-1);
00042   TStr ArgStr=GetArg(ArgN);
00043   return ArgStr.GetSubStr(PrefixStr.Len(), ArgStr.Len());
00044 }
00045 
00046 void TEnv::PrepArgs(const TStr& _HdStr, const int& _MnArgs, const bool& _SilentP){
00047   // put environment state
00048   HdStr=_HdStr;
00049   MnArgs=_MnArgs;
00050   // silence
00051   SilentP=true;
00052   SilentP=Env.GetIfArgPrefixBool("-silent:", false, "Silence");
00053   // start header
00054   if (!SilentP){
00055     // print header
00056     if (!HdStr.Empty()){
00057       // print header-string
00058       TStr DateStr=__DATE__;
00059       printf("%s [%s]\n", HdStr.CStr(), DateStr.CStr());
00060       // print header-line
00061       for (int ChN=0; ChN<HdStr.Len()+DateStr.Len()+3; ChN++){printf("=");}
00062       printf("\n");
00063     }
00064     // print start of 'usage' message if not enough arguments
00065     if (Env.GetArgs()<=MnArgs){
00066       TStr ExeFNm=Env.GetArg(0).GetFBase();
00067       printf("usage: %s\n", ExeFNm.CStr());
00068     }
00069   }
00070 }
00071 
00072 bool TEnv::IsEndOfRun() const {
00073   if (!SilentP){
00074     // print line in length of header-line
00075     if (HdStr.Empty()){
00076       printf("========================================\n");
00077     } else {
00078       for (int ChN=0; ChN<HdStr.Len(); ChN++){printf("=");}
00079       printf("\n");
00080     }
00081   }
00082   // return
00083   return Env.GetArgs()<=MnArgs;
00084 }
00085 
00086 bool TEnv::IsArgStr(const TStr& ArgStr) {
00087   int ArgN=0;
00088   while (ArgN<GetArgs()){
00089     if (GetArg(ArgN)==ArgStr){return true;}
00090     ArgN++;
00091   }
00092   return false;
00093 }
00094 
00095 TStr TEnv::GetIfArgPrefixStr(
00096  const TStr& PrefixStr, const TStr& DfVal, const TStr& DNm) const {
00097   if (Env.GetArgs()<=MnArgs){
00098     // 'usage' argument message
00099     if (!SilentP){
00100       printf("   %s%s (default:'%s')\n", PrefixStr.CStr(), DNm.CStr(), DfVal.CStr());}
00101     return DfVal;
00102   } else {
00103     // argument & value message
00104     TStr Val;
00105     if (Env.IsArgPrefix(PrefixStr)){
00106       Val=Env.GetArgPostfix(PrefixStr);
00107       if (Val.Len()>1){
00108         if ((Val[0]=='\"')&&(Val.LastCh()=='\"')){
00109           Val=Val.GetSubStr(1, Val.Len()-2);
00110         }
00111       }
00112     } else {
00113       Val=DfVal;
00114     }
00115     TStr MsgStr=DNm+" ("+PrefixStr+")="+Val;
00116     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00117     return Val;
00118   }
00119 }
00120 
00121 TStrV TEnv::GetIfArgPrefixStrV(
00122  const TStr& PrefixStr, TStrV& DfValV, const TStr& DNm) const {
00123   TStrV ArgValV;
00124   if (Env.GetArgs()<=MnArgs){
00125     // 'usage' argument message
00126     if (!SilentP){
00127       printf("   %s%s (default:", PrefixStr.CStr(), DNm.CStr());
00128       for (int DfValN=0; DfValN<DfValV.Len(); DfValN++){
00129         if (DfValN>0){printf(", ");}
00130         printf("'%s'", DfValV[DfValN].CStr());
00131       }
00132       printf(")\n");
00133     }
00134     return ArgValV;
00135   } else {
00136     // argument & value message
00137     TStr ArgValVChA;
00138     for (int ArgN=0; ArgN<GetArgs(); ArgN++){
00139       // get argument string
00140       TStr ArgStr=GetArg(ArgN);
00141       if (ArgStr.GetSubStr(0, PrefixStr.Len()-1)==PrefixStr){
00142         // extract & add argument value
00143         TStr ArgVal=ArgStr.GetSubStr(PrefixStr.Len(), ArgStr.Len());
00144         ArgValV.Add(ArgVal);
00145         // add to message string
00146         if (ArgValV.Len()>1){ArgValVChA+=", ";}
00147         ArgValVChA+=ArgValV.Last();
00148       }
00149     }
00150     if (ArgValV.Empty()){ArgValV=DfValV;}
00151     // output argument values
00152     TChA MsgChA;
00153     MsgChA+=DNm; MsgChA+=" ("; MsgChA+=PrefixStr; MsgChA+=")=";
00154     for (int ArgValN=0; ArgValN<ArgValV.Len(); ArgValN++){
00155       if (ArgValN>0){MsgChA+=", ";}
00156       MsgChA+="'"; MsgChA+=ArgValV[ArgValN]; MsgChA+="'";
00157     }
00158     if (!SilentP){TNotify::OnStatus(Notify, MsgChA);}
00159     return ArgValV;
00160   }
00161 }
00162 
00163 bool TEnv::GetIfArgPrefixBool(
00164  const TStr& PrefixStr, const bool& DfVal, const TStr& DNm) const {
00165   if (Env.GetArgs()<=MnArgs){
00166     // 'usage' argument message
00167     if (!SilentP){
00168       printf("   %s%s (default:'%s')\n",
00169        PrefixStr.CStr(), DNm.CStr(), TBool::GetStr(DfVal).CStr());}
00170     return DfVal;
00171   } else {
00172     // argument & value message
00173     bool Val;
00174     if ((PrefixStr.Len()>0)&&(PrefixStr.LastCh()==':')){
00175       if (Env.IsArgPrefix(PrefixStr)){
00176         // try to find one of boolean string value representations
00177         TStr ValStr=Env.GetArgPostfix(PrefixStr);
00178         Val=TBool::GetValFromStr(ValStr, DfVal);
00179       } else {
00180         // remove ':' and try to find option
00181         TStr RedPrefixStr=PrefixStr;
00182         RedPrefixStr.DelSubStr(PrefixStr.Len()-1, PrefixStr.Len()-1);
00183         if (Env.IsArgPrefix(RedPrefixStr)){Val=true;} else {Val=DfVal;}
00184       }
00185     } else {
00186       if (Env.IsArgPrefix(PrefixStr)){Val=true;} else {Val=DfVal;}
00187     }
00188     TStr MsgStr=DNm+" ("+PrefixStr+")="+TBool::GetYesNoStr(Val);
00189     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00190     return Val;
00191   }
00192 }
00193 
00194 int TEnv::GetIfArgPrefixInt(
00195  const TStr& PrefixStr, const int& DfVal, const TStr& DNm) const {
00196   if (Env.GetArgs()<=MnArgs){
00197     // 'usage' argument message
00198     if (!SilentP){
00199       printf("   %s%s (default:%d)\n", PrefixStr.CStr(), DNm.CStr(), DfVal);}
00200     return DfVal;
00201   } else {
00202     // argument & value message
00203     int Val;
00204     if (Env.IsArgPrefix(PrefixStr)){
00205       TStr ValStr=Env.GetArgPostfix(PrefixStr);
00206       Val=ValStr.GetInt(DfVal);
00207     } else {
00208       Val=DfVal;
00209     }
00210     TStr MsgStr=DNm+" ("+PrefixStr+")="+TInt::GetStr(Val);
00211     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00212     return Val;
00213   }
00214 }
00215 
00216 TIntV TEnv::GetIfArgPrefixIntV(
00217  const TStr& PrefixStr, TIntV& DfValV, const TStr& DNm) const {
00218   // convert default-integer-values to default-string-values
00219   TStrV DfValStrV;
00220   for (int ValN=0; ValN<DfValV.Len(); ValN++){
00221     DfValStrV.Add(TInt::GetStr(DfValV[ValN]));}
00222   // get string-values
00223   TStrV ValStrV=GetIfArgPrefixStrV(PrefixStr, DfValStrV, DNm);
00224   // convert string-values to integer-values
00225   TIntV ValV;
00226   for (int ValN=0; ValN<ValStrV.Len(); ValN++){
00227     int Val;
00228     if (ValStrV[ValN].IsInt(Val)){
00229       ValV.Add(Val);}
00230   }
00231   // return value-vector
00232   return ValV;
00233 }
00234 
00235 double TEnv::GetIfArgPrefixFlt(
00236  const TStr& PrefixStr, const double& DfVal, const TStr& DNm) const {
00237   if (Env.GetArgs()<=MnArgs){
00238     // 'usage' argument message
00239     if (!SilentP){
00240       printf("   %s%s (default:%g)\n", PrefixStr.CStr(), DNm.CStr(), DfVal);}
00241     return DfVal;
00242   } else {
00243     // argument & value message
00244     double Val;
00245     if (Env.IsArgPrefix(PrefixStr)){
00246       TStr ValStr=Env.GetArgPostfix(PrefixStr);
00247       Val=ValStr.GetFlt(DfVal);
00248     } else {
00249       Val=DfVal;
00250     }
00251     TStr MsgStr=DNm+" ("+PrefixStr+")="+TFlt::GetStr(Val);
00252     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00253     return Val;
00254   }
00255 }
00256 
00257 void TEnv::GetVarNmV(TStrV& VarNmV){
00258   VarNmV.Clr(); int VarN=0;
00259   while (_environ[VarN]!=NULL){
00260     TStr VarNmVal=_environ[VarN++];
00261     TStr VarNm; TStr VarVal; VarNmVal.SplitOnCh(VarNm, '=', VarVal);
00262     VarNmV.Add(VarNm);
00263   }
00264 }
00265 
00266 void TEnv::GetVarNmValV(TStrV& VarNmValV){
00267   VarNmValV.Clr(); int VarN=0;
00268   while (_environ[VarN]!=NULL){
00269     VarNmValV.Add(_environ[VarN++]);
00270   }
00271 }
00272 
00273 void TEnv::PutVarVal(const TStr& VarNm, const TStr& VarVal) {
00274   const int RetVal = putenv(TStr::Fmt("%s=%s", VarNm.CStr(), VarVal.CStr()).CStr());
00275   IAssert(RetVal==0);
00276 }
00277 
00278 TStr TEnv::GetVarVal(const TStr& VarNm) const {
00279   return TStr(getenv(VarNm.CStr()));
00280 }
00281 
00282 TEnv Env;
00283