status_t BinaryOpNode::GetString(BString &predicate) { status_t error = (fChild1 && fChild2 ? B_OK : B_BAD_VALUE); BString childString1; BString childString2; if (error == B_OK) error = fChild1->GetString(childString1); if (error == B_OK) error = fChild2->GetString(childString2); predicate.SetTo(""); if (error == B_OK) { switch (fOp) { case B_EQ: predicate << "(" << childString1 << "==" << childString2 << ")"; break; case B_GT: predicate << "(" << childString1 << ">" << childString2 << ")"; break; case B_GE: predicate << "(" << childString1 << ">=" << childString2 << ")"; break; case B_LT: predicate << "(" << childString1 << "<" << childString2 << ")"; break; case B_LE: predicate << "(" << childString1 << "<=" << childString2 << ")"; break; case B_NE: predicate << "(" << childString1 << "!=" << childString2 << ")"; break; case B_CONTAINS: if (StringNode *strNode = dynamic_cast<StringNode*>(fChild2)) { BString value; value << "*" << strNode->Value() << "*"; error = StringNode(value.String()).GetString(childString2); } if (error == B_OK) { predicate << "(" << childString1 << "==" << childString2 << ")"; } break; case B_BEGINS_WITH: if (StringNode *strNode = dynamic_cast<StringNode*>(fChild2)) { BString value; value << strNode->Value() << "*"; error = StringNode(value.String()).GetString(childString2); } if (error == B_OK) { predicate << "(" << childString1 << "==" << childString2 << ")"; } break; case B_ENDS_WITH: if (StringNode *strNode = dynamic_cast<StringNode*>(fChild2)) { BString value; value << "*" << strNode->Value(); error = StringNode(value.String()).GetString(childString2); } if (error == B_OK) { predicate << "(" << childString1 << "==" << childString2 << ")"; } break; case B_AND: predicate << "(" << childString1 << "&&" << childString2 << ")"; break; case B_OR: predicate << "(" << childString1 << "||" << childString2 << ")"; break; default: error = B_BAD_VALUE; break; } } return error; }
void ParseString(const FString& StringToParse) { Index = 0; DataString = StringToParse; Strings.Add(StringNode()); if (Index >= DataString.Len()) return; uint8 Token = ReadToken(); while (Token != EndOfString) { switch (Token) { case RegularChar: Strings[Strings.Num()-1].String.AppendChar( DataString[Index++] ); break; case NewLine: Strings.Add(StringNode()); Strings[Strings.Num()-1].bNewLine = true; Strings[Strings.Num()-1].Color = Strings[Strings.Num()-2].Color; break; case EndOfString: break; case Tab: { const FString TabString(TEXT(" ")); Strings[Strings.Num()-1].String.Append(TabString); static bool sbTest = false; if (sbTest) { Index++; } break; } case OpenTag: { FString OutData; switch (ParseTag(OutData)) { case DefinedColor: { int32 i = Strings.Add(StringNode()); Strings[i].Color = GColorList.GetFColorByName(*OutData.ToLower()); } break; case OtherColor: { FColor NewColor; if (NewColor.InitFromString( OutData )) { int32 i = Strings.Add(StringNode()); Strings[i].Color = NewColor; break; } } default: Strings[Strings.Num()-1].String += OutData; break; } } break; } Token = ReadToken(); } }