SNAP Library , Developer Reference  2013-01-07 14:03:36
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
 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