--- nono/lib/mystring.cpp 2026/04/29 17:04:34 1.1.1.3 +++ nono/lib/mystring.cpp 2026/04/29 17:04:54 1.1.1.4 @@ -63,6 +63,49 @@ string_tolower(const std::string& src) return dst; } +// 文字列 lhs の先頭が rhs と大文字小文字の区別なしで一致すれば true を返す。 +// ASCII 専用。 +// C++20 の starts_with に似せておく。 +bool +starts_with_ignorecase(const std::string& lhs, const std::string& rhs) +{ + if (lhs.length() < rhs.length()) { + return false; + } +#if 0 + return std::equal( + lhs.begin(), lhs.begin() + rhs.length(), + rhs.begin(), + [](std::string::value_type l, std::string::value_type r) { + return std::tolower(l) == std::tolower(r); + } + ); +#else + // こっちのほうが分かりやすいよな + return strncasecmp(lhs.c_str(), rhs.c_str(), rhs.length()) == 0; +#endif +} + +// 文字列 str (長さ len) を文字 c で分割したリストを返す。 +std::vector +string_split(const char *str, int len, char c) +{ + std::vector list; + + for (int pos = 0, end = 0 ; pos < len; pos = end + 1) { + const char *p = strchr(str + pos, c); + if (p) { + end = p - str; + } else { + end = len; + } + + list.emplace_back(str + pos, end - pos); + } + + return list; +} + #if 0 #include #include