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>