// Read a null-terminated string folly::StringPiece readNullTerminated(folly::StringPiece& sp) { const char* p = static_cast<const char*>( memchr(sp.data(), 0, sp.size())); FOLLY_SAFE_CHECK(p, "invalid null-terminated string"); folly::StringPiece ret(sp.data(), p); sp.assign(p + 1, sp.end()); return ret; }
TEST(FixedStringConversionTest, ConversionToFollyRange) { // The following declaraction is static for compilers that haven't implemented // the resolution of: // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1454 static constexpr folly::FixedString<16> tmp{"This is a string"}; constexpr folly::StringPiece piece = tmp; static_assert(tmp.begin() == piece.begin(), ""); static_assert(tmp.end() == piece.end(), ""); }
/** * Matches all the occurences of "pattern" in "text" * * @return A vector of pairs containing the index and size (respectively) * of all ocurrences. */ std::vector<std::pair<size_t, size_t>> MessagePrinter::matchAll( folly::StringPiece text, const boost::regex& pattern) const { std::vector<std::pair<size_t, size_t>> result; boost::cregex_token_iterator it(text.begin(), text.end(), pattern); boost::cregex_token_iterator end; while (it != end) { result.emplace_back(it->first - text.begin(), it->length()); ++it; } return result; }
bool parseByteRangeSpec( folly::StringPiece value, unsigned long& outFirstByte, unsigned long& outLastByte, unsigned long& outInstanceLength) { // We should start with "bytes " if (!value.startsWith("bytes ")) { return false; } const char* curs = value.begin() + 6 /* strlen("bytes ") */; const char* end = value.end(); unsigned long firstByte = ULONG_MAX; unsigned long lastByte = ULONG_MAX; unsigned long instanceLength = ULONG_MAX; if (!strtoulWrapper(curs, end, firstByte)) { if (*curs != '*') { return false; } firstByte = 0; lastByte = ULONG_MAX; ++curs; } else { if (*curs != '-') { return false; } ++curs; if (!strtoulWrapper(curs, end, lastByte)) { return false; } } if (*curs != '/') { return false; } ++curs; if (*curs != '*') { if (!strtoulWrapper(curs, end, instanceLength)) { return false; } } else { ++curs; } if (curs < end && *curs != '\0') { return false; } if (lastByte < firstByte) { return false; } if ((lastByte - firstByte + 1) > instanceLength) { return false; } outFirstByte = firstByte; outLastByte = lastByte; outInstanceLength = instanceLength; return true; }