// Common/String.cpp #include "StdAfx.h" #include #ifdef ENV_HAVE_WCTYPE_H #include #endif #include "StringConvert.h" // FIXED #include "MyString.h" // FIXED to avoid confusion with on some filesystems #include #include #ifdef ENV_HAVE_WCHAR__H #include #endif #include #ifndef MB_LEN_MAX #define MB_LEN_MAX 1024 #endif #include "myPrivate.h" LPSTR WINAPI CharPrevA( LPCSTR start, LPCSTR ptr ) { // OK for MBS while (*start && (start < ptr)) { LPCSTR next = CharNextA( start ); if (next >= ptr) break; start = next; } return (LPSTR)start; } LPSTR WINAPI CharNextA( LPCSTR ptr ) { if (!*ptr) return (LPSTR)ptr; // #ifdef ENV_HAVE_MBRTOWC // if (global_use_utf16_conversion) // { // wchar_t wc; // size_t len = mbrtowc(&wc,ptr,MB_LEN_MAX,0); // mbrtowc stales on some configurations. // if (len >= 1) return (LPSTR)(ptr + len); // printf("INTERNAL ERROR - CharNextA\n"); // exit(EXIT_FAILURE); // } else { // return (LPSTR)(ptr + 1); // } //#else return (LPSTR)(ptr + 1); // p7zip search only for ASCII characters like '/' so no need to worry about current locale //#endif } char MyCharLower(char c) { int r = c & 0xFF; return tolower(r); } wchar_t MyCharLower(wchar_t c) { #ifdef ENV_HAVE_TOWUPPER return towlower(c); #else int ret = c; if ((ret >= 1) && (ret <256)) ret = tolower(ret); return (wchar_t)ret; #endif } char * MyStringLower(char *s) { if (s == 0) return 0; char *ret = s; while (*s) { *s = MyCharLower(*s); s++; } return ret; } wchar_t * MyStringLower(wchar_t *s) { if (s == 0) return 0; wchar_t *ret = s; while (*s) { *s = MyCharLower(*s); s++; } return ret; } wchar_t MyCharUpper(wchar_t c) { #ifdef ENV_HAVE_TOWUPPER return towupper(c); #else int ret = c; if ((ret >= 1) && (ret <256)) ret = toupper(ret); return (wchar_t)ret; #endif } wchar_t * MyStringUpper(wchar_t *s) { if (s == 0) return 0; wchar_t *ret = s; while (*s) { *s = MyCharUpper(*s); s++; } return ret; } int MyStringCompare(const char *s1, const char *s2) { while (true) { unsigned char c1 = (unsigned char)*s1++; unsigned char c2 = (unsigned char)*s2++; if (c1 < c2) return -1; if (c1 > c2) return 1; if (c1 == 0) return 0; } } int MyStringCompare(const wchar_t *s1, const wchar_t *s2) { while (true) { wchar_t c1 = *s1++; wchar_t c2 = *s2++; if (c1 < c2) return -1; if (c1 > c2) return 1; if (c1 == 0) return 0; } } int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) { while (true) { wchar_t c1 = *s1++; wchar_t c2 = *s2++; if (c1 != c2) { wchar_t u1 = MyCharUpper(c1); wchar_t u2 = MyCharUpper(c2); if (u1 < u2) return -1; if (u1 > u2) return 1; } if (c1 == 0) return 0; } } int MyStringCompareNoCase(const char *s1, const char *s2) { return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2)); } #ifndef ENV_HAVE_WCHAR__H EXTERN_C_BEGIN size_t wcslen(const wchar_t *s) { register const wchar_t *p; for (p=s ; *p ; p++) {} return p - s; } wchar_t *wcscpy(wchar_t * s1, const wchar_t * s2) { register wchar_t *s = s1; while ( (*s++ = *s2++) != 0 ) {} return s1; } wchar_t *wcscat(wchar_t * s1, const wchar_t * s2) { register wchar_t *s = s1; while (*s++) {} --s; while ((*s++ = *s2++) != 0) {} return s1; } EXTERN_C_END #endif