From 98378cd86b6614cbfbb07752efcbcab18cf09ed0 Mon Sep 17 00:00:00 2001 From: prozacx Date: Fri, 1 Jul 2005 23:50:22 +0000 Subject: [PATCH] Added Base64Decode git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@403 726aef4b-f618-498e-8847-2d620e286838 --- String.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++----- String.h | 34 +++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/String.cpp b/String.cpp index 8965cea5..ebd63a85 100644 --- a/String.cpp +++ b/String.cpp @@ -92,7 +92,7 @@ CString CString::AsLower() const { return sRet; } -CString CString::Escape_n(EEscape eFrom, EEscape eTo) { +CString CString::Escape_n(EEscape eFrom, EEscape eTo) const { CString sRet; const char szHex[] = "0123456789ABCDEF"; const unsigned char *pStart = (const unsigned char*) data(); @@ -103,6 +103,7 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) { for (unsigned int a = 0; a < iLength; a++, p = pStart + a) { switch (eFrom) { + case EHTML: case EAscii: ch = *p; break; @@ -133,6 +134,7 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) { } switch (eTo) { + case EHTML: case EAscii: sRet += ch; break; @@ -155,8 +157,8 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) { return sRet; } -CString CString::Escape_n(EEscape eTo) { - return Escape(EAscii, eTo); +CString CString::Escape_n(EEscape eTo) const { + return Escape_n(EAscii, eTo); } CString& CString::Escape(EEscape eFrom, EEscape eTo) { @@ -246,13 +248,13 @@ CString CString::Right(unsigned int uCount) const { return substr(length() - uCount, uCount); } -VCString CString::Split(const CString& sDelim, bool bAllowEmpty) { +VCString CString::Split(const CString& sDelim, bool bAllowEmpty) const { VCString vsRet; Split(sDelim, vsRet, bAllowEmpty); return vsRet; } -unsigned int CString::Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty) { +unsigned int CString::Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty) const { vsRet.empty(); CString sTmp = *this; @@ -278,6 +280,43 @@ CString CString::Format(const CString& sFormatStr, ...) { return ""; } +unsigned long CString::Base64Decode(CString& sRet) const { + const char* in = c_str(); + char c, c1, *p; + unsigned long i; + unsigned long uLen = size(); + char* out = (char*) malloc(size() +1); + + for (i = 0, p = out; i < uLen; i++) { + c = (char)base64_table[(unsigned char)in[i++]]; + c1 = (char)base64_table[(unsigned char)in[i++]]; + *p++ = (c << 2) | ((c1 >> 4) & 0x3); + + if (i < uLen) { + if (in[i] == '=') { + break; + } + c = (char)base64_table[(unsigned char)in[i]]; + *p++ = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf); + } + + if (++i < uLen) { + if (in[i] == '=') { + break; + } + *p++ = ((c << 6) & 0xc0) | (char)base64_table[(unsigned char)in[i]]; + } + } + + *p = '\0'; + unsigned long uRet = p - out; + sRet = out; + free(out); + + return uRet; +} + + CString CString::ToString(char c) { stringstream s; s << c; return s.str(); } CString CString::ToString(unsigned char c) { stringstream s; s << c; return s.str(); } CString CString::ToString(short i) { stringstream s; s << i; return s.str(); } diff --git a/String.h b/String.h index b130567b..5eedc2da 100644 --- a/String.h +++ b/String.h @@ -14,11 +14,32 @@ using std::stringstream; class CString; typedef vector VCString; +static const unsigned char XX = 0xff; +static const unsigned char base64_table[256] = { + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63, + 52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,XX,XX,XX, + XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX, + XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, + XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, +}; + class CString : public string { public: typedef enum { EAscii, EURL, + EHTML, } EEscape; CString() : string() {} @@ -36,20 +57,23 @@ public: CString AsUpper() const; CString AsLower() const; - CString Escape_n(EEscape eFrom, EEscape eTo); - CString Escape_n(EEscape eTo); + CString Escape_n(EEscape eFrom, EEscape eTo) const; + CString Escape_n(EEscape eTo) const; CString& Escape(EEscape eFrom, EEscape eTo); CString& Escape(EEscape eTo); + static unsigned int Replace(CString& sStr, const CString& sReplace, const CString& sWith); unsigned int Replace(const CString& sReplace, const CString& sWith); - CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ") const; CString Ellipsize(unsigned int uLen) const; CString Left(unsigned int uCount) const; CString Right(unsigned int uCount) const; - VCString Split(const CString& sDelim, bool bKeepEmpty = true); - unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true); + + CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ") const; + VCString Split(const CString& sDelim, bool bKeepEmpty = true) const; + unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true) const; static CString Format(const CString& sFormatStr, ...); + unsigned long Base64Decode(CString& sRet) const; static CString ToString(char c); static CString ToString(unsigned char c);