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
|
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