21#include "absl/hash/hash.h"
22#include "absl/strings/ascii.h"
23#include "absl/strings/match.h"
24#include "absl/strings/string_view.h"
27#define strncasecmp _strnicmp
28#define strcasecmp _stricmp
37 return os <<
"kLower";
39 return os <<
"kUpper";
41 return os <<
"kFirst";
43 return os <<
"kMixed";
45 return os <<
"kNoAlpha";
47 return os <<
"INVALID";
52 const char* s =
input.data();
53 const char*
const end = s +
input.size();
55 for (; s !=
end && !(absl::ascii_isupper(*s) || absl::ascii_islower(*s));
64 for (++s; s !=
end && !(absl::ascii_isupper(*s) || absl::ascii_islower(*s));
67 if (s ==
end)
return firstcapstype;
77 if ((absl::ascii_isupper(*s) &&
79 (absl::ascii_islower(*s) &&
90 if (s1.size() == s2.size()) {
91 return strncasecmp(s1.data(), s2.data(), s1.size());
92 }
else if (s1.size() < s2.size()) {
93 int res = strncasecmp(s1.data(), s2.data(), s1.size());
94 return (res == 0) ? -1 : res;
96 int res = strncasecmp(s1.data(), s2.data(), s2.size());
97 return (res == 0) ? 1 : res;
103 return std::hash<std::string>{}(absl::AsciiStrToLower(s));
107 absl::string_view s2)
const {
108 return s1.size() == s2.size() &&
109 strncasecmp(s1.data(), s2.data(), s1.size()) == 0;
114 for (
auto& ch : *s) {
116 ch = absl::ascii_toupper(ch);
118 upper = (absl::StrContains(delimiters, ch));
123 absl::string_view delimiters) {
124 std::string result(s);
int AsciiCaseInsensitiveCompare(absl::string_view s1, absl::string_view s2)
AsciiCapitalizationType GetAsciiCapitalization(const absl::string_view input)
std::ostream & operator<<(std::ostream &os, const AsciiCapitalizationType &type)
void MakeAsciiTitlecase(std::string *s, absl::string_view delimiters)
static int input(yyscan_t yyscanner)
std::optional< int64_t > end
bool operator()(absl::string_view s1, absl::string_view s2) const
size_t operator()(absl::string_view s) const