20 #include <znc/zncconfig.h> 26 #include <sys/types.h> 27 #include <initializer_list> 29 #define _SQL(s) CString("'" + CString(s).Escape_n(CString::ESQL) + "'") 30 #define _URL(s) CString(s).Escape_n(CString::EURL) 31 #define _HTML(s) CString(s).Escape_n(CString::EHTML) 32 #define _NAMEDFMT(s) CString(s).Escape_n(CString::ENAMEDFMT) 39 typedef std::vector<std::pair<CString, CString>>
VPair;
41 static const unsigned char XX = 0xff;
42 static const unsigned char base64_table[256] = {
43 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
44 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
45 XX, XX, XX, XX, XX, 62, XX, XX, XX, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60,
46 61, XX, XX, XX, XX, XX, XX, XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
47 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, XX, XX, XX, XX,
48 XX, XX, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
49 43, 44, 45, 46, 47, 48, 49, 50, 51, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
50 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
51 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
52 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
53 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
54 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
55 XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
56 XX, XX, XX, XX, XX, XX, XX, XX, XX,
85 explicit CString(
bool b) :
std::string(b ?
"true" :
"false") {}
87 explicit CString(
unsigned char c);
89 explicit CString(
unsigned short i);
91 explicit CString(
unsigned int i);
93 explicit CString(
unsigned long i);
95 explicit CString(
unsigned long long i);
96 explicit CString(
double i,
int precision = 2);
97 explicit CString(
float i,
int precision = 2);
104 CString(std::initializer_list<char> list) :
std::string(list) {}
113 template <
typename T>
115 std::stringstream ss(*
this);
127 template <
typename Iterator>
129 if (i_start == i_end)
return CString(
"");
130 std::ostringstream output;
134 if (i_start == i_end)
return CString(output.str());
148 CString::size_type uLen = CString::npos)
const;
156 int StrCmp(
const CString& s, CString::size_type uLen = CString::npos)
const;
168 bool Equals(
const CString& s,
bool bCaseSensitive,
169 CString::size_type uLen = CString::npos)
const;
191 bool WildCmp(
const CString& sWild,
217 static EEscape ToEscape(
const CString& sEsc);
218 CString Escape_n(EEscape eFrom, EEscape eTo)
const;
219 CString Escape_n(EEscape eTo)
const;
220 CString& Escape(EEscape eFrom, EEscape eTo);
243 static unsigned int Replace(
CString& sStr,
const CString& sReplace,
246 bool bRemoveDelims =
false);
260 bool bRemoveDelims =
false)
const;
270 unsigned int Replace(
const CString& sReplace,
const CString& sWith,
272 bool bRemoveDelims =
false);
279 CString Ellipsize(
unsigned int uLen)
const;
284 CString Left(size_type uCount)
const;
289 CString Right(size_type uCount)
const;
311 CString Token(
size_t uPos,
bool bRest =
false,
const CString& sSep =
" ",
312 bool bAllowEmpty =
false)
const;
320 bool bTrimQuotes =
true)
const;
322 size_type URLSplit(
MCString& msRet)
const;
323 size_type OptionSplit(
MCString& msRet,
bool bUpperKeys =
false)
const;
324 size_type QuoteSplit(
VCString& vsRet)
const;
342 bool bAllowEmpty =
true,
const CString& sLeft =
"",
343 const CString& sRight =
"",
bool bTrimQuotes =
true,
344 bool bTrimWhiteSpace =
false)
const;
351 bool bAllowEmpty =
true,
const CString& sLeft =
"",
352 const CString& sRight =
"",
bool bTrimQuotes =
true,
353 bool bTrimWhiteSpace =
false)
const;
370 static CString RandomString(
unsigned int uLength);
381 unsigned long Base64Decode(
CString& sRet)
const;
386 unsigned long Base64Decode();
390 CString Base64Decode_n()
const;
399 bool Base64Encode(
CString& sRet,
unsigned int uWrap = 0)
const;
404 bool Base64Encode(
unsigned int uWrap = 0);
409 CString Base64Encode_n(
unsigned int uWrap = 0)
const;
416 void Crypt(
const CString& sPass,
bool bEncrypt,
const CString& sIvec =
"");
423 static CString ToPercent(
double d);
428 static CString ToByteStr(
unsigned long long d);
433 static CString ToTimeStr(
unsigned long s);
438 short ToShort()
const;
440 unsigned short ToUShort()
const;
446 unsigned int ToUInt()
const;
448 unsigned long ToULong()
const;
450 unsigned long long ToULongLong()
const;
452 long long ToLongLong()
const;
454 double ToDouble()
const;
461 bool Trim(
const CString& s =
" \t\r\n");
467 bool TrimLeft(
const CString& s =
" \t\r\n");
473 bool TrimRight(
const CString& s =
" \t\r\n");
497 bool TrimPrefix(
const CString& sPrefix =
":");
502 bool TrimSuffix(
const CString& sSuffix);
527 bool StartsWith(
const CString& sPrefix,
535 bool EndsWith(
const CString& sSuffix,
549 bool LeftChomp(size_type uLen = 1);
554 bool RightChomp(size_type uLen = 1);
560 CString LeftChomp_n(size_type uLen = 1)
const;
566 CString RightChomp_n(size_type uLen = 1)
const;
579 CString StripControls_n()
const;
583 unsigned char* strnchr(
const unsigned char* src,
unsigned char c,
584 unsigned int iMaxBytes,
585 unsigned char* pFill =
nullptr,
586 unsigned int* piCount =
nullptr)
const;
595 class MCString :
public std::map<CString, CString> {
600 MCString(std::initializer_list<std::pair<const CString, CString>> list)
629 enum status_t WriteToDisk(
const CString& sPath, mode_t iMode = 0644)
const;
676 : m_sFormat(sFormat) {}
678 : m_sFormat(
std::move(sFormat)) {}
680 template <
typename... Args>
683 apply(values, 1, args...);
688 template <
typename Arg,
typename... Rest>
689 void apply(
MCString& values,
int index,
const Arg& arg,
690 const Rest&... rest)
const {
692 apply(values, index + 1, rest...);
695 void apply(
MCString& values,
int index)
const {}
700 #endif // !ZNCSTRING_H virtual bool ReadFilter(CString &sKey, CString &sValue) const
Filter used while reading this map.
Definition: ZNCString.h:654
CString(const char *c, size_t l)
Definition: ZNCString.h:101
MCString(std::initializer_list< std::pair< const CString, CString >> list)
Construct a MCString using an initializer list eg.
Definition: ZNCString.h:600
Definition: ZNCString.h:75
CString()
Definition: ZNCString.h:99
status_t
Status codes that can be returned by WriteToDisk() and ReadFromDisk().
Definition: ZNCString.h:610
CString(bool b)
Definition: ZNCString.h:85
~CString()
Definition: ZNCString.h:105
Definition: ZNCString.h:73
CString(std::initializer_list< char > list)
Definition: ZNCString.h:104
CString(const std::string &s)
Definition: ZNCString.h:102
CString Join(Iterator i_start, const Iterator &i_end) const
Joins a collection of objects together, using 'this' as a delimiter.
Definition: ZNCString.h:128
std::set< CString > SCString
Definition: ZNCString.h:35
Definition: ZNCString.h:76
Definition: ZNCString.h:71
MCString()
Construct an empty MCString.
Definition: ZNCString.h:598
EEscape
Definition: ZNCString.h:70
Definition: ZNCString.h:74
CString FirstLine() const
Get the first line of this string.
Definition: ZNCString.h:294
CaseSensitivity
Definition: ZNCString.h:59
std::vector< CString > VCString
Definition: ZNCString.h:38
String class that is used inside ZNC.
Definition: ZNCString.h:68
Definition: ZNCString.h:72
static const MCString EmptyMap
A static instance of an empty map.
Definition: ZNCString.h:606
A dictionary for strings.
Definition: ZNCString.h:595
std::vector< std::pair< CString, CString > > VPair
Definition: ZNCString.h:39
Definition: ZNCString.h:77
CString(const char *c)
Definition: ZNCString.h:100
virtual ~MCString()
Destruct this MCString.
Definition: ZNCString.h:603
bool Convert(T *target) const
Casts a CString to another type.
Definition: ZNCString.h:114
static CString NamedFormat(const CString &sFormat, const MCString &msValues)
Build a string from a format string, replacing values from a map.
CString(size_t n, char c)
Definition: ZNCString.h:103
virtual bool WriteFilter(CString &sKey, CString &sValue) const
Filter used while writing this map.
Definition: ZNCString.h:644
Definition: ZNCString.h:78