private void OpOr(QuestTCPVariant lf, QuestTCPVariant rf, ref QuestTCPVariant result) { result.Clear(); if ((lf.vtype == QuestTCPVType.vtExt) && (rf.vtype == QuestTCPVType.vtExt)) { result.vf = (lf.vf != 0) || (rf.vf != 0) ? 1 : 0; } else if ((lf.vtype == QuestTCPVType.vtRange) && (rf.vtype == QuestTCPVType.vtRange)) { result.CopyDataFrom(lf); result.vd.Add(rf.vd); } else if ((lf.vtype == QuestTCPVType.vtExt) && (rf.vtype == QuestTCPVType.vtRange)) { result.CopyDataFrom(rf); result.vd.Add(lf.vf); } else if ((lf.vtype == QuestTCPVType.vtRange) && (rf.vtype == QuestTCPVType.vtExt)) { result.CopyDataFrom(lf); result.vd.Add(rf.vf); } }
private QuestTCPVariant Calc(string str) { QuestTCPVariant result = new QuestTCPVariant(); if (!calc_error) { if (!result.Assign(str)) { int lenexpr = str.Length; if ((str[0] == '(') && (str[lenexpr - 1] == ')') && CheckParentheses(str, 1, lenexpr - 2)) { string tmp = str.Substring(1, lenexpr - 2); QuestTCPVariant var = Calc(tmp); result.CopyDataFrom(var); } else { int c = FindOperation(str, lenexpr - 1); if (c == -1) { calc_error = true; return(result); } string left = str.Substring(0, c); string right = str.Substring(c + 1, lenexpr - c - 1); QuestTCPVariant rf = Calc(right); if (calc_error) { return(result); } QuestTCPVariant lf = Calc(left); if (calc_error) { return(result); } try { char ch = str[c]; if (ch == '+') { OpAdd(lf, rf, ref result); } if (ch == '-') { OpSub(lf, rf, ref result); } if (ch == '*') { OpMul(lf, rf, ref result); } if (ch == '/') { OpDiv(lf, rf, ref result); } if (ch == 'f') { OpDivTrunc(lf, rf, ref result); } if (ch == 'g') { OpMod(lf, rf, ref result); } if (ch == '$') { OpTo(lf, rf, ref result); } if (ch == '#') { OpIn(lf, rf, ref result); } if (ch == '>') { OpHi(lf, rf, ref result); } if (ch == '<') { OpLo(lf, rf, ref result); } if (ch == 'c') { OpHiEq(lf, rf, ref result); } if (ch == 'b') { OpLoEq(lf, rf, ref result); } if (ch == 'e') { OpNotEq(lf, rf, ref result); } if (ch == '=') { OpEq(lf, rf, ref result); } if (ch == '&') { OpAnd(lf, rf, ref result); } if (ch == '|') { OpOr(lf, rf, ref result); } } catch (Exception e) { calc_error = true; throw e; } } } } return(result); }