mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
Fix condition to treat an id as alphanumeric string
An id is considered an alphanumeric string if it contains a non-empty sequence of alphanumeric characters followed by one or more null characters. Fixed unit tests accordingly.
This commit is contained in:
28
src/id.cpp
28
src/id.cpp
@ -57,14 +57,34 @@ std::string wsrep::id::to_string() const
|
||||
return os.str();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If the buffer pointed by ptr contains only alphanumeric chars followed by
|
||||
* one or more null terminators, consider it a valid alphanumeric string.
|
||||
*
|
||||
* A string starting with null is not an alphanumeric string.
|
||||
*/
|
||||
static bool is_alphanumeric_string(const char* ptr, size_t size)
|
||||
{
|
||||
if (size == 0)
|
||||
return false;
|
||||
if (ptr[0] == '\0')
|
||||
return false;
|
||||
const char* first_not_alphanumeric = std::find_if_not(
|
||||
ptr, ptr + size, [](char c) { return ::isalnum(c); });
|
||||
if (static_cast<size_t>(std::distance(ptr, first_not_alphanumeric)) == size)
|
||||
return false;
|
||||
return std::all_of(first_not_alphanumeric, ptr + size,
|
||||
[](char c) { return (c == '\0'); });
|
||||
}
|
||||
|
||||
std::ostream& wsrep::operator<<(std::ostream& os, const wsrep::id& id)
|
||||
{
|
||||
const char* ptr(static_cast<const char*>(id.data()));
|
||||
size_t size(id.size());
|
||||
if (static_cast<size_t>(
|
||||
std::count_if(ptr, ptr + size,
|
||||
[](char c) { return (::isalnum(c) || c == '\0'); }))
|
||||
== size)
|
||||
/* If the buffer pointed by ptr contains only alphanumeric chars followed by
|
||||
* one or more null terminators, return the string. */
|
||||
if (is_alphanumeric_string(ptr, size))
|
||||
{
|
||||
return (os << std::string(ptr, ::strnlen(ptr, size)));
|
||||
}
|
||||
|
Reference in New Issue
Block a user