///////////////////////////////////////////////// // Environment TEnv::TEnv(const int& _Args, char** _ArgV, const PNotify& _Notify): ArgV(), HdStr(), MnArgs(1), SilentP(false), Notify(_Notify) { for (int ArgN = 0; ArgN < _Args; ArgN++) ArgV.Add(TStr(_ArgV[ArgN])); } TEnv::TEnv(const TStr& _ArgStr, const PNotify& _Notify): ArgV(), HdStr(), MnArgs(1), SilentP(false), Notify(_Notify) { _ArgStr.SplitOnAllCh(' ', ArgV); } TStr TEnv::GetExeFNm() const { TStr ExeFNm=GetArg(0); if (ExeFNm.IsPrefix("//?")){ // observed on Win64 CGI ExeFNm=ExeFNm.GetSubStr(3, ExeFNm.Len()); } return ExeFNm; } TStr TEnv::GetCmLn(const int& FromArgN) const { TChA CmLnChA; for (int ArgN=FromArgN; ArgNFromArgN){CmLnChA+=' ';} CmLnChA+=GetArg(ArgN); } return CmLnChA; } int TEnv::GetPrefixArgN(const TStr& PrefixStr) const { int ArgN=0; while (ArgN1){ if ((Val[0]=='\"')&&(Val.LastCh()=='\"')){ Val=Val.GetSubStr(1, Val.Len()-2); } } } else { Val=DfVal; } TStr MsgStr=DNm+" ("+PrefixStr+")="+Val; if (!SilentP){TNotify::OnStatus(Notify, MsgStr);} return Val; } } TStrV TEnv::GetIfArgPrefixStrV( const TStr& PrefixStr, TStrV& DfValV, const TStr& DNm) const { TStrV ArgValV; if (Env.GetArgs()<=MnArgs){ // 'usage' argument message if (!SilentP){ printf(" %s%s (default:", PrefixStr.CStr(), DNm.CStr()); for (int DfValN=0; DfValN0){printf(", ");} printf("'%s'", DfValV[DfValN].CStr()); } printf(")\n"); } return ArgValV; } else { // argument & value message TStr ArgValVChA; for (int ArgN=0; ArgN1){ArgValVChA+=", ";} ArgValVChA+=ArgValV.Last(); } } if (ArgValV.Empty()){ArgValV=DfValV;} // output argument values TChA MsgChA; MsgChA+=DNm; MsgChA+=" ("; MsgChA+=PrefixStr; MsgChA+=")="; for (int ArgValN=0; ArgValN0){MsgChA+=", ";} MsgChA+="'"; MsgChA+=ArgValV[ArgValN]; MsgChA+="'"; } if (!SilentP){TNotify::OnStatus(Notify, MsgChA);} return ArgValV; } } bool TEnv::GetIfArgPrefixBool( const TStr& PrefixStr, const bool& DfVal, const TStr& DNm) const { if (Env.GetArgs()<=MnArgs){ // 'usage' argument message if (!SilentP){ printf(" %s%s (default:'%s')\n", PrefixStr.CStr(), DNm.CStr(), TBool::GetStr(DfVal).CStr());} return DfVal; } else { // argument & value message bool Val; if ((PrefixStr.Len()>0)&&(PrefixStr.LastCh()==':')){ if (Env.IsArgPrefix(PrefixStr)){ // try to find one of boolean string value representations TStr ValStr=Env.GetArgPostfix(PrefixStr); Val=TBool::GetValFromStr(ValStr, DfVal); } else { // remove ':' and try to find option TStr RedPrefixStr=PrefixStr; RedPrefixStr.DelSubStr(PrefixStr.Len()-1, PrefixStr.Len()-1); if (Env.IsArgPrefix(RedPrefixStr)){Val=true;} else {Val=DfVal;} } } else { if (Env.IsArgPrefix(PrefixStr)){Val=true;} else {Val=DfVal;} } TStr MsgStr=DNm+" ("+PrefixStr+")="+TBool::GetYesNoStr(Val); if (!SilentP){TNotify::OnStatus(Notify, MsgStr);} return Val; } } int TEnv::GetIfArgPrefixInt( const TStr& PrefixStr, const int& DfVal, const TStr& DNm) const { if (Env.GetArgs()<=MnArgs){ // 'usage' argument message if (!SilentP){ printf(" %s%s (default:%d)\n", PrefixStr.CStr(), DNm.CStr(), DfVal);} return DfVal; } else { // argument & value message int Val; if (Env.IsArgPrefix(PrefixStr)){ TStr ValStr=Env.GetArgPostfix(PrefixStr); Val=ValStr.GetInt(DfVal); } else { Val=DfVal; } TStr MsgStr=DNm+" ("+PrefixStr+")="+TInt::GetStr(Val); if (!SilentP){TNotify::OnStatus(Notify, MsgStr);} return Val; } } TIntV TEnv::GetIfArgPrefixIntV( const TStr& PrefixStr, TIntV& DfValV, const TStr& DNm) const { // convert default-integer-values to default-string-values TStrV DfValStrV; for (int ValN=0; ValN