diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 457c8ef37f..62f4e87201 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -2,6 +2,7 @@ #include "esphome/core/defines.h" #include #include +#include #include #include @@ -335,6 +336,16 @@ std::string str_until(const char *str, char ch) { return pos == nullptr ? std::string(str) : std::string(str, pos - str); } std::string str_until(const std::string &str, char ch) { return str.substr(0, str.find(ch)); } +// wrapper around std::transform to run safely on functions from the ctype.h header +// see https://en.cppreference.com/w/cpp/string/byte/toupper#Notes +template std::string str_ctype_transform(const std::string &str) { + std::string result; + result.resize(str.length()); + std::transform(str.begin(), str.end(), result.begin(), [](unsigned char ch) { return fn(ch); }); + return result; +} +std::string str_lower_case(const std::string &str) { return str_ctype_transform(str); } +std::string str_upper_case(const std::string &str) { return str_ctype_transform(str); } std::string str_snake_case(const std::string &str) { std::string result; result.resize(str.length()); diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index bbe6b49827..c2f2e04339 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -385,6 +385,10 @@ std::string str_until(const char *str, char ch); /// Extract the part of the string until either the first occurence of the specified character, or the end. std::string str_until(const std::string &str, char ch); +/// Convert the string to lower case. +std::string str_lower_case(const std::string &str); +/// Convert the string to upper case. +std::string str_upper_case(const std::string &str); /// Convert the string to snake case (lowercase with underscores). std::string str_snake_case(const std::string &str);