Cuberite
A lightweight, fast and extensible game server for Minecraft
StringUtils.h
Go to the documentation of this file.
1 
2 // StringUtils.h
3 
4 // Interfaces to various string helper functions
5 
6 
7 
8 
9 #pragma once
10 
11 typedef std::string AString;
12 typedef std::vector<AString> AStringVector;
13 typedef std::list<AString> AStringList;
14 
16 typedef std::map<AString, AString> AStringMap;
17 
18 
19 
20 
21 
24 extern AStringVector StringSplit(const AString & str, const AString & delim);
25 
29 extern AStringVector StringSplitWithQuotes(const AString & str, const AString & delim);
30 
32 AString StringJoin(const AStringVector & a_Strings, const AString & a_Delimiter);
33 
36 extern AStringVector StringSplitAndTrim(const AString & str, const AString & delim);
37 
40 extern AString TrimString(const AString & str); // tolua_export
41 
44 extern AString & InPlaceUppercase(AString & s);
45 
48 extern AString & InPlaceLowercase(AString & s);
49 
51 extern AString StrToUpper(const AString & s);
52 
54 extern AString StrToLower(const AString & s);
55 
58 extern int NoCaseCompare(const AString & s1, const AString & s2); // tolua_export
59 
61 extern size_t RateCompareString(const AString & s1, const AString & s2);
62 
64 extern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith); // tolua_export
65 
67 extern void ReplaceURL(AString & iHayStack, const AString & iNeedle, const AString & iReplaceWith);
68 
70 extern AString & RawBEToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8);
71 
73 extern AString UnicodeCharToUtf8(unsigned a_UnicodeChar);
74 
76 extern std::u16string UTF8ToRawBEUTF16(const AString & a_String);
77 
79 extern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine);
80 
82 extern AString EscapeString(const AString & a_Message); // tolua_export
83 
85 extern AString StripColorCodes(const AString & a_Message); // tolua_export
86 
90 extern std::pair<bool, AString> URLDecode(const AString & a_String); // Exported to Lua as cUrlParser::UrlDecode()
91 
93 extern AString URLEncode(const AString & a_Text);
94 
96 extern AString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_To); // Needn't export to Lua, since Lua doesn't have chars anyway
97 
99 extern AString Base64Decode(const AString & a_Base64String); // Exported manually due to embedded NULs and extra parameter
100 
102 extern AString Base64Encode(const AString & a_Input); // Exported manually due to embedded NULs and extra parameter
103 
105 extern short GetBEShort(const std::byte * a_Mem);
106 
108 extern unsigned short GetBEUShort(const char * a_Mem);
109 
111 extern int GetBEInt(const std::byte * a_Mem);
112 
114 extern void SetBEInt(std::byte * a_Mem, Int32 a_Value);
115 
119 extern bool SplitZeroTerminatedStrings(const AString & a_Strings, AStringVector & a_Output);
120 
125 extern AStringVector MergeStringVectors(const AStringVector & a_Strings1, const AStringVector & a_Strings2);
126 
129 extern AString StringsConcat(const AStringVector & a_Strings, char a_Separator);
130 
132 extern bool StringToFloat(const AString & a_String, float & a_Num);
133 
135 bool IsOnlyWhitespace(const AString & a_String);
136 
137 
138 
139 
140 
142 template <class T>
143 bool StringToInteger(const AString & a_str, T & a_Num)
144 {
145  size_t i = 0;
146  bool positive = true;
147  T result = 0;
148  if (a_str[0] == '+')
149  {
150  i++;
151  }
152  else if (a_str[0] == '-')
153  {
154  i++;
155  positive = false;
156  }
157  if (positive)
158  {
159  for (size_t size = a_str.size(); i < size; i++)
160  {
161  if ((a_str[i] < '0') || (a_str[i] > '9'))
162  {
163  return false;
164  }
165  if (std::numeric_limits<T>::max() / 10 < result)
166  {
167  return false;
168  }
169  result *= 10;
170  T digit = static_cast<T>(a_str[i] - '0');
171  if (std::numeric_limits<T>::max() - digit < result)
172  {
173  return false;
174  }
175  result += digit;
176  }
177  }
178  else
179  {
180  // Unsigned result cannot be signed!
181  if (!std::numeric_limits<T>::is_signed)
182  {
183  return false;
184  }
185 
186  for (size_t size = a_str.size(); i < size; i++)
187  {
188  if ((a_str[i] < '0') || (a_str[i] > '9'))
189  {
190  return false;
191  }
192  if (std::numeric_limits<T>::min() / 10 > result)
193  {
194  return false;
195  }
196  result *= 10;
197  T digit = static_cast<T>(a_str[i] - '0');
198  if (std::numeric_limits<T>::min() + digit > result)
199  {
200  return false;
201  }
202  result -= digit;
203  }
204  }
205  a_Num = result;
206  return true;
207 }
208 
209 
210 
211 
212 
215 template <typename T>
216 T GetStringMapInteger(const AStringMap & a_Map, const AString & a_Key, T a_Default)
217 {
218  // Try to locate the key:
219  auto itr = a_Map.find(a_Key);
220  if (itr == a_Map.end())
221  {
222  return a_Default;
223  }
224 
225  // Try to convert the value to a number:
226  T res = a_Default;
227  if (!StringToInteger<T>(itr->second, res))
228  {
229  return a_Default;
230  }
231  return res;
232 }
233 
234 
235 
236 
237 
238 // If you have any other string helper functions, declare them here
239 
240 
241 
242 
signed int Int32
Definition: Globals.h:152
AStringVector StringSplitAndTrim(const AString &str, const AString &delim)
Split the string at any of the listed delimiters and trim each value.
T GetStringMapInteger(const AStringMap &a_Map, const AString &a_Key, T a_Default)
Returns a number (of any integer type T) from a key-value string map.
Definition: StringUtils.h:216
AString & InPlaceLowercase(AString &s)
In-place string conversion to lowercase.
AString TrimString(const AString &str)
Trims whitespace at both ends of the string.
std::vector< AString > AStringVector
Definition: StringUtils.h:12
std::u16string UTF8ToRawBEUTF16(const AString &a_String)
Converts a UTF-8 string into a UTF-16 BE string.
AString & RawBEToUTF8(const char *a_RawData, size_t a_NumShorts, AString &a_UTF8)
Converts a stream of BE shorts into UTF-8 string; returns a_UTF8.
AString URLEncode(const AString &a_Text)
URL-encodes the given string.
AString StrToLower(const AString &s)
Returns a lower-cased copy of the string.
AString & InPlaceUppercase(AString &s)
In-place string conversion to uppercase.
AString EscapeString(const AString &a_Message)
Returns a copy of a_Message with all quotes and backslashes escaped by a backslash.
AString ReplaceAllCharOccurrences(const AString &a_String, char a_From, char a_To)
Replaces all occurrences of char a_From inside a_String with char a_To.
AStringVector StringSplit(const AString &str, const AString &delim)
Split the string at any of the listed delimiters.
Definition: StringUtils.cpp:55
bool SplitZeroTerminatedStrings(const AString &a_Strings, AStringVector &a_Output)
Splits a string that has embedded \0 characters, on those characters.
AString Base64Decode(const AString &a_Base64String)
Decodes a Base64-encoded string into the raw data.
std::string AString
Definition: StringUtils.h:11
short GetBEShort(const std::byte *a_Mem)
Reads two bytes from the specified memory location and interprets them as BigEndian short.
void SetBEInt(std::byte *a_Mem, Int32 a_Value)
Writes four bytes to the specified memory location so that they interpret as BigEndian int.
void ReplaceString(AString &iHayStack, const AString &iNeedle, const AString &iReplaceWith)
Replaces each occurence of iNeedle in iHayStack with iReplaceWith.
AString StripColorCodes(const AString &a_Message)
Removes all control codes used by MC for colors and styles.
AString & CreateHexDump(AString &a_Out, const void *a_Data, size_t a_Size, size_t a_BytesPerLine)
Creates a nicely formatted HEX dump of the given memory block.
AStringVector StringSplitWithQuotes(const AString &str, const AString &delim)
Split the string at any of the listed delimiters.
Definition: StringUtils.cpp:76
AString StringsConcat(const AStringVector &a_Strings, char a_Separator)
Concatenates the specified strings into a single string, separated by the specified separator charact...
int NoCaseCompare(const AString &s1, const AString &s2)
Case-insensitive string comparison.
void ReplaceURL(AString &iHayStack, const AString &iNeedle, const AString &iReplaceWith)
Replaces each occurence of iNeedle in iHayStack with iReplaceWith, after URL-encoding iReplaceWith.
AStringVector MergeStringVectors(const AStringVector &a_Strings1, const AStringVector &a_Strings2)
Merges the two vectors of strings, removing duplicate entries from the second vector.
std::list< AString > AStringList
Definition: StringUtils.h:13
AString StrToUpper(const AString &s)
Returns an upper-cased copy of the string.
AString UnicodeCharToUtf8(unsigned a_UnicodeChar)
Converts a unicode character to its UTF8 representation.
bool StringToInteger(const AString &a_str, T &a_Num)
Parses any integer type.
Definition: StringUtils.h:143
size_t RateCompareString(const AString &s1, const AString &s2)
Case-insensitive string comparison that returns a rating of equal-ness between [0 - s1....
AString StringJoin(const AStringVector &a_Strings, const AString &a_Delimiter)
Join a list of strings with the given delimiter between entries.
bool StringToFloat(const AString &a_String, float &a_Num)
Converts a string into a float.
bool IsOnlyWhitespace(const AString &a_String)
Returns true if only whitespace characters are present in the string.
std::map< AString, AString > AStringMap
A string dictionary, used for key-value pairs.
Definition: StringUtils.h:16
int GetBEInt(const std::byte *a_Mem)
Reads four bytes from the specified memory location and interprets them as BigEndian int.
AString Base64Encode(const AString &a_Input)
Encodes a string into Base64.
std::pair< bool, AString > URLDecode(const AString &a_String)
URL-Decodes the given string.
unsigned short GetBEUShort(const char *a_Mem)
Reads two bytes from the specified memory location and interprets them as BigEndian unsigned short.