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
MyCharUpper(wchar_t c)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
MyCharLower(wchar_t c)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
MyStringUpper(wchar_t * s)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
MyStringLower(wchar_t * s)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 UNDER_CE
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
MyCharUpper(wchar_t c)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
MyStringCompare(const char * s1,const char * s2)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
MyStringCompare(const wchar_t * s1,const wchar_t * s2)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
MyStringCompareNoCase(const wchar_t * s1,const wchar_t * s2)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), MultiByteToUnicodeString(s2));
199 }
200 */
201