Annotation of elwix/tools/oldlzma/SRC/Common/String.cpp, revision 1.1

1.1     ! misho       1: // Common/String.cpp
        !             2: 
        !             3: #include "StdAfx.h"
        !             4: 
        !             5: #ifdef _WIN32
        !             6: #include "StringConvert.h"
        !             7: #else
        !             8: #include <ctype.h>
        !             9: #endif
        !            10: 
        !            11: #include "Common/String.h"
        !            12: 
        !            13: 
        !            14: #ifdef _WIN32
        !            15: 
        !            16: #ifndef _UNICODE
        !            17: 
        !            18: wchar_t MyCharUpper(wchar_t c)
        !            19: {
        !            20:   if (c == 0)
        !            21:     return 0;
        !            22:   wchar_t *res = CharUpperW((LPWSTR)(unsigned int)c);
        !            23:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !            24:     return (wchar_t)(unsigned int)res;
        !            25:   const int kBufferSize = 4;
        !            26:   char s[kBufferSize];
        !            27:   int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0);
        !            28:   ::CharUpperA(s);
        !            29:   ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
        !            30:   return c;
        !            31: }
        !            32: 
        !            33: wchar_t MyCharLower(wchar_t c)
        !            34: {
        !            35:   if (c == 0)
        !            36:     return 0;
        !            37:   wchar_t *res = CharLowerW((LPWSTR)(unsigned int)c);
        !            38:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !            39:     return (wchar_t)(unsigned int)res;
        !            40:   const int kBufferSize = 4;
        !            41:   char s[kBufferSize];
        !            42:   int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0);
        !            43:   ::CharLowerA(s);
        !            44:   ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
        !            45:   return c;
        !            46: }
        !            47: 
        !            48: wchar_t * MyStringUpper(wchar_t *s)
        !            49: {
        !            50:   if (s == 0)
        !            51:     return 0;
        !            52:   wchar_t *res = CharUpperW(s);
        !            53:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !            54:     return res;
        !            55:   AString a = UnicodeStringToMultiByte(s);
        !            56:   a.MakeUpper();
        !            57:   return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
        !            58: }
        !            59: 
        !            60: wchar_t * MyStringLower(wchar_t *s)
        !            61: { 
        !            62:   if (s == 0)
        !            63:     return 0;
        !            64:   wchar_t *res = CharLowerW(s);
        !            65:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !            66:     return res;
        !            67:   AString a = UnicodeStringToMultiByte(s);
        !            68:   a.MakeLower();
        !            69:   return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
        !            70: }
        !            71: 
        !            72: #endif
        !            73: 
        !            74: inline int ConvertCompareResult(int r) { return r - 2; }
        !            75: 
        !            76: int MyStringCollate(const wchar_t *s1, const wchar_t *s2)
        !            77: { 
        !            78:   int res = CompareStringW(
        !            79:         LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1); 
        !            80:   #ifdef _UNICODE
        !            81:   return ConvertCompareResult(res);
        !            82:   #else
        !            83:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !            84:     return ConvertCompareResult(res);
        !            85:   return MyStringCollate(UnicodeStringToMultiByte(s1), 
        !            86:         UnicodeStringToMultiByte(s2));
        !            87:   #endif
        !            88: }
        !            89: 
        !            90: #ifndef _WIN32_WCE
        !            91: int MyStringCollate(const char *s1, const char *s2)
        !            92: { 
        !            93:   return ConvertCompareResult(CompareStringA(
        !            94:     LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1)); 
        !            95: }
        !            96: 
        !            97: int MyStringCollateNoCase(const char *s1, const char *s2)
        !            98: { 
        !            99:   return ConvertCompareResult(CompareStringA(
        !           100:     LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1)); 
        !           101: }
        !           102: #endif
        !           103: 
        !           104: int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2)
        !           105: { 
        !           106:   int res = CompareStringW(
        !           107:         LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1); 
        !           108:   #ifdef _UNICODE
        !           109:   return ConvertCompareResult(res);
        !           110:   #else
        !           111:   if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
        !           112:     return ConvertCompareResult(res);
        !           113:   return MyStringCollateNoCase(UnicodeStringToMultiByte(s1), 
        !           114:       UnicodeStringToMultiByte(s2));
        !           115:   #endif
        !           116: }
        !           117: 
        !           118: #else
        !           119: 
        !           120: inline int NormalizeCompareResult(int res)
        !           121: {
        !           122:   if (res < 0) return -1;
        !           123:   if (res > 0) return 1;
        !           124:   return 0;
        !           125: }
        !           126: 
        !           127: /*
        !           128: inline wchar_t MyCharUpper(wchar_t c)
        !           129:   { return towupper(c); }
        !           130: */
        !           131: wchar_t MyCharUpper(wchar_t c)
        !           132: {
        !           133:   return toupper(c);
        !           134: }
        !           135: 
        !           136: int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2)
        !           137: { 
        !           138:   while (true)
        !           139:   {
        !           140:     wchar_t c1 = *s1++;
        !           141:     wchar_t c2 = *s2++;
        !           142:     wchar_t u1 = MyCharUpper(c1);
        !           143:     wchar_t u2 = MyCharUpper(c2);
        !           144: 
        !           145:     if (u1 < u2) return -1;
        !           146:     if (u1 > u2) return 1;
        !           147:     if (u1 == 0) return 0;
        !           148:   }
        !           149: }
        !           150: 
        !           151: #endif
        !           152: 
        !           153: int MyStringCompare(const char *s1, const char *s2)
        !           154: { 
        !           155:   while (true)
        !           156:   {
        !           157:     unsigned char c1 = (unsigned char)*s1++;
        !           158:     unsigned char c2 = (unsigned char)*s2++;
        !           159:     if (c1 < c2) return -1;
        !           160:     if (c1 > c2) return 1;
        !           161:     if (c1 == 0) return 0;
        !           162:   }
        !           163: }
        !           164: 
        !           165: int MyStringCompare(const wchar_t *s1, const wchar_t *s2)
        !           166: { 
        !           167:   while (true)
        !           168:   {
        !           169:     wchar_t c1 = *s1++;
        !           170:     wchar_t c2 = *s2++;
        !           171:     if (c1 < c2) return -1;
        !           172:     if (c1 > c2) return 1;
        !           173:     if (c1 == 0) return 0;
        !           174:   }
        !           175: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>