SNAP Library , Developer Reference
2013-01-07 14:03:36
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 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