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