void parseMessage(StringPiece msg, size_t* threadID, size_t* messageIndex) { // Validate and strip off the message prefix and suffix constexpr StringPiece prefix{"thread "}; if (!msg.startsWith(prefix)) { throw std::runtime_error("bad message prefix"); } msg.advance(prefix.size()); if (!msg.endsWith(kMsgSuffix)) { throw std::runtime_error("bad message suffix"); } msg.subtract(kMsgSuffix.size()); // Parse then strip off the thread index auto threadIDEnd = msg.find(' '); if (threadIDEnd == StringPiece::npos) { throw std::runtime_error("no middle found"); } *threadID = folly::to<size_t>(msg.subpiece(0, threadIDEnd)); msg.advance(threadIDEnd); // Validate that the middle of the message is what we expect, // then strip it off constexpr StringPiece middle{" message "}; if (!msg.startsWith(middle)) { throw std::runtime_error("bad message middle"); } msg.advance(middle.size()); // Parse the message index *messageIndex = folly::to<size_t>(msg); }
TEST(StringPiece, PrefixEmpty) { StringPiece a; EXPECT_TRUE(a.startsWith("")); EXPECT_FALSE(a.startsWith("a")); EXPECT_FALSE(a.startsWith('a')); EXPECT_TRUE(a.removePrefix("")); EXPECT_EQ("", a); EXPECT_FALSE(a.removePrefix("a")); EXPECT_EQ("", a); EXPECT_FALSE(a.removePrefix('a')); EXPECT_EQ("", a); }
std::string getXlogCategoryNameForFile(StringPiece filename) { // Buck mangles the directory layout for header files. Rather than including // them from their original location, it moves them into deep directories // inside buck-out, and includes them from there. // // If this path looks like a buck header directory, try to strip off the // buck-specific portion. if (filename.startsWith("buck-out/")) { filename = stripBuckOutPrefix(filename); } std::string categoryName = filename.str(); // Translate slashes to dots, to turn the directory layout into // a category hierarchy. size_t lastDot = std::string::npos; for (size_t n = 0; n < categoryName.size(); ++n) { if (categoryName[n] == '/') { categoryName[n] = '.'; lastDot = std::string::npos; } else if (categoryName[n] == '.') { lastDot = n; } } // Strip off the filename extension, if one was present. if (lastDot != std::string::npos) { categoryName.resize(lastDot); } return categoryName; }