diff options
Diffstat (limited to 'comm/mailnews/import/src/ImportCharSet.h')
-rw-r--r-- | comm/mailnews/import/src/ImportCharSet.h | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/comm/mailnews/import/src/ImportCharSet.h b/comm/mailnews/import/src/ImportCharSet.h new file mode 100644 index 0000000000..0feb8d2a98 --- /dev/null +++ b/comm/mailnews/import/src/ImportCharSet.h @@ -0,0 +1,201 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef ImportCharSet_h___ +#define ImportCharSet_h___ + +#include "nscore.h" + +// Some useful ASCII values +// 'A' = 65, 0x41 +// 'Z' = 90, 0x5a +// '_' = 95, 0x5f +// 'a' = 97, 0x61 +// 'z' = 122, 0x7a +// '0' = 48, 0x30 +// '1' = 49, 0x31 +// '9' = 57, 0x39 +// ' ' = 32, 0x20 +// whitespace, 10, 13, 32, 9 (linefeed, cr, space, tab) - 0x0a, 0x0d, 0x20, +// 0x09 +// ':' = 58, 0x3a + +// a typedef enum would be nicer but some compilers still have trouble with +// treating enum's as plain numbers when needed + +class ImportCharSet { + public: + enum { + cTabChar = 9, + cLinefeedChar = 10, + cCRChar = 13, + cSpaceChar = 32, + cUpperAChar = 65, + cUpperZChar = 90, + cUnderscoreChar = 95, + cLowerAChar = 97, + cLowerZChar = 122, + cZeroChar = 48, + cNineChar = 57, + + cAlphaNumChar = 1, + cAlphaChar = 2, + cWhiteSpaceChar = 4, + cDigitChar = 8, + c822SpecialChar = 16 + }; + + static char m_upperCaseMap[256]; + static char m_Ascii[256]; + + inline static bool IsUSAscii(uint8_t ch) { + return (((ch & (uint8_t)0x80) == 0)); + } + inline static bool Is822CtlChar(uint8_t ch) { return (ch < 32); } + inline static bool Is822SpecialChar(uint8_t ch) { + return ((m_Ascii[ch] & c822SpecialChar) == c822SpecialChar); + } + inline static bool IsWhiteSpace(uint8_t ch) { + return ((m_Ascii[ch] & cWhiteSpaceChar) == cWhiteSpaceChar); + } + inline static bool IsAlphaNum(uint8_t ch) { + return ((m_Ascii[ch] & cAlphaNumChar) == cAlphaNumChar); + } + inline static bool IsDigit(uint8_t ch) { + return ((m_Ascii[ch] & cDigitChar) == cDigitChar); + } + + inline static uint8_t ToLower(uint8_t ch) { + if ((m_Ascii[ch] & cAlphaChar) == cAlphaChar) { + return cLowerAChar + (m_upperCaseMap[ch] - cUpperAChar); + } else + return ch; + } + + inline static long AsciiToLong(const uint8_t* pChar, uint32_t len) { + long num = 0; + while (len) { + if ((m_Ascii[*pChar] & cDigitChar) == 0) return num; + num *= 10; + num += (*pChar - cZeroChar); + len--; + pChar++; + } + return num; + } + + inline static void ByteToHex(uint8_t byte, uint8_t* pHex) { + uint8_t val = byte; + val /= 16; + if (val < 10) + *pHex = '0' + val; + else + *pHex = 'A' + (val - 10); + pHex++; + val = byte; + val &= 0x0F; + if (val < 10) + *pHex = '0' + val; + else + *pHex = 'A' + (val - 10); + } + + inline static void LongToHexBytes(uint32_t type, uint8_t* pStr) { + ByteToHex((uint8_t)(type >> 24), pStr); + pStr += 2; + ByteToHex((uint8_t)((type >> 16) & 0x0FF), pStr); + pStr += 2; + ByteToHex((uint8_t)((type >> 8) & 0x0FF), pStr); + pStr += 2; + ByteToHex((uint8_t)(type & 0x0FF), pStr); + } + + inline static void SkipWhiteSpace(const uint8_t*& pChar, uint32_t& pos, + uint32_t max) { + while ((pos < max) && (IsWhiteSpace(*pChar))) { + pos++; + pChar++; + } + } + + inline static void SkipSpaceTab(const uint8_t*& pChar, uint32_t& pos, + uint32_t max) { + while ((pos < max) && + ((*pChar == (uint8_t)cSpaceChar) || (*pChar == (uint8_t)cTabChar))) { + pos++; + pChar++; + } + } + + inline static void SkipTilSpaceTab(const uint8_t*& pChar, uint32_t& pos, + uint32_t max) { + while ((pos < max) && (*pChar != (uint8_t)cSpaceChar) && + (*pChar != (uint8_t)cTabChar)) { + pos++; + pChar++; + } + } + + inline static bool StrNICmp(const uint8_t* pChar, const uint8_t* pSrc, + uint32_t len) { + while (len && (m_upperCaseMap[*pChar] == m_upperCaseMap[*pSrc])) { + pChar++; + pSrc++; + len--; + } + return len == 0; + } + + inline static bool StrNCmp(const uint8_t* pChar, const uint8_t* pSrc, + uint32_t len) { + while (len && (*pChar == *pSrc)) { + pChar++; + pSrc++; + len--; + } + return len == 0; + } + + inline static int FindChar(const uint8_t* pChar, uint8_t ch, uint32_t max) { + uint32_t pos = 0; + while ((pos < max) && (*pChar != ch)) { + pos++; + pChar++; + } + if (pos < max) + return (int)pos; + else + return -1; + } + + inline static bool NextChar(const uint8_t*& pChar, uint8_t ch, uint32_t& pos, + uint32_t max) { + if ((pos < max) && (*pChar == ch)) { + pos++; + pChar++; + return true; + } + return false; + } + + inline static int32_t strcmp(const char* pS1, const char* pS2) { + while (*pS1 && *pS2 && (*pS1 == *pS2)) { + pS1++; + pS2++; + } + return *pS1 - *pS2; + } + + inline static int32_t stricmp(const char* pS1, const char* pS2) { + while (*pS1 && *pS2 && + (m_upperCaseMap[uint8_t(*pS1)] == m_upperCaseMap[uint8_t(*pS2)])) { + pS1++; + pS2++; + } + return m_upperCaseMap[uint8_t(*pS1)] - m_upperCaseMap[uint8_t(*pS2)]; + } +}; + +#endif /* ImportCharSet_h__ */ |