diff --git a/server/gameserver/app.cc b/server/gameserver/app.cc index f64fea1..418bf17 100644 --- a/server/gameserver/app.cc +++ b/server/gameserver/app.cc @@ -96,16 +96,34 @@ static void SavePerfLog() bool App::Init(int argc, char* argv[]) { - #if 1 + #if 0 { - std::string data = ""; - std::string pattern = R"(\$\{.*\})"; - std::regex re(pattern); + std::string data = "${master.name} [aa ]${image.id:1000} bb${}cc"; + std::string pattern = R"(\$\{.*?\})"; + std::regex re(pattern, std::regex_constants::ECMAScript); std::cmatch m; - bool ret = std::regex_search(data.c_str(), m, re); - if (ret) { - a8::XPrintf("str:%s", {m.str()}); + bool matched = true; + const char* last_pos = data.c_str(); + const char* end_pos = data.c_str() + data.length(); + while (last_pos < end_pos) { + matched = std::regex_search(last_pos, m, re); + if (matched) { + if (m.position() > 0) { + a8::XPrintf("raw_str:%s\n", + {std::string(last_pos, m.position())}); + } + + a8::XPrintf("str:%s pos:%d len:%d\n", + {m.str(), + m.position(), + m.length()}); + last_pos += m.position() + m.length(); + } else { + a8::XPrintf("raw_str2:%s\n", + {std::string(last_pos, end_pos - last_pos)}); + last_pos = end_pos; + } } exit(1); diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index e44547b..43b576e 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -419,6 +419,7 @@ enum KillTextFieldIdx kFieldIdxMasterName = 1000, kFieldIdxKillerName, kFieldIdxDeadName, + kFieldIdxWeaponName, kFieldIdxWeaponTextIcon, }; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index bc73bc2..a2214fa 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -3,6 +3,8 @@ #include #include +#include + #include #include @@ -19,15 +21,46 @@ a8::XValue(MetaMgr::Instance()->GetSysParamAsString(#field_name, def_val)).GetString(); static void ParseElemets(const std::string& text, - std::vector>& elemets) + std::vector>& elements) { - const char* p = text.c_str(); - int state = 0; - while (*p) { - if (*p == '$') { + auto parsevar_cb = + [] (const std::string& var_name, std::vector>& elements) + { + if (var_name == "${master.name}") { + elements.push_back(std::make_tuple(kFieldIdxMasterName, "")); + } else if (var_name == "${killer.name}") { + elements.push_back(std::make_tuple(kFieldIdxKillerName, "")); + } else if (var_name == "${dead.name}") { + elements.push_back(std::make_tuple(kFieldIdxDeadName, "")); + } else if (var_name == "${weapon.name}") { + elements.push_back(std::make_tuple(kFieldIdxWeaponName, "")); + } else if (var_name == "${weapon.text_icon}") { + elements.push_back(std::make_tuple(kFieldIdxWeaponTextIcon, "")); + } else if (var_name.find("${image.id:") == 0) { + } else { + abort(); + } + }; + std::regex re(R"(\$\{.*?\})", std::regex_constants::ECMAScript); + + const char* pcurr = text.c_str(); + const char* pend = text.c_str() + text.length(); + while (pcurr < pend) { + std::cmatch m; + if (std::regex_search(pcurr, m, re)) { + if (m.position() > 0) { + auto& e = a8::FastAppend(elements); + e = std::make_tuple(kTextElement, std::string(pcurr, m.position())); + } + + parsevar_cb(m.str(), elements); + pcurr += m.position() + m.length(); + } else { + auto& e = a8::FastAppend(elements); + e = std::make_tuple(kTextElement, std::string(pcurr, pend - pcurr)); + pcurr = pend; } - ++p; } }