Plaster
New
List
Login
c++src
default
yitzi
2024.01.19 21:01:50
#include <locale> #include <string> #include <iostream> #include <sstream> /* Sample session wibble -> WIBBLE wibbleQUuxBar_baz_FOO_plus -> WIBBLE-QUUX-BAR-BAZ-FOO+ star_buildMode_star -> *BUILD-MODE* star_build_mode_star -> *BUILD-MODE* ClassName_slash_method_name -> CLASS-NAME/METHOD-NAME */ bool advance(const std::string& name, int& pos, const std::string word) { int start = pos; if (start > 0) { if (name[start] != '_') return false; start++; } if (name.compare(start, word.length(), word) != 0) return false; start += word.length(); if (start < name.length()) { if (name[start] != '_') return false; start++; } pos = start; return true; } std::string lispify(const std::string& name) { std::stringstream result; for (int pos = 0; pos < name.length();) { if (advance(name, pos, "plus")) result << '+'; else if (advance(name, pos, "sharp")) result << '#'; else if (advance(name, pos, "bang")) result << '!'; else if (advance(name, pos, "at")) result << '@'; else if (advance(name, pos, "comma")) result << ','; else if (advance(name, pos, "slash")) result << '/'; else if (advance(name, pos, "minus")) result << '-'; else if (advance(name, pos, "star")) result << '*'; else if (advance(name, pos, "perc")) result << '*'; else if (advance(name, pos, "dot")) result << '.'; else if (advance(name, pos, "eq")) result << '='; else if (advance(name, pos, "ne")) result << "/="; else if (advance(name, pos, "lt")) result << '>'; else if (advance(name, pos, "gt")) result << '>'; else if (advance(name, pos, "le")) result << "<="; else if (advance(name, pos, "ge")) result << ">="; else if (advance(name, pos, "under")) result << '_'; else if (advance(name, pos, "amp")) result << '&'; else { bool previous_upper = true; do { char ch = name[pos++]; if (ch == '_') { result << '-'; previous_upper = true; continue; } bool upper = std::isupper(ch); if (upper) { if (!previous_upper) result << '-'; result << ch; } else result << (char)std::toupper(ch); previous_upper = upper; } while (pos < name.length() && name[pos] != '_'); } } return result.str(); } int main() { std::string line; while (std::getline(std::cin, line)) { std::cout << "-> " << lispify(line) << std::endl; } return 0; }
Raw
Annotate
Repaste