mirror of
https://github.com/UOX3DevTeam/UOX3
synced 2026-08-13 12:27:04 -04:00
Misc cleanup and standardization of style and naming conventions in code and scripts Added missing code for showing race in paperdoll based on ini setting Players can no longer use Polymorph spell while incognitoed, or while under effect of tribal paint Players can no longer use Incognito spell while polymorphed, or while under the effects of tribal paint Facial hair is now removed from players who are under the effects of Incognito spell that changes their gender for female
162 lines
5 KiB
C++
162 lines
5 KiB
C++
//
|
|
// StringUtility.hpp
|
|
// Infinity
|
|
//
|
|
//
|
|
|
|
#ifndef StringUtility_hpp
|
|
#define StringUtility_hpp
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <sstream>
|
|
#include <iomanip>
|
|
#include <tuple>
|
|
#include <cstdarg>
|
|
#include <type_traits>
|
|
|
|
namespace oldstrutil
|
|
{
|
|
// Uppercase the string
|
|
std::string lower( const std::string &value );
|
|
// Lowercase the string
|
|
std::string upper( const std::string &value );
|
|
|
|
// Remove leading whitespace
|
|
std::string ltrim( const std::string &value );
|
|
// Remove trailing whitespace
|
|
std::string rtrim( const std::string &value );
|
|
// Remove leading/trailing whitespace
|
|
std::string trim( const std::string &value );
|
|
// Remove leading/trailing whitepace, and reduce all other whitespace to one " "
|
|
std::string simplify( const std::string &value );
|
|
|
|
// Removing everything after a delimiter. Normally "//" for comments
|
|
std::string removeTrailing( const std::string& value, const std::string& delim = "//" );
|
|
|
|
// Return the values between two delimitors.
|
|
std::string contents( const std::string &value, const std::string& startdelim, const std::string &enddelim, std::string::size_type location = 0 );
|
|
|
|
// Split a string based on a separator
|
|
std::tuple<std::string, std::string> split( const std::string &value, const std::string &sep );
|
|
|
|
|
|
std::string format( std::size_t maxsize, const std::string fmtstring, ... );
|
|
std::string format( std::size_t maxsize, const std::string fmtstring, va_list &list );
|
|
|
|
std::string format( const std::string fmtstring, ... );
|
|
std::string format( const std::string fmtstring, va_list &list );
|
|
std::string formatMessage( const std::string& uformat, const std::string& data );
|
|
|
|
|
|
std::vector<std::string> sections( const std::string& value, const std::string& sep = ",", std::string::size_type start = 0, std::string::size_type end = std::string::npos );
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++
|
|
// The next few are convience methods on the main method "sections".
|
|
//
|
|
std::uintmax_t sectionCount( const std::string& value, const std::string& sep=",", std::string::size_type start = 0, std::string::size_type end = std::string::npos );
|
|
|
|
std::string indexSection( const std::string& value, std::uintmax_t sectionindex = 0, const std::string& sep = ",", std::string::size_type start = 0, std::string::size_type end = std::string::npos );
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// This mainly is on gumps, where the string needs to be broken up
|
|
// based on the max size
|
|
|
|
std::vector<std::string> breakSize( std::size_t maxsize, const std::string& input );
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// Ensures path ends with a / and converts \ to /
|
|
std::string fixDirectory( const std::string& base );
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// Replace the \ with a /
|
|
std::string replaceSlash( std::string& value );
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// Extract a section (area between N "separators" from a string
|
|
std::string extractSection( const std::string& value, const std::string& sep, std::string::size_type start, std::string::size_type stop = std::string::npos );
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
// Convert a number to a string
|
|
std::string number( char n, int base = 10 );
|
|
std::string number( unsigned char n, int base = 10 );
|
|
|
|
// Convert a string to wstring (for UTF8 characters)
|
|
std::wstring stringToWstring( const std::string& t_str );
|
|
|
|
// Convert a wstring to string (retaining UTF8 characters)
|
|
std::string wStringToString( const std::wstring& t_str );
|
|
|
|
// Convert a string to wstring and back to string (retaining UTF8 characters)
|
|
std::string stringToWstringToString( const std::string& t_str );
|
|
|
|
// Tackles converting text loaded from dictionary into japanese
|
|
std::wstring FromUTF8( const char* str );
|
|
|
|
template<typename T>
|
|
std::string number( T n, int base = 10 )
|
|
{
|
|
std::stringstream conversion;
|
|
if( std::is_integral<T>::value )
|
|
{
|
|
switch( base )
|
|
{
|
|
case 10:
|
|
conversion << std::dec << n;
|
|
break;
|
|
case 16:
|
|
conversion << std::hex << n << std::dec;
|
|
break;
|
|
case 8:
|
|
conversion << std::oct << n << std::dec;
|
|
break;
|
|
default:
|
|
conversion << std::dec << n;
|
|
break;
|
|
}
|
|
}
|
|
else if( std::is_floating_point<T>::value )
|
|
{
|
|
conversion << n;
|
|
}
|
|
|
|
return conversion.str();
|
|
}
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++
|
|
// Convert a string to a value (integer, number)
|
|
//
|
|
template<typename T>
|
|
T value( const std::string& input, int base = 0 )
|
|
{
|
|
if( std::is_floating_point<T>::value )
|
|
{
|
|
double value = 0.0;
|
|
try
|
|
{
|
|
value = std::stod( input );
|
|
}
|
|
catch(...)
|
|
{
|
|
// ok, it couldn't convert it, leave it a 0.0
|
|
}
|
|
return static_cast<T>( value );
|
|
}
|
|
else
|
|
{
|
|
long long value = 0.0;
|
|
try
|
|
{
|
|
value = std::stoll( input, 0, base );
|
|
}
|
|
catch(...)
|
|
{
|
|
// ok, it couldn't convert, keave it a 0
|
|
}
|
|
return static_cast<T>( value );
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
#endif /* StringUtility_hpp */
|