This commit adds replacement of `::tolower` and `::toupper`.
Added CharToLower and CharToUpper routines reduce the number of cast operators
that required for correct usage of standard C/C++ `::tolower/toupper` routines.
// Case-insensitive isalnum
inline bool is_alnum(char c) { return is_alpha(c) || is_digit(c); }
+inline char CharToUpper(char c) {
+ return static_cast<char>(::toupper(static_cast<unsigned char>(c)));
+}
+
+inline char CharToLower(char c) {
+ return static_cast<char>(::tolower(static_cast<unsigned char>(c)));
+}
+
// @end-locale-independent functions for ASCII character set
#ifdef FLATBUFFERS_PREFER_PRINTF
namespace flatbuffers {
-// Pedantic warning free version of toupper().
-inline char ToUpper(char c) {
- return static_cast<char>(::toupper(static_cast<unsigned char>(c)));
-}
-
// Make numerical literal with type-suffix.
// This function is only needed for C++! Other languages do not need it.
static inline std::string NumToStringCpp(std::string val, BaseType type) {
// Anything extra to add to the guard?
if (!postfix.empty()) { guard += postfix + "_"; }
guard += "H_";
- std::transform(guard.begin(), guard.end(), guard.begin(), ToUpper);
+ std::transform(guard.begin(), guard.end(), guard.begin(), CharToUpper);
return guard;
}
std::string GenFieldOffsetName(const FieldDef &field) {
std::string uname = Name(field);
- std::transform(uname.begin(), uname.end(), uname.begin(), ToUpper);
+ std::transform(uname.begin(), uname.end(), uname.begin(), CharToUpper);
return "VT_" + uname;
}
// The '--cpp_std' argument could be extended (like ASAN):
// Example: "flatc --cpp_std c++17:option1:option2".
auto cpp_std = !opts.cpp_std.empty() ? opts.cpp_std : "C++0X";
- std::transform(cpp_std.begin(), cpp_std.end(), cpp_std.begin(), ToUpper);
+ std::transform(cpp_std.begin(), cpp_std.end(), cpp_std.begin(), CharToUpper);
if (cpp_std == "C++0X") {
opts.g_cpp_std = cpp::CPP_STD_X0;
opts.g_only_fixed_enums = false;
auto ret = sstream.str() + ns.components.back();
for (size_t i = 0; i < ret.size(); i++) {
- auto lower = tolower(ret[i]);
+ auto lower = CharToLower(ret[i]);
if (lower != ret[i]) {
- ret[i] = static_cast<char>(lower);
+ ret[i] = lower;
if (i != 0 && ret[i - 1] != '.') {
ret.insert(i, "_");
i++;
}
}
}
- // std::transform(ret.begin(), ret.end(), ret.begin(), ::tolower);
+ // std::transform(ret.begin(), ret.end(), ret.begin(), CharToLower);
return ret;
}
for (size_t i = 0; i < part.length(); i++) {
if (i && !isdigit(part[i]) &&
- part[i] == static_cast<char>(toupper(part[i]))) {
+ part[i] == CharToUpper(part[i])) {
ns += "_";
- ns += static_cast<char>(tolower(part[i]));
+ ns += CharToLower(part[i]);
} else {
- ns += static_cast<char>(tolower(part[i]));
+ ns += CharToLower(part[i]);
}
}
if (it != qualified_name_parts.end() - 1) { ns += "_"; }
// Converts the name of a definition into lower Camel format.
std::string MakeLowerCamel(const Definition &definition) const {
auto name = MakeCamel(NormalizedName(definition), false);
- name[0] = char(tolower(name[0]));
+ name[0] = CharToLower(name[0]);
return name;
}
auto field_type_name = TypeName(field);
auto one_instance = field_type_name + "_";
- one_instance[0] = char(tolower(one_instance[0]));
+ one_instance[0] = CharToLower(one_instance[0]);
if (parser_.opts.include_dependence_headers) {
auto package_reference = GenPackageReference(field.value.type);
std::string s;
for (size_t i = 0; i < in.length(); i++) {
if (i == 0) {
- s += static_cast<char>(tolower(in[0]));
+ s += CharToLower(in[0]);
} else if (in[i] == '_') {
s += '_';
} else if (!islower(in[i])) {
// Prevent duplicate underscores for Upper_Snake_Case strings
// and UPPERCASE strings.
if (islower(in[i - 1])) { s += '_'; }
- s += static_cast<char>(tolower(in[i]));
+ s += CharToLower(in[i]);
} else {
s += in[i];
}
std::string MakeUpper(const std::string &in) {
std::string s;
for (size_t i = 0; i < in.length(); i++) {
- s += static_cast<char>(toupper(in[i]));
+ s += CharToUpper(in[i]);
}
return s;
}
optional + " { ";
}
-inline char LowerCase(char c) {
- return static_cast<char>(::tolower(static_cast<unsigned char>(c)));
-}
-
class SwiftGenerator : public BaseGenerator {
private:
CodeWriter code_;
const auto &ev = **enum_def.Vals().begin();
name = Name(ev);
}
- std::transform(name.begin(), name.end(), name.begin(), LowerCase);
+ std::transform(name.begin(), name.end(), name.begin(), CharToLower);
return "." + name;
}
std::string Name(const EnumVal &ev) const {
auto name = ev.name;
if (isupper(name.front())) {
- std::transform(name.begin(), name.end(), name.begin(), LowerCase);
+ std::transform(name.begin(), name.end(), name.begin(), CharToLower);
}
return EscapeKeyword(MakeCamel(name, false));
}
std::string s;
for (size_t i = 0; i < in.length(); i++) {
if (!i && first)
- s += static_cast<char>(toupper(in[0]));
+ s += CharToUpper(in[0]);
else if (in[i] == '_' && i + 1 < in.length())
- s += static_cast<char>(toupper(in[++i]));
+ s += CharToUpper(in[++i]);
else
s += in[i];
}
std::string s;
for (size_t i = 0; i < in.length(); i++) {
if (in[i] != '_')
- s += static_cast<char>(toupper(in[i]));
+ s += CharToUpper(in[i]);
else
s += in[i];
}