Android: fix cyrillic characters, update iconv lib (#9117)

This commit is contained in:
Maksim 2020-01-13 07:10:15 +01:00 committed by Loïc Blot
parent 8d75c118d9
commit c396800629
4 changed files with 19 additions and 161 deletions

@ -112,7 +112,7 @@ FREETYPE_TIMESTAMP = $(FREETYPE_DIR)timestamp
FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp
FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
ICONV_VERSION = 1.14 ICONV_VERSION = 1.16
ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/ ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/
ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so
ICONV_TIMESTAMP = $(ICONV_DIR)timestamp ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
@ -445,9 +445,6 @@ iconv_download :
tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \ tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \
rm libiconv-${ICONV_VERSION}.tar.gz; \ rm libiconv-${ICONV_VERSION}.tar.gz; \
ln -s libiconv-${ICONV_VERSION} libiconv; \ ln -s libiconv-${ICONV_VERSION} libiconv; \
cd ${ICONV_DIR}; \
patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch; \
patch -p1 < ${ANDR_ROOT}/patches/libiconv_stdio.patch; \
fi fi
iconv : $(ICONV_LIB) iconv : $(ICONV_LIB)

@ -1,39 +0,0 @@
--- a/libcharset/lib/localcharset.c 2015-06-10 11:55:25.933870724 +0200
+++ b/libcharset/lib/localcharset.c 2015-06-10 11:55:39.578063493 +0200
@@ -47,7 +47,7 @@
#if !defined WIN32_NATIVE
# include <unistd.h>
-# if HAVE_LANGINFO_CODESET
+# if HAVE_LANGINFO_CODESET && !(defined __ANDROID__)
# include <langinfo.h>
# else
# if 0 /* see comment below */
@@ -124,7 +124,7 @@ get_charset_aliases (void)
cp = charset_aliases;
if (cp == NULL)
{
-#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__ || defined __ANDROID__)
const char *dir;
const char *base = "charset.alias";
char *file_name;
@@ -338,6 +338,9 @@ get_charset_aliases (void)
"CP54936" "\0" "GB18030" "\0"
"CP65001" "\0" "UTF-8" "\0";
# endif
+# if defined __ANDROID__
+ cp = "*" "\0" "UTF-8" "\0";
+# endif
#endif
charset_aliases = cp;
@@ -361,7 +364,7 @@ locale_charset (void)
const char *codeset;
const char *aliases;
-#if !(defined WIN32_NATIVE || defined OS2)
+#if !(defined WIN32_NATIVE || defined OS2 || defined __ANDROID__)
# if HAVE_LANGINFO_CODESET

@ -1,13 +0,0 @@
--- a/srclib/stdio.in.h 2011-08-07 15:42:06.000000000 +0200
+++ b/srclib/stdio.in.h 2015-06-10 09:27:58.129056262 +0200
@@ -695,8 +696,9 @@ _GL_CXXALIASWARN (gets);
/* It is very rare that the developer ever has full control of stdin,
so any use of gets warrants an unconditional warning. Assume it is
always declared, since it is required by C89. */
-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/
+#define gets(a) fgets( a, sizeof(*(a)), stdin)
#endif
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@

@ -79,6 +79,13 @@ bool convert(const char *to, const char *from, char *outbuf,
return true; return true;
} }
#ifdef __ANDROID__
// Android need manual caring to support the full character set possible with wchar_t
const char *DEFAULT_ENCODING = "UTF-32LE";
#else
const char *DEFAULT_ENCODING = "WCHAR_T";
#endif
std::wstring utf8_to_wide(const std::string &input) std::wstring utf8_to_wide(const std::string &input)
{ {
size_t inbuf_size = input.length() + 1; size_t inbuf_size = input.length() + 1;
@ -90,7 +97,12 @@ std::wstring utf8_to_wide(const std::string &input)
char *outbuf = new char[outbuf_size]; char *outbuf = new char[outbuf_size];
memset(outbuf, 0, outbuf_size); memset(outbuf, 0, outbuf_size);
if (!convert("WCHAR_T", "UTF-8", outbuf, outbuf_size, inbuf, inbuf_size)) { #ifdef __ANDROID__
// Android need manual caring to support the full character set possible with wchar_t
SANITY_CHECK(sizeof(wchar_t) == 4);
#endif
if (!convert(DEFAULT_ENCODING, "UTF-8", outbuf, outbuf_size, inbuf, inbuf_size)) {
infostream << "Couldn't convert UTF-8 string 0x" << hex_encode(input) infostream << "Couldn't convert UTF-8 string 0x" << hex_encode(input)
<< " into wstring" << std::endl; << " into wstring" << std::endl;
delete[] inbuf; delete[] inbuf;
@ -105,13 +117,6 @@ std::wstring utf8_to_wide(const std::string &input)
return out; return out;
} }
#ifdef __ANDROID__
// TODO: this is an ugly fix for wide_to_utf8 somehow not working on android
std::string wide_to_utf8(const std::wstring &input)
{
return wide_to_narrow(input);
}
#else
std::string wide_to_utf8(const std::wstring &input) std::string wide_to_utf8(const std::wstring &input)
{ {
size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t); size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t);
@ -123,7 +128,7 @@ std::string wide_to_utf8(const std::wstring &input)
char *outbuf = new char[outbuf_size]; char *outbuf = new char[outbuf_size];
memset(outbuf, 0, outbuf_size); memset(outbuf, 0, outbuf_size);
if (!convert("UTF-8", "WCHAR_T", outbuf, outbuf_size, inbuf, inbuf_size)) { if (!convert("UTF-8", DEFAULT_ENCODING, outbuf, outbuf_size, inbuf, inbuf_size)) {
infostream << "Couldn't convert wstring 0x" << hex_encode(inbuf, inbuf_size) infostream << "Couldn't convert wstring 0x" << hex_encode(inbuf, inbuf_size)
<< " into UTF-8 string" << std::endl; << " into UTF-8 string" << std::endl;
delete[] inbuf; delete[] inbuf;
@ -138,7 +143,6 @@ std::string wide_to_utf8(const std::wstring &input)
return out; return out;
} }
#endif
#else // _WIN32 #else // _WIN32
std::wstring utf8_to_wide(const std::string &input) std::wstring utf8_to_wide(const std::string &input)
@ -183,7 +187,7 @@ wchar_t *utf8_to_wide_c(const char *str)
// The returned string is allocated using new // The returned string is allocated using new
wchar_t *narrow_to_wide_c(const char *str) wchar_t *narrow_to_wide_c(const char *str)
{ {
wchar_t *nstr = NULL; wchar_t *nstr = nullptr;
#if defined(_WIN32) #if defined(_WIN32)
int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, 0, 0); int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, 0, 0);
if (nResult == 0) { if (nResult == 0) {
@ -204,67 +208,8 @@ wchar_t *narrow_to_wide_c(const char *str)
return nstr; return nstr;
} }
#ifdef __ANDROID__
const wchar_t* wide_chars =
L" !\"#$%&'()*+,-./0123456789:;<=>?@"
L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`"
L"abcdefghijklmnopqrstuvwxyz{|}~";
int wctomb(char *s, wchar_t wc)
{
for (unsigned int j = 0; j < (sizeof(wide_chars)/sizeof(wchar_t));j++) {
if (wc == wide_chars[j]) {
*s = (char) (j+32);
return 1;
}
else if (wc == L'\n') {
*s = '\n';
return 1;
}
}
return -1;
}
int mbtowc(wchar_t *pwc, const char *s, size_t n)
{
std::wstring intermediate = narrow_to_wide(s);
if (intermediate.length() > 0) {
*pwc = intermediate[0];
return 1;
}
else {
return -1;
}
}
std::wstring narrow_to_wide(const std::string &mbs) { std::wstring narrow_to_wide(const std::string &mbs) {
size_t wcl = mbs.size(); size_t wcl = mbs.size();
std::wstring retval = L"";
for (unsigned int i = 0; i < wcl; i++) {
if (((unsigned char) mbs[i] >31) &&
((unsigned char) mbs[i] < 127)) {
retval += wide_chars[(unsigned char) mbs[i] -32];
}
//handle newline
else if (mbs[i] == '\n') {
retval += L'\n';
}
}
return retval;
}
#else // not Android
std::wstring narrow_to_wide(const std::string &mbs)
{
size_t wcl = mbs.size();
Buffer<wchar_t> wcs(wcl + 1); Buffer<wchar_t> wcs(wcl + 1);
size_t len = mbstowcs(*wcs, mbs.c_str(), wcl); size_t len = mbstowcs(*wcs, mbs.c_str(), wcl);
if (len == (size_t)(-1)) if (len == (size_t)(-1))
@ -273,37 +218,6 @@ std::wstring narrow_to_wide(const std::string &mbs)
return *wcs; return *wcs;
} }
#endif
#ifdef __ANDROID__
std::string wide_to_narrow(const std::wstring &wcs) {
size_t mbl = wcs.size()*4;
std::string retval = "";
for (unsigned int i = 0; i < wcs.size(); i++) {
wchar_t char1 = (wchar_t) wcs[i];
if (char1 == L'\n') {
retval += '\n';
continue;
}
for (unsigned int j = 0; j < wcslen(wide_chars);j++) {
wchar_t char2 = (wchar_t) wide_chars[j];
if (char1 == char2) {
char toadd = (j+32);
retval += toadd;
break;
}
}
}
return retval;
}
#else // not Android
std::string wide_to_narrow(const std::wstring &wcs) std::string wide_to_narrow(const std::wstring &wcs)
{ {
@ -317,7 +231,6 @@ std::string wide_to_narrow(const std::wstring &wcs)
return *mbs; return *mbs;
} }
#endif
std::string urlencode(const std::string &str) std::string urlencode(const std::string &str)
{ {
@ -361,10 +274,10 @@ u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask)
u32 mask = 0; u32 mask = 0;
char *s = &str[0]; char *s = &str[0];
char *flagstr; char *flagstr;
char *strpos = NULL; char *strpos = nullptr;
while ((flagstr = strtok_r(s, ",", &strpos))) { while ((flagstr = strtok_r(s, ",", &strpos))) {
s = NULL; s = nullptr;
while (*flagstr == ' ' || *flagstr == '\t') while (*flagstr == ' ' || *flagstr == '\t')
flagstr++; flagstr++;
@ -436,7 +349,7 @@ char *mystrtok_r(char *s, const char *sep, char **lasts)
s++; s++;
if (!*s) if (!*s)
return NULL; return nullptr;
t = s; t = s;
while (*t) { while (*t) {