/* * Copyright 2013 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _STRINGUTIL_H_ #define _STRINGUTIL_H_ #include #include #include #include #include #ifndef _WIN32 // this doesn't appear to affect linux-based systems..need feedback for _WIN64 #include #endif #ifdef _WINDOWS #include #include #include #endif #include "types.h" class Strings { public: static bool Contains(std::vector container, std::string element); static bool IsNumber(const std::string &s); static const std::string ToLower(std::string s); static const std::string ToUpper(std::string s); static const std::string UcFirst(std::string s); static std::string <rim(std::string &str, const std::string &chars = "\t\n\v\f\r "); static std::string &RTrim(std::string &str, const std::string &chars = "\t\n\v\f\r "); static std::string &Trim(std::string &str, const std::string &chars = "\t\n\v\f\r "); static std::string Commify(const std::string &number); static std::string ConvertToDigit(int n, std::string suffix); static std::string Escape(const std::string &s); static std::string GetBetween(const std::string &s, std::string start_delim, std::string stop_delim); static std::string Implode(std::string glue, std::vector src); static std::string Join(const std::vector &ar, const std::string &delim); static std::string MillisecondsToTime(int duration); static std::string Money(uint32 platinum, uint32 gold = 0, uint32 silver = 0, uint32 copper = 0); static std::string NumberToWords(unsigned long long int n); static std::string Repeat(std::string s, int n); static std::string Replace(std::string subject, const std::string &search, const std::string &replace); static std::string SecondsToTime(int duration, bool is_milliseconds = false); static std::string::size_type SearchDelim(const std::string &haystack, const std::string &needle, const char deliminator = ','); static std::vector Split(const std::string &s, const char delim = ','); static std::vector Split(std::string s, std::string delimiter); static std::vector Wrap(std::vector &src, std::string character); static void FindReplace(std::string &string_subject, const std::string &search_string, const std::string &replace_string); template static std::string ImplodePair(const std::string &glue, const std::pair &encapsulation, const std::vector &src) { if (src.empty()) { return {}; } std::ostringstream oss; for (const T &src_iter: src) { oss << encapsulation.first << src_iter << encapsulation.second << glue; } std::string output(oss.str()); output.resize(output.size() - glue.size()); return output; } }; const std::string StringFormat(const char *format, ...); const std::string vStringFormat(const char *format, va_list args); // For converstion of numerics into English // Used for grid nodes, as NPC names remove numerals. // But general purpose const std::string NUM_TO_ENGLISH_X[] = { "", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen " }; const std::string NUM_TO_ENGLISH_Y[] = { "", "", "Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " }; // _WIN32 builds require that #include be included in whatever code file the invocation is made from (no header files) template std::vector join_pair( const std::string &glue, const std::pair &encapsulation, const std::vector> &src ) { if (src.empty()) { return {}; } std::vector output; for (const std::pair &src_iter: src) { output.push_back( fmt::format( "{}{}{}{}{}{}{}", encapsulation.first, src_iter.first, encapsulation.second, glue, encapsulation.first, src_iter.second, encapsulation.second ) ); } return output; } // _WIN32 builds require that #include be included in whatever code file the invocation is made from (no header files) template std::vector join_tuple( const std::string &glue, const std::pair &encapsulation, const std::vector> &src ) { if (src.empty()) { return {}; } std::vector output; for (const std::tuple &src_iter: src) { output.push_back( fmt::format( "{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", encapsulation.first, std::get<0>(src_iter), encapsulation.second, glue, encapsulation.first, std::get<1>(src_iter), encapsulation.second, glue, encapsulation.first, std::get<2>(src_iter), encapsulation.second, glue, encapsulation.first, std::get<3>(src_iter), encapsulation.second ) ); } return output; } // misc functions std::string SanitizeWorldServerName(std::string server_long_name); std::vector GetBadWords(); void ParseAccountString(const std::string &s, std::string &account, std::string &loginserver); // old c string functions bool atobool(const char *iBool); bool isAlphaNumeric(const char *text); bool strn0cpyt(char *dest, const char *source, uint32 size); char *CleanMobName(const char *in, char *out); char *RemoveApostrophes(const char *s); char *strn0cpy(char *dest, const char *source, uint32 size); const char *ConvertArray(int64 input, char *returnchar); const char *ConvertArrayF(float input, char *returnchar); const char *MakeLowerString(const char *source); uint32 hextoi(const char *num); uint64 hextoi64(const char *num); void MakeLowerString(const char *source, char *target); void RemoveApostrophes(std::string &s); std::string FormatName(const std::string &char_name); bool IsAllowedWorldServerCharacterList(char c); void SanitizeWorldServerName(char *name); template auto CleanMobName(InputIterator first, InputIterator last, OutputIterator result) { for (; first != last; ++first) { if (*first == '_') { *result = ' '; } else if (isalpha(*first) || *first == '`') { *result = *first; } } return result; } #endif