bool CParseTreeTerminalNodeIdentifier::IsBinaryIdentifier() { const int kNumberOfElementaryBinaryIdentifiers = 21; static const char* kElementaryBinaryIdentifiers[kNumberOfElementaryBinaryIdentifiers] = { "pcbits", "playersactivebits", "playersdealtbits", "playersplayingbits", "playersblindbits", "opponentsseatedbits", "opponentsactivebits", "opponentsdealtbits", "opponentsplayingbits", "opponentsblindbits", "flabitgs", "rankbits", "rankbitscommon", "rankbitsplayer", "rankbitspoker", "srankbits", "srankbitscommon", "srankbitsplayer", "srankbitspoker", "myturnbits", "pcbits"}; const int kNumberOfParameterizedBinaryIdentifiers = 4; static const char* kParameterizedBinaryIdentifiers[kNumberOfParameterizedBinaryIdentifiers] = { "chairbit$", "raisbits", "callbits", "foldbits"}; if (_node_type != kTokenIdentifier) return false; assert(_terminal_name != ""); // Check elementary binary identifiers first for (int i=0; i<kNumberOfElementaryBinaryIdentifiers; ++i) { if (_terminal_name == kElementaryBinaryIdentifiers[i]) return true; } // Then check parameterized binary symbols for (int i=0; i<kNumberOfParameterizedBinaryIdentifiers; ++i) { if (StringAIsPrefixOfStringB(kParameterizedBinaryIdentifiers[i], _terminal_name)) { return true; } } // Not a binary identifier return false; }
bool StringIsExactMatch(const char *string_a, const char *string_b) { return ((strlen(string_a) == strlen(string_b)) && StringAIsPrefixOfStringB(string_a, string_b)); }
const double CPokerTrackerThread::ProcessQuery (const char * s) { int sym_raischair = p_symbol_engine_raisers_callers->raischair(); if (!_connected || PQstatus(_pgconn) != CONNECTION_OK) { OH_MessageBox("Not connected to PokerTracker database.\n" "Can't use PokerTracker symbols.", "Error", 0); return -1.0; } // ATTENTION! // // Be very careful, if a string is a prefix of multiple symbols, // e.g. "pt_vpip" is a prefix of both "pt_vpipX" and "pt_vpipsbX". // Take care to handle those cases correctly! // PokerTracker ring game symbols for the raise-chair if (StringAIsPrefixOfStringB("pt_r", s) && !StringAIsPrefixOfStringB("pt_riverpct", s)) { if (StringIsExactMatch("pt_ricon", s)) return GetStat(sym_raischair, pt_icon); else if (StringIsExactMatch("pt_rpfr", s)) return GetStat(sym_raischair, pt_pfr); else if (StringIsExactMatch("pt_raggtotnopf", s)) return GetStat(sym_raischair, pt_aggtotnopf); else if (StringIsExactMatch("pt_raggtot", s)) return GetStat(sym_raischair, pt_aggtot); else if (StringIsExactMatch("pt_raggp", s)) return GetStat(sym_raischair, pt_aggp); else if (StringIsExactMatch("pt_raggf", s)) return GetStat(sym_raischair, pt_aggf); else if (StringIsExactMatch("pt_raggt", s)) return GetStat(sym_raischair, pt_aggt); else if (StringIsExactMatch("pt_raggr", s)) return GetStat(sym_raischair, pt_aggr); else if (StringIsExactMatch("pt_rfloppct", s)) return GetStat(sym_raischair, pt_floppct); else if (StringIsExactMatch("pt_rturnpct", s)) return GetStat(sym_raischair, pt_turnpct); else if (StringIsExactMatch("pt_rriverpct", s)) return GetStat(sym_raischair, pt_riverpct); else if (StringIsExactMatch("pt_rvpip", s)) return GetStat(sym_raischair, pt_vpip); else if (StringIsExactMatch("pt_rhands", s)) return GetStat(sym_raischair, pt_hands); else if (StringIsExactMatch("pt_rpf_rfi", s)) return GetStat(sym_raischair, pt_pf_rfi); else if (StringIsExactMatch("pt_rpf_cr", s)) return GetStat(sym_raischair, pt_pf_cr); else if (StringIsExactMatch("pt_rpfats", s)) return GetStat(sym_raischair, pt_pfats); else if (StringIsExactMatch("pt_rwsdp", s)) return GetStat(sym_raischair, pt_wsdp); else if (StringIsExactMatch("pt_rwssd", s)) return GetStat(sym_raischair, pt_wssd); else if (StringIsExactMatch("pt_rfbbts", s)) return GetStat(sym_raischair, pt_fbbts); else if (StringIsExactMatch("pt_rfsbts", s)) return GetStat(sym_raischair, pt_fsbts); else if (StringIsExactMatch("pt_rcbetflop", s)) return GetStat(sym_raischair, pt_cbetflop); else if (StringIsExactMatch("pt_rf3bettot", s)) return GetStat(sym_raischair, pt_f3bettot); else if (StringIsExactMatch("pt_rf3betpflop", s)) return GetStat(sym_raischair, pt_f3betpflop); else if (StringIsExactMatch("pt_rf3betflop", s)) return GetStat(sym_raischair, pt_f3betflop); else if (StringIsExactMatch("pt_rf3betturn", s)) return GetStat(sym_raischair, pt_f3betturn); else if (StringIsExactMatch("pt_rf3betriver", s)) return GetStat(sym_raischair, pt_f3betriver); else if (StringIsExactMatch("pt_rfcbetflop", s)) return GetStat(sym_raischair, pt_fcbetflop); else if (StringIsExactMatch("pt_rfcbetturn", s)) return GetStat(sym_raischair, pt_fcbetturn); else if (StringIsExactMatch("pt_rfcbetriver",s)) return GetStat(sym_raischair, pt_fcbetriver); else { // Invalid ring game symbol WarnAboutInvalidPTSymbol(s); return -1.0; } } // PokerTracker ring game symbols for chair X else if (StringAIsPrefixOfStringB("pt_", s)) { if (StringAIsPrefixOfStringB("pt_iconlastr", s)) return GetStat(p_game_state->LastRaised(s[12]-'0'), pt_icon); else if (StringAIsPrefixOfStringB("pt_icon", s)) return GetStat(s[7]-'0', pt_icon); else if (StringAIsPrefixOfStringB("pt_pfr",s )) return GetStat(s[6]-'0', pt_pfr); else if (StringAIsPrefixOfStringB("pt_aggtotnopf", s)) return GetStat(s[13]-'0', pt_aggtotnopf); else if (StringAIsPrefixOfStringB("pt_aggtot", s)) return GetStat(s[9]-'0', pt_aggtot); else if (StringAIsPrefixOfStringB("pt_aggp", s)) return GetStat(s[7]-'0', pt_aggp); else if (StringAIsPrefixOfStringB("pt_aggf", s)) return GetStat(s[7]-'0', pt_aggf); else if (StringAIsPrefixOfStringB("pt_aggt", s)) return GetStat(s[7]-'0', pt_aggt); else if (StringAIsPrefixOfStringB("pt_aggr", s)) return GetStat(s[7]-'0', pt_aggr); else if (StringAIsPrefixOfStringB("pt_floppct", s)) return GetStat(s[10]-'0', pt_floppct); else if (StringAIsPrefixOfStringB("pt_turnpct", s)) return GetStat(s[10]-'0', pt_turnpct); else if (StringAIsPrefixOfStringB("pt_riverpct", s)) return GetStat(s[11]-'0', pt_riverpct); else if (StringAIsPrefixOfStringB("pt_vpip", s)) return GetStat(s[7]-'0', pt_vpip); else if (StringAIsPrefixOfStringB("pt_hands", s)) return GetStat(s[8]-'0', pt_hands); else if (StringAIsPrefixOfStringB("pt_pf_rfi", s)) return GetStat(s[9]-'0', pt_pf_rfi); else if (StringAIsPrefixOfStringB("pt_pf_cr", s)) return GetStat(s[8]-'0', pt_pf_cr); else if (StringAIsPrefixOfStringB("pt_pfats", s)) return GetStat(s[8]-'0', pt_pfats); else if (StringAIsPrefixOfStringB("pt_wsdp", s)) return GetStat(s[7]-'0', pt_wsdp); else if (StringAIsPrefixOfStringB("pt_wssd",s)) return GetStat(s[7]-'0', pt_wssd); else if (StringAIsPrefixOfStringB("pt_fbbts", s)) return GetStat(s[8]-'0', pt_fbbts); else if (StringAIsPrefixOfStringB("pt_fsbts", s)) return GetStat(s[8]-'0', pt_fsbts); else if (StringAIsPrefixOfStringB("pt_cbetflop", s)) return GetStat(s[11]-'0', pt_cbetflop); else if (StringAIsPrefixOfStringB("pt_f3bettot", s)) return GetStat(s[11]-'0', pt_f3bettot); else if (StringAIsPrefixOfStringB("pt_f3betpflop", s)) return GetStat(s[15]-'0', pt_f3betpflop); else if (StringAIsPrefixOfStringB("pt_f3betflop", s)) return GetStat(s[12]-'0', pt_f3betflop); else if (StringAIsPrefixOfStringB("pt_f3betturn", s)) return GetStat(s[12]-'0', pt_f3betturn); else if (StringAIsPrefixOfStringB("pt_f3betriver", s)) return GetStat(s[13]-'0', pt_f3betriver); else if (StringAIsPrefixOfStringB("pt_fcbetflop", s)) return GetStat(s[12]-'0', pt_fcbetflop); else if (StringAIsPrefixOfStringB("pt_fcbetturn", s)) return GetStat(s[12]-'0', pt_fcbetturn); else if (StringAIsPrefixOfStringB("pt_fcbetriver", s)) return GetStat(s[12]-'0', pt_fcbetriver); else { // Invalid ring game symbol WarnAboutInvalidPTSymbol(s); return -1.0; } } // Poker Tracker tournament symbols for raise-chair else if (StringAIsPrefixOfStringB("ptt_r", s) && !StringAIsPrefixOfStringB("ptt_riverpct", s)) { if (StringIsExactMatch("ptt_ricon", s)) return GetStat(sym_raischair, ptt_icon); else if (StringIsExactMatch("ptt_rpfr", s)) return GetStat(sym_raischair, ptt_pfr); else if (StringIsExactMatch("ptt_raggtotnopf", s)) return GetStat(sym_raischair, ptt_aggtotnopf); else if (StringIsExactMatch("ptt_raggtot", s)) return GetStat(sym_raischair, ptt_aggtot); else if (StringIsExactMatch("ptt_raggp", s)) return GetStat(sym_raischair, ptt_aggp); else if (StringIsExactMatch("ptt_raggf", s)) return GetStat(sym_raischair, ptt_aggf); else if (StringIsExactMatch("ptt_raggt", s)) return GetStat(sym_raischair, ptt_aggt); else if (StringIsExactMatch("ptt_raggr", s)) return GetStat(sym_raischair, ptt_aggr); else if (StringIsExactMatch("ptt_rfloppct", s)) return GetStat(sym_raischair, ptt_floppct); else if (StringIsExactMatch("ptt_rturnpct", s)) return GetStat(sym_raischair, ptt_turnpct); else if (StringIsExactMatch("ptt_rriverpct", s)) return GetStat(sym_raischair, ptt_riverpct); else if (StringIsExactMatch("ptt_rvpip", s)) return GetStat(sym_raischair, ptt_vpip); else if (StringIsExactMatch("ptt_rhands", s)) return GetStat(sym_raischair, ptt_hands); else if (StringIsExactMatch("ptt_rpf_rfi", s)) return GetStat(sym_raischair, ptt_pf_rfi); else if (StringIsExactMatch("ptt_rpf_cr", s)) return GetStat(sym_raischair, ptt_pf_cr); else if (StringIsExactMatch("ptt_rpfats", s)) return GetStat(sym_raischair, ptt_pfats); else if (StringIsExactMatch("ptt_rwsdp", s)) return GetStat(sym_raischair, ptt_wsdp); else if (StringIsExactMatch("ptt_rwssd", s)) return GetStat(sym_raischair, ptt_wssd); else if (StringIsExactMatch("ptt_rfbbts", s)) return GetStat(sym_raischair, ptt_fbbts); else if (StringIsExactMatch("ptt_rfsbts", s)) return GetStat(sym_raischair, ptt_fsbts); else { // Invalid tournament symbol WarnAboutInvalidPTSymbol(s); return -1.0; } } // Poker Tracker tournament symbols for chair x else if (StringIsExactMatch("ptt_", s)) { if (StringAIsPrefixOfStringB("ptt_iconlastr", s)) return GetStat(p_game_state->LastRaised(s[13]-'0'), ptt_icon); else if (StringAIsPrefixOfStringB("ptt_icon", s)) return GetStat(s[8]-'0', ptt_icon); else if (StringAIsPrefixOfStringB("ptt_pfr", s)) return GetStat(s[7]-'0', ptt_pfr); else if (StringAIsPrefixOfStringB("ptt_aggtotnopf", s)) return GetStat(s[14]-'0', ptt_aggtotnopf); else if (StringAIsPrefixOfStringB("ptt_aggtot", s)) return GetStat(s[10]-'0', ptt_aggtot); else if (StringAIsPrefixOfStringB("ptt_aggp", s)) return GetStat(s[8]-'0', ptt_aggp); else if (StringAIsPrefixOfStringB("ptt_aggf", s)) return GetStat(s[8]-'0', ptt_aggf); else if (StringAIsPrefixOfStringB("ptt_aggt", s)) return GetStat(s[8]-'0', ptt_aggt); else if (StringAIsPrefixOfStringB("ptt_aggr", s)) return GetStat(s[8]-'0', ptt_aggr); else if (StringAIsPrefixOfStringB("ptt_floppct", s)) return GetStat(s[11]-'0', ptt_floppct); else if (StringAIsPrefixOfStringB("ptt_turnpct", s)) return GetStat(s[11]-'0', ptt_turnpct); else if (StringAIsPrefixOfStringB("ptt_riverpct", s)) return GetStat(s[12]-'0', ptt_riverpct); else if (StringAIsPrefixOfStringB("ptt_vpip", s)) return GetStat(s[8]-'0', ptt_vpip); else if (StringAIsPrefixOfStringB("ptt_hands", s)) return GetStat(s[9]-'0', ptt_hands); else if (StringAIsPrefixOfStringB("ptt_pf_rfi", s)) return GetStat(s[10]-'0', ptt_pf_rfi); else if (StringAIsPrefixOfStringB("ptt_pf_cr", s)) return GetStat(s[9]-'0', ptt_pf_cr); else if (StringAIsPrefixOfStringB("ptt_pfats", s)) return GetStat(s[9]-'0', ptt_pfats); else if (StringAIsPrefixOfStringB("ptt_wsdp", s)) return GetStat(s[8]-'0', ptt_wsdp); else if (StringAIsPrefixOfStringB("ptt_wssd", s)) return GetStat(s[8]-'0', ptt_wssd); else if (StringAIsPrefixOfStringB("ptt_fbbts", s)) return GetStat(s[9]-'0', ptt_fbbts); else if (StringAIsPrefixOfStringB("ptt_fsbts", s)) return GetStat(s[9]-'0', ptt_fsbts); else { // Invalid tournament symbol WarnAboutInvalidPTSymbol(s); return -1.0; } } else { // Completely invalid symbol WarnAboutInvalidPTSymbol(s); return -1.0; } }
bool CSymbolEnginePokerTracker::EvaluateSymbol(const char *name, double *result, bool log /* = false */) { FAST_EXIT_ON_OPENPPL_SYMBOLS(name); if (memcmp(name,"pt_",3)!=0) { // Symbol of a different symbol-engine return false; } CString s = name; CheckForChangedPlayersOncePerHeartbeatAndSymbolLookup(); if (IsOldStylePTSymbol(s)) { CString error_message; error_message.Format( "Old style PokerTracker symbol detected: %s.\n" "\n" "PokerTracker symbol start with \"pt_\".\n" "Possible postfixes:\n" " * chair number (0..9)\n" " * _raischair\n" " * _headsup\n" " * _smallblind\n" " * _bigblind\n" " * _dealer\n" " * _cutoff\n" " * _user\n" " * _firstraiser\n" " * _firstcaller\n" " * _lastcaller\n", s); OH_MessageBox_Formula_Error( error_message, "ERROR: Invalid PokerTracker Symbol"); *result = kUndefined; return true; } if (!PT_DLL_IsValidSymbol(CString(s))) { // Invalid PokerTracker symbol WarnAboutInvalidPTSymbol(s); *result = kUndefined; return true; } int chair = 0; if (!p_pokertracker_thread->IsConnected()) { if (!p_symbol_engine_userchair->userchair_confirmed() || p_formula_parser->IsParsing()) { // We are not yet seated or formula is getting parsed. // Symbol-lookup happens, because of Formula-validation. // Not a problem, if we do not yet have a DB-connection. // Don't throw a warning here. write_log(preferences.debug_pokertracker(), "[PokerTracker] Not yet seated or formula parsing.\n"); } else { // We are seated and playing. // Serious problem, if we do not have a DB-connection. OH_MessageBox_Error_Warning("Not connected to PokerTracker database.\n" "Can't use PokerTracker symbols."); } *result = kUndefined; return true; } CString standard_symbol_name; assert(StringAIsPrefixOfStringB("pt_", s)); // PokerTracker symbols for the raise-chair if (s.Right(10) == "_raischair") { chair = p_symbol_engine_raisers->raischair(); } // PokerTracker symbols for the opponent headsup chair else if (s.Right(8) == "_headsup") { chair = p_symbol_engine_chairs->opponent_headsup_chair(); } // PokerTracker symbols for the smallblind chair else if (s.Right(11) == "_smallblind") { chair = p_symbol_engine_chairs->smallblind_chair(); } // PokerTracker symbols for the bigblind chair else if (s.Right(9) == "_bigblind") { chair = p_symbol_engine_chairs->bigblind_chair(); } // PokerTracker symbols for the cutoff chair else if (s.Right(7) == "_cutoff") { chair = p_symbol_engine_chairs->cutoff_chair(); } // PokerTracker symbols for the firstcaller chair else if (s.Right(12) == "_firstcaller") { chair = p_symbol_engine_callers->firstcaller_chair(); } // PokerTracker symbols for the lastcaller chair else if (s.Right(11) == "_lastcaller") { chair = p_symbol_engine_callers->lastcaller_chair(); } // PokerTracker symbols for the firstraiser chair else if (s.Right(12) == "_firstraiser") { chair = p_symbol_engine_raisers->firstraiser_chair(); } // PokerTracker symbols for the dealerchair chair else if (s.Right(7) == "_dealer") { chair = p_symbol_engine_dealerchair->dealerchair(); } // PokerTracker symbols for the chair else if (s.Right(5) == "_user") { chair = p_symbol_engine_userchair->userchair(); } // PokerTracker symbols for chair X else { CString symbol = s; CString last_character = symbol.Right(1); if (!isdigit(last_character[0])) { CString error_message; error_message.Format("Invalid PokerTracker Symbol: &s", symbol); OH_MessageBox_Formula_Error(error_message, "ERROR"); *result = kUndefined; return false; } chair = atoi(last_character); } // Catch undefined chair (e.g. pt_r_-symbol without raisee) if (chair < 0) { *result = kUndefined; return true; } AssertRange(chair, kFirstChair, kLastChair); *result = PT_DLL_GetStat(s, chair); return true; }