SNAP Library 2.1, Developer Reference  2013-09-25 10:47:25
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 bool TEnv::IsArgStr(const TStr& ArgStr, const TStr& DNm) {
00096   if (Env.GetArgs()<=MnArgs){
00097     // 'usage' argument message
00098     if (!SilentP){
00099       printf("   %s %s \n", ArgStr.CStr(), DNm.CStr());}
00100     return false;
00101   } else {
00102     // argument & value message
00103     bool Val=Env.IsArgStr(ArgStr);
00104     TStr MsgStr=DNm+" ("+ArgStr+(Val?")=YES":")=NO");
00105     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00106     return Val;
00107   }
00108 }
00109 
00110 TStr TEnv::GetIfArgPrefixStr(
00111  const TStr& PrefixStr, const TStr& DfVal, const TStr& DNm) const {
00112   if (Env.GetArgs()<=MnArgs){
00113     // 'usage' argument message
00114     if (!SilentP){
00115       printf("   %s%s (default:'%s')\n", PrefixStr.CStr(), DNm.CStr(), DfVal.CStr());}
00116     return DfVal;
00117   } else {
00118     // argument & value message
00119     TStr Val;
00120     if (Env.IsArgPrefix(PrefixStr)){
00121       Val=Env.GetArgPostfix(PrefixStr);
00122       if (Val.Len()>1){
00123         if ((Val[0]=='\"')&&(Val.LastCh()=='\"')){
00124           Val=Val.GetSubStr(1, Val.Len()-2);
00125         }
00126       }
00127     } else {
00128       Val=DfVal;
00129     }
00130     TStr MsgStr=DNm+" ("+PrefixStr+")="+Val;
00131     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00132     return Val;
00133   }
00134 }
00135 
00136 TStrV TEnv::GetIfArgPrefixStrV(
00137  const TStr& PrefixStr, TStrV& DfValV, const TStr& DNm) const {
00138   TStrV ArgValV;
00139   if (Env.GetArgs()<=MnArgs){
00140     // 'usage' argument message
00141     if (!SilentP){
00142       printf("   %s%s (default:", PrefixStr.CStr(), DNm.CStr());
00143       for (int DfValN=0; DfValN<DfValV.Len(); DfValN++){
00144         if (DfValN>0){printf(", ");}
00145         printf("'%s'", DfValV[DfValN].CStr());
00146       }
00147       printf(")\n");
00148     }
00149     return ArgValV;
00150   } else {
00151     // argument & value message
00152     TStr ArgValVChA;
00153     for (int ArgN=0; ArgN<GetArgs(); ArgN++){
00154       // get argument string
00155       TStr ArgStr=GetArg(ArgN);
00156       if (ArgStr.GetSubStr(0, PrefixStr.Len()-1)==PrefixStr){
00157         // extract & add argument value
00158         TStr ArgVal=ArgStr.GetSubStr(PrefixStr.Len(), ArgStr.Len());
00159         ArgValV.Add(ArgVal);
00160         // add to message string
00161         if (ArgValV.Len()>1){ArgValVChA+=", ";}
00162         ArgValVChA+=ArgValV.Last();
00163       }
00164     }
00165     if (ArgValV.Empty()){ArgValV=DfValV;}
00166     // output argument values
00167     TChA MsgChA;
00168     MsgChA+=DNm; MsgChA+=" ("; MsgChA+=PrefixStr; MsgChA+=")=";
00169     for (int ArgValN=0; ArgValN<ArgValV.Len(); ArgValN++){
00170       if (ArgValN>0){MsgChA+=", ";}
00171       MsgChA+="'"; MsgChA+=ArgValV[ArgValN]; MsgChA+="'";
00172     }
00173     if (!SilentP){TNotify::OnStatus(Notify, MsgChA);}
00174     return ArgValV;
00175   }
00176 }
00177 
00178 bool TEnv::GetIfArgPrefixBool(
00179  const TStr& PrefixStr, const bool& DfVal, const TStr& DNm) const {
00180   if (Env.GetArgs()<=MnArgs){
00181     // 'usage' argument message
00182     if (!SilentP){
00183       printf("   %s%s (default:'%s')\n",
00184        PrefixStr.CStr(), DNm.CStr(), TBool::GetStr(DfVal).CStr());}
00185     return DfVal;
00186   } else {
00187     // argument & value message
00188     bool Val;
00189     if ((PrefixStr.Len()>0)&&(PrefixStr.LastCh()==':')){
00190       if (Env.IsArgPrefix(PrefixStr)){
00191         // try to find one of boolean string value representations
00192         TStr ValStr=Env.GetArgPostfix(PrefixStr);
00193         Val=TBool::GetValFromStr(ValStr, DfVal);
00194       } else {
00195         // remove ':' and try to find option
00196         TStr RedPrefixStr=PrefixStr;
00197         RedPrefixStr.DelSubStr(PrefixStr.Len()-1, PrefixStr.Len()-1);
00198         if (Env.IsArgPrefix(RedPrefixStr)){Val=true;} else {Val=DfVal;}
00199       }
00200     } else {
00201       if (Env.IsArgPrefix(PrefixStr)){Val=true;} else {Val=DfVal;}
00202     }
00203     TStr MsgStr=DNm+" ("+PrefixStr+")="+TBool::GetYesNoStr(Val);
00204     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00205     return Val;
00206   }
00207 }
00208 
00209 int TEnv::GetIfArgPrefixInt(
00210  const TStr& PrefixStr, const int& DfVal, const TStr& DNm) const {
00211   if (Env.GetArgs()<=MnArgs){
00212     // 'usage' argument message
00213     if (!SilentP){
00214       printf("   %s%s (default:%d)\n", PrefixStr.CStr(), DNm.CStr(), DfVal);}
00215     return DfVal;
00216   } else {
00217     // argument & value message
00218     int Val;
00219     if (Env.IsArgPrefix(PrefixStr)){
00220       TStr ValStr=Env.GetArgPostfix(PrefixStr);
00221       Val=ValStr.GetInt(DfVal);
00222     } else {
00223       Val=DfVal;
00224     }
00225     TStr MsgStr=DNm+" ("+PrefixStr+")="+TInt::GetStr(Val);
00226     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00227     return Val;
00228   }
00229 }
00230 
00231 TIntV TEnv::GetIfArgPrefixIntV(
00232  const TStr& PrefixStr, TIntV& DfValV, const TStr& DNm) const {
00233   // convert default-integer-values to default-string-values
00234   TStrV DfValStrV;
00235   for (int ValN=0; ValN<DfValV.Len(); ValN++){
00236     DfValStrV.Add(TInt::GetStr(DfValV[ValN]));}
00237   // get string-values
00238   TStrV ValStrV=GetIfArgPrefixStrV(PrefixStr, DfValStrV, DNm);
00239   // convert string-values to integer-values
00240   TIntV ValV;
00241   for (int ValN=0; ValN<ValStrV.Len(); ValN++){
00242     int Val;
00243     if (ValStrV[ValN].IsInt(Val)){
00244       ValV.Add(Val);}
00245   }
00246   // return value-vector
00247   return ValV;
00248 }
00249 
00250 double TEnv::GetIfArgPrefixFlt(
00251  const TStr& PrefixStr, const double& DfVal, const TStr& DNm) const {
00252   if (Env.GetArgs()<=MnArgs){
00253     // 'usage' argument message
00254     if (!SilentP){
00255       printf("   %s%s (default:%g)\n", PrefixStr.CStr(), DNm.CStr(), DfVal);}
00256     return DfVal;
00257   } else {
00258     // argument & value message
00259     double Val;
00260     if (Env.IsArgPrefix(PrefixStr)){
00261       TStr ValStr=Env.GetArgPostfix(PrefixStr);
00262       Val=ValStr.GetFlt(DfVal);
00263     } else {
00264       Val=DfVal;
00265     }
00266     TStr MsgStr=DNm+" ("+PrefixStr+")="+TFlt::GetStr(Val);
00267     if (!SilentP){TNotify::OnStatus(Notify, MsgStr);}
00268     return Val;
00269   }
00270 }
00271 
00272 void TEnv::GetVarNmV(TStrV& VarNmV){
00273   VarNmV.Clr(); int VarN=0;
00274   while (_environ[VarN]!=NULL){
00275     TStr VarNmVal=_environ[VarN++];
00276     TStr VarNm; TStr VarVal; VarNmVal.SplitOnCh(VarNm, '=', VarVal);
00277     VarNmV.Add(VarNm);
00278   }
00279 }
00280 
00281 void TEnv::GetVarNmValV(TStrV& VarNmValV){
00282   VarNmValV.Clr(); int VarN=0;
00283   while (_environ[VarN]!=NULL){
00284     VarNmValV.Add(_environ[VarN++]);
00285   }
00286 }
00287 
00288 void TEnv::PutVarVal(const TStr& VarNm, const TStr& VarVal) {
00289   const int RetVal = putenv(TStr::Fmt("%s=%s", VarNm.CStr(), VarVal.CStr()).CStr());
00290   IAssert(RetVal==0);
00291 }
00292 
00293 TStr TEnv::GetVarVal(const TStr& VarNm) const {
00294   return TStr(getenv(VarNm.CStr()));
00295 }
00296 
00297 TEnv Env;
00298