From a6836b9b97dc7d83627d7b3be40822f4bc4bcef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Fri, 6 Mar 2020 12:20:12 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@911 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- main.cpp | 14 ++++---- src_main/core/pichar.cpp | 55 +++++++++++++++++--------------- src_main/system/pisysteminfo.cpp | 2 +- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/main.cpp b/main.cpp index 5ed92458..355a48e7 100644 --- a/main.cpp +++ b/main.cpp @@ -3,19 +3,21 @@ int main() { //piCout << __sysoemname__; - /*const char * s = "Eng, Русский №!123"; + const char * s = "Eng, Русский №!123"; PIString str = PIString::fromUTF8(s); - piCout << str.size() << str; - str.forEach([](PIChar c){piCout << c; return c;}); + piCout << str; + piCout << str.toLowerCase(); + piCout << str.toUpperCase(); + /*str.forEach([](PIChar c){piCout << c; return c;}); PIFile f("1.txt", PIIODevice::ReadWrite); f.clear(); - f << str;*/ + f << str; PIChar c = PIChar::fromUTF8("│"); PIString s = PIString::fromUTF8("│"); piCout << c.unicode16Code() << s[0].unicode16Code(); - piCout << c << s; + piCout << c << s << PISystemInfo::machineKey(); PIFile f("1.txt", PIIODevice::ReadWrite); f.clear(); - f << c; + f << c;*/ return 0; } diff --git a/src_main/core/pichar.cpp b/src_main/core/pichar.cpp index f98e9b74..bd499804 100644 --- a/src_main/core/pichar.cpp +++ b/src_main/core/pichar.cpp @@ -29,6 +29,7 @@ #endif #ifdef WINDOWS # include +# include #endif char * __syslocname__ = 0; char * __sysoemname__ = 0; @@ -86,6 +87,20 @@ ushort charFromCodepage(const char * c, int size, const char * codepage, int * t } +int charCompare(const ushort * f, const ushort * s) { + return +#ifdef PIP_ICU + u_strCompare((const UChar*)f, 1, (const UChar*)s, 1, FALSE); +#else +# ifdef WINDOWS + CompareStringW(LOCALE_USER_DEFAULT, 0, (PCNZWCH)f, 1, (PCNZWCH)s, 1); +# else + strcmp((const char *)f, (const char *)s); +# endif +#endif +} + + PIChar::PIChar(const char * c, int * bytes) { ch = charFromCodepage(c, 4, __syslocname__, bytes); } @@ -120,42 +135,22 @@ bool PIChar::operator ==(const PIChar & o) const { bool PIChar::operator >(const PIChar & o) const { - return -#ifdef PIP_ICU - u_strCompare((const UChar*)&(ch), 1, (const UChar*)&(o.ch), 1, FALSE) > 0; -#else - strcmp(toCharPtr(), o.toCharPtr()) > 0; -#endif + return charCompare(&ch, &(o.ch)) > 0; } bool PIChar::operator <(const PIChar & o) const { - return -#ifdef PIP_ICU - u_strCompare((const UChar*)&(ch), 1, (const UChar*)&(o.ch), 1, FALSE) < 0; -#else - strcmp(toCharPtr(), o.toCharPtr()) < 0; -#endif + return charCompare(&ch, &(o.ch)) < 0; } bool PIChar::operator >=(const PIChar & o) const { - return -#ifdef PIP_ICU - u_strCompare((const UChar*)&(ch), 1, (const UChar*)&(o.ch), 1, FALSE) >= 0; -#else - strcmp(toCharPtr(), o.toCharPtr()) >= 0; -#endif + return charCompare(&ch, &(o.ch)) >= 0; } bool PIChar::operator <=(const PIChar & o) const { - return -#ifdef PIP_ICU - u_strCompare((const UChar*)&(ch), 1, (const UChar*)&(o.ch), 1, FALSE) <= 0; -#else - strcmp(toCharPtr(), o.toCharPtr()) <= 0; -#endif + return charCompare(&ch, &(o.ch)) <= 0; } @@ -269,26 +264,34 @@ char PIChar::toSystem() const { PIChar PIChar::toUpper() const { + if (isAscii()) return PIChar(toupper(ch)); #ifdef PIP_ICU UChar c(0); UErrorCode e((UErrorCode)0); u_strToUpper(&c, 1, (const UChar*)(&ch), 1, 0, &e); return PIChar(c); #else - return PIChar(toupper(ch)); + ushort wc = 0; + if (LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, (LPCWSTR)&ch, 1, (LPWSTR)&wc, 1) == 1) + return PIChar(wc); #endif + return PIChar(toupper(ch)); } PIChar PIChar::toLower() const { + if (isAscii()) return PIChar(tolower(ch)); #ifdef PIP_ICU UChar c(0); UErrorCode e((UErrorCode)0); u_strToLower(&c, 1, (const UChar*)(&ch), 1, 0, &e); return PIChar(c); #else - return PIChar(tolower(ch)); + ushort wc = 0; + if (LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, (LPCWSTR)&ch, 1, (LPWSTR)&wc, 1) == 1) + return PIChar(wc); #endif + return PIChar(tolower(ch)); } diff --git a/src_main/system/pisysteminfo.cpp b/src_main/system/pisysteminfo.cpp index 9c6ed8e1..c204e456 100644 --- a/src_main/system/pisysteminfo.cpp +++ b/src_main/system/pisysteminfo.cpp @@ -220,7 +220,7 @@ PIString confDir() { #ifdef WINDOWS PIDir::home().path() + "/AppData/Local" #elif defined(ANDROID) - "/mnt/sdcard" + "" #else PIDir::home().path() + "/.config" #endif