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 |