95 CTmlCalculator(
void) : m_boIsTestMode(false), m_piExpander(NULL), m_dwTickCountBase(::GetTickCount())
105 m_boIsTestMode = boIsTestMode;
115 return m_boIsTestMode;
124 m_piExpander = piExpander;
134 return m_aabWildResult;
172 return m_TextToValue(_answer, _gram);
179 DWORD m_dwTickCountBase;
195 if ( s0 ==
'+' && s1 ==
'+' )
200 else if ( s0 ==
'-' && s1 ==
'-' )
205 else if ( s0 ==
'+' || s0 ==
'-' || s0 ==
'*' || s0 ==
'/' || s0 ==
'<' || s0 ==
'>' || s0 ==
'=' )
209 _iAriType = s0 * 0x100 + s1;
218 else if ( s0 ==
'!' && s1 ==
'=' )
220 _iAriType = s0 * 0x100 + s1;
223 else if ( s0 ==
'a' && s1 ==
'n' && *(P + 2) ==
'd' )
228 else if ( s0 ==
'o' && s1 ==
'r' )
250 int m_GetArithmeticTypeLevel(
int iAriType)
304 if ( s ==
"+" || s ==
"-" )
307 res = m_TextToValue(ii, _gram);
320 res = m_TextToValue(ii, _gram);
335 res = m_TokenToOneValue(val, _gram);
343 m_CheckArithmeticType(a, gramBack);
344 if ( a ==
'++' || a ==
'--' )
347 res = m_CalcValueAndValue(a, val, dummy);
372 res = m_SearchDataInToken(_n, _gram);
378 res = m_SearchIntegerInToken(_n, _gram);
384 res = m_SearchVariableInToken(_n, _gram);
393 return r.SetLine(_gram);
442 bool isFloat =
false;
444 double floatValue = 0.0;
454 if ( P[0]==
'0' && (P[1] ==
'x' || P[1] ==
'X') )
460 if ( (c < '0' || c >
'9') && (c < 'a' || c >
'f') )
464 if ( c >=
'a' && c <=
'f' )
466 value = value * 16 + (c -
'a') + 10;
470 value = value * 16 + c -
'0';
476 else if ( P[0]==
'\'' )
491 value = (value * 0x100) + *P;
500 if ( *P < '0' || *P >
'9' )
504 value = (value * 10) + *P -
'0';
516 if ( *P >=
'0' && *P <=
'9' )
522 if ( *P < '0' || *P >
'9' )
526 i = (i * 10) + *P -
'0';
536 floatValue += ii / po;
549 if ( *P ==
'e' || *P ==
'E' )
554 bool isPlus = parts.
GetAt() ==
'+';
557 if ( *P >=
'0' && *P <=
'9' )
562 if ( *P < '0' || *P >
'9' )
566 i = (i * 10) + *P -
'0';
575 floatValue *= pow(10.0, isPlus ? ii : -ii);
594 _n = floatValue * flag;
642 else if ( parts.
GetAt() ==
'(' )
683 if ( m_piExpander != NULL )
691 res = m_SearchSystemVariable(_n, token, aValues);
723 #if defined(_TnbDEBUG_ON) && defined(_DEBUG)
724 #define XXX( STR ){ ::OutputDebugStringA( \
725 CAscii::Fmt("calc ([%s]%s %s %s)\n", \
726 a.GetExName(), a().GetString(), STR, b().GetString() ) ); }
748 if ( strName.
Compare(
"%BEFORE OPE") == 0 )
750 if ( ! b().HasData() )
752 b() = b() + (iAriType ==
'++' ? +1 : -1);
760 if ( ! a().HasData() )
762 a() = a() + (iAriType ==
'++' ? +1 : -1);
790 TTRACE0(
" →0で割ろうとしてます\n");
800 res = m_OnChangeValue(strName, a());
806 tvResult = ( a().GetInteger() | b().GetInteger() );
810 tvResult = ( a().GetInteger() & b().GetInteger() );
814 tvResult = ( a().Compare(m_aabWildResult, b()) == 0 );
818 tvResult = ( a().Compare(m_aabWildResult, b()) != 0 );
822 tvResult = ( a() < b() );
826 tvResult = ( a() <= b() );
830 tvResult = ( a() > b() );
834 tvResult = ( a() >= b() );
838 tvResult = ( a() + b() );
842 tvResult = ( a() - b() );
846 tvResult = ( a() * b() );
852 TTRACE0(
" →0で割ろうとしてます\n");
857 tvResult = ( a() / b() );
871 #define _CHECKPARAM_RETURN( PA, NU ) \
872 TTRACE1A("found System Var [%s]\n", lpszToken); \
873 if ( PA.GetSize() != NU ) { return CTmlResult::CheckParamNum(PA.GetSize(), NU); } \
874 if ( IsTestMode() ) { return Result_Success;}
876 #define IsTOKEN( XX ) ( STRLIB::Compare(lpszToken, XX)==0 )
894 _CHECKPARAM_RETURN( aValues , 1 );
905 else if ( IsTOKEN(
"tickcount") )
908 _CHECKPARAM_RETURN( aValues , 0 );
910 _n =
ToInt(::GetTickCount() - m_dwTickCountBase);
911 _n.
Set(
"%tickcount");
914 else if ( IsTOKEN(
"wildres") )
917 _CHECKPARAM_RETURN( aValues , 1 );
919 int iIndex = aValues[0].GetInteger();
923 v.
SetData(m_aabWildResult[iIndex].GetSize(), m_aabWildResult[iIndex].ReferBuffer());
928 else if ( IsTOKEN(
"pausebox") )
931 _CHECKPARAM_RETURN( aValues , 1 );
933 CStr str = aValues[0].GetString();
934 AfxMessageBox(str, MB_ICONINFORMATION);
938 else if ( IsTOKEN(
"yesnobox") )
941 _CHECKPARAM_RETURN( aValues , 1 );
943 CStr str = aValues[0].GetString();
944 int r = AfxMessageBox(
CStr(aValues[0].GetString()), MB_YESNO | MB_ICONINFORMATION);
948 else if ( IsTOKEN(
"length") )
951 _CHECKPARAM_RETURN( aValues , 1 );
953 _n = aValues[0].GetInteger();
956 else if ( IsTOKEN(
"compare") )
959 _CHECKPARAM_RETURN( aValues , 2 );
961 _n = ( aValues[0] == aValues[1] );
964 else if ( IsTOKEN(
"mid") )
972 v = vb.
Mid(aValues[1].GetInteger());
976 else if ( aValues.
GetSize() == 3 )
981 v = vb.
Mid(aValues[1].GetInteger(), aValues[2].GetInteger());
987 else if ( IsTOKEN(
"todata") )
1004 CAscii strForm = aValues[0].GetString();
1008 strRes.
Format(strForm, aValues[1].GetInteger());
1011 strRes.
Format(strForm, aValues[1].GetInteger(), aValues[2].GetInteger());
1014 strRes.
Format(strForm, aValues[1].GetInteger(), aValues[2].GetInteger(), aValues[3].GetInteger());
1017 strRes.
Format(strForm, aValues[1].GetInteger(), aValues[2].GetInteger(), aValues[3].GetInteger(), aValues[4].GetInteger());
1020 strRes.
Format(strForm, aValues[1].GetInteger(), aValues[2].GetInteger(), aValues[3].GetInteger(), aValues[4].GetInteger(), aValues[5].GetInteger());
1030 else if ( IsTOKEN(
"tovalue") )
1033 _CHECKPARAM_RETURN( aValues , 1 );
1037 else if ( IsTOKEN(
"getat") )
1040 _CHECKPARAM_RETURN( aValues , 2 );
1042 INDEX ind = aValues[1].GetInteger();
1045 _n =
static_cast<int>(vb[ind]);
1054 else if ( IsTOKEN(
"getCurrentTimeString") )
1057 TTRACE1(
"found System Func [%s]\n",lpszToken);
1062 CTime t = CTime::GetCurrentTime();
1064 v = t.Format(
"%y%m%d%H%M%S" );
1068 else if ( aValues.
GetSize()==1 )
1072 CTime t = CTime::GetCurrentTime();
1074 v = t.Format( aValues[0].GetString() );
1087 #undef _CHECKPARAM_RETURN
1099 if ( m_piExpander != NULL )
1110 m_dwTickCountBase = ::GetTickCount() - value.
GetInteger();
1133 if ( s[0] ==
'-' || s[0] ==
'+' )
1140 leftSideValue.
Set(
"%BEFORE OPE");
1145 res = m_FindValue(leftSideValue, _gram);
1155 res = m_CheckArithmeticType(iAriType, _gram);
1158 ASSERT( iAriType == 0 );
1160 if ( *P != 0 && *P !=
')' )
1164 res = m_FindValue(dummy, _gram);
1173 int iLevel = m_GetArithmeticTypeLevel(iAriType);
1175 res = m_FindValue(rightSideValue, _gram);
1185 res = m_CheckArithmeticType(a, _gram);
1191 int l = m_GetArithmeticTypeLevel(a);
1212 res = m_FindValue(temp, _gram);
1217 res = m_CalcValueAndValue(a, rightSideValue, temp);
1223 res = m_CalcValueAndValue(iAriType, leftSideValue, rightSideValue);
1229 _answer = leftSideValue();
1233 friend class CTmlCalculatorTest;
bool IsEqualString(LPCSTR lpsz) const
[比較] 内容比較
TYP GetAt(INDEX index=0) const
[取得] 内容.
EPartsKind GetKind(void) const
[取得] 種類
const TYP * GetString(void) const
[取得] 内容
ITE GetPointer(void)
[取得] 現在のイテレータ
INT_PTR StepPointer(INT_PTR step)
[処理] ステップ.
CParts GetNextParts(bool boIsToken=true)
[取得] 次のパーツ取得
CParts PeekNextParts(bool boIsToken=true)
[確認] 次のパーツ確認
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
bool IsEmpty(void) const
[確認] 空チェック
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
CTmlResult TextToValue(CTmlValue &_answer, CTmlGrammar &_gram)
[処理] 計算.
CVectorT< CByteVector > & ReferElementWildResult(void)
[参照] ワイルドカードリザルト.
bool IsTestMode(void) const
[取得] テストモード状態取得
void SetExpander(ITmlExpander *piExpander=NULL)
[設定] 拡張処理指定
CTmlResult TextToValue(CTmlValue &_answer, LPCSTR lpsz)
[処理] 計算.
CTmlCalculator(void)
コンストラクタ
void SetTestMode(bool boIsTestMode)
[設定] テストモード設定.
bool IsNop(void) const
[確認] NOP 確認.
void SetErrorString(LPCSTR lpszString)
[設定] エラー内容設定
static CTmlResult CheckParamNum(INT_PTR iParamNum, INT_PTR iExpectNum)
[確認] パラメータの数と、期待の数のチェック.
EResult GetResult(void) const
[取得] リザルトコード取得.
bool IsError(void) const
[確認] ERROR 確認.
bool IsSuccess(void) const
[確認] SUCCESS 確認.
CTmlResult & SetLine(LPCSTR lpszFileName, INT_PTR iFileLine)
[設定] エラーソースファイル名、行数設定
CTmlResult SetData(LPCSTR lpszData)
[代入] 文字列を代入.
CTmlResult SetHexToData(LPCSTR lpszData)
[代入] HEX表記文字列を代入.
CTmlValue ToValue(void) const
[取得] CTmlValue 型で取得.
void Set(LPCSTR lpsz)
[代入] 拡張ネーム指定.
LPCSTR GetExName(void) const
[取得] 拡張ネーム取得
CTmlValue & SetString(LPCSTR lpszData)
[代入] データ代入.
CTmlValue & SetData(size_t len, LPCVOID P)
[代入] データ代入.
int GetInteger(void) const
[取得] 数字取得.
@ Operation_CheckFunc
関数チェック中
@ Result_UnknownError
その他のエラー
@ Result_UnfinishedExpression
計算式が途中で終わっている
@ Result_ZeroDivide
0で割ろうとしてます
@ Result_NotCloseParentheses
括弧が閉じていない
@ Result_UnknownKeyword
知らないキーワード
virtual size_t GetSize(void) const
[取得] サイズ取得
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
TNB::CStrT< TCHAR > CStr
文字列クラス
CAscii LocalMapString(LPCSTR lpsz, DWORD dwFlags)
[変換] 文字変換(ASCII/SJIS用)
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
void IgnoreUnusedValue(const T &value)
[宣言] 参照しない値宣言.
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
TinyMacroLang 関数拡張インターフェース
virtual CTmlResult OnChangeValue(LPCSTR lpszName, const CTmlValue &val)=0
[処理] 変更(代入)コールバック
virtual CTmlResult ExpandVariable(CTmlValueCarrier &_val, LPCSTR lpszToken, const CTmlValuesVector &aValues, bool boIsTestMode)=0
[処理] 拡張変数、関数の処理
virtual ~ITmlExpander(void)
デストラクタ