lbry-android/p4a/pythonforandroid/recipes/python3/patches/python-3.4.2-android-locale.patch
Akinwale Ariwodola 744cfaebc2 Initial commit
2017-08-13 02:24:00 +01:00

255 lines
8.6 KiB
Diff

diff -ru Python-3.3.5/Modules/Setup.dist Python-3.3.5-android/Modules/Setup.dist
--- Python-3.3.5/Modules/Setup.dist 2014-03-09 09:40:23.000000000 +0100
+++ Python-3.3.5-android/Modules/Setup.dist 2014-08-04 22:16:29.000000000 +0200
@@ -118,7 +118,7 @@
itertools itertoolsmodule.c # Functions creating iterators for efficient looping
# access to ISO C locale support
-_locale _localemodule.c # -lintl
+#_locale _localemodule.c # -lintl
# Standard I/O baseline
_io -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c
diff -ru Python-3.3.5/Modules/_decimal/libmpdec/io.c Python-3.3.5-android/Modules/_decimal/libmpdec/io.c
--- Python-3.3.5/Modules/_decimal/libmpdec/io.c 2014-03-09 09:40:25.000000000 +0100
+++ Python-3.3.5-android/Modules/_decimal/libmpdec/io.c 2014-08-04 22:16:29.000000000 +0200
@@ -868,10 +868,17 @@
}
spec->type = *cp++;
spec->type = (spec->type == 'N') ? 'G' : 'g';
+#ifdef __ANDROID__
+ spec->dot = ".";
+ spec->sep = ",";
+ spec->grouping = "\3";
+#else
lc = localeconv();
spec->dot = lc->decimal_point;
spec->sep = lc->thousands_sep;
spec->grouping = lc->grouping;
+#endif
+
if (mpd_validate_lconv(spec) < 0) {
return 0; /* GCOV_NOT_REACHED */
}
diff -ru Python-3.3.5/Modules/_localemodule.c Python-3.3.5-android/Modules/_localemodule.c
--- Python-3.3.5/Modules/_localemodule.c 2014-03-09 09:40:26.000000000 +0100
+++ Python-3.3.5-android/Modules/_localemodule.c 2014-08-04 22:16:29.000000000 +0200
@@ -38,6 +38,13 @@
#include <windows.h>
#endif
+#if __ANDROID__
+/* Android's locale support is pretty much unusable, it's better to have the
+ higher-level module fall back to C locale emulation. */
+#error "Android's locale support is too incomplete to create a usable module."
+#endif
+
+
PyDoc_STRVAR(locale__doc__, "Support for POSIX locales.");
static PyObject *Error;
@@ -141,6 +148,11 @@
if (!result)
return NULL;
+#ifdef __ANDROID__
+ /* Don't even try on Android's broken locale.h. */
+ goto failed;
+#else
+
/* if LC_NUMERIC is different in the C library, use saved value */
l = localeconv();
@@ -189,6 +201,7 @@
RESULT_INT(p_sign_posn);
RESULT_INT(n_sign_posn);
return result;
+#endif // __ANDROID__
failed:
Py_XDECREF(result);
diff -ru Python-3.3.5/Modules/main.c Python-3.3.5-android/Modules/main.c
--- Python-3.3.5/Modules/main.c 2014-03-09 09:40:27.000000000 +0100
+++ Python-3.3.5-android/Modules/main.c 2014-08-04 22:16:29.000000000 +0200
@@ -522,7 +522,7 @@
oldloc = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, "");
for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__ANDROID__)
/* Use utf-8 on Mac OS X */
unicode = PyUnicode_FromString(p);
#else
diff -ru Python-3.3.5/Objects/unicodeobject.c Python-3.3.5-android/Objects/unicodeobject.c
--- Python-3.3.5/Objects/unicodeobject.c 2014-03-09 09:40:30.000000000 +0100
+++ Python-3.3.5-android/Objects/unicodeobject.c 2014-08-04 22:16:29.000000000 +0200
@@ -3295,13 +3295,22 @@
static int
locale_error_handler(const char *errors, int *surrogateescape)
{
+
if (errors == NULL) {
+#ifdef __ANDROID__
+ *surrogateescape = 1;
+#else
*surrogateescape = 0;
+#endif
return 0;
}
if (strcmp(errors, "strict") == 0) {
+#ifdef __ANDROID__
+ *surrogateescape = 1;
+#else
*surrogateescape = 0;
+#endif
return 0;
}
if (strcmp(errors, "surrogateescape") == 0) {
@@ -3429,7 +3438,7 @@
{
#ifdef HAVE_MBCS
return PyUnicode_EncodeCodePage(CP_ACP, unicode, NULL);
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) || defined(__ANDROID__)
return _PyUnicode_AsUTF8String(unicode, "surrogateescape");
#else
PyInterpreterState *interp = PyThreadState_GET()->interp;
@@ -3709,7 +3718,7 @@
{
#ifdef HAVE_MBCS
return PyUnicode_DecodeMBCS(s, size, NULL);
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) || defined(__ANDROID__)
return PyUnicode_DecodeUTF8Stateful(s, size, "surrogateescape", NULL);
#else
PyInterpreterState *interp = PyThreadState_GET()->interp;
@@ -4835,7 +4844,7 @@
return NULL;
}
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__ANDROID__)
/* Simplified UTF-8 decoder using surrogateescape error handler,
used to decode the command line arguments on Mac OS X.
diff -ru Python-3.3.5/Python/bltinmodule.c Python-3.3.5-android/Python/bltinmodule.c
--- Python-3.3.5/Python/bltinmodule.c 2014-03-09 09:40:32.000000000 +0100
+++ Python-3.3.5-android/Python/bltinmodule.c 2014-08-04 22:16:29.000000000 +0200
@@ -24,7 +24,7 @@
#ifdef HAVE_MBCS
const char *Py_FileSystemDefaultEncoding = "mbcs";
int Py_HasFileSystemDefaultEncoding = 1;
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) || defined(__ANDROID__)
const char *Py_FileSystemDefaultEncoding = "utf-8";
int Py_HasFileSystemDefaultEncoding = 1;
#else
diff -ru Python-3.3.5/Python/fileutils.c Python-3.3.5-android/Python/fileutils.c
--- Python-3.3.5/Python/fileutils.c 2014-03-09 09:40:32.000000000 +0100
+++ Python-3.3.5-android/Python/fileutils.c 2014-08-04 22:16:29.000000000 +0200
@@ -10,7 +10,7 @@
#include <langinfo.h>
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__ANDROID__)
extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size);
#endif
@@ -44,7 +44,7 @@
Py_RETURN_NONE;
}
-#if !defined(__APPLE__) && !defined(MS_WINDOWS)
+#if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(MS_WINDOWS)
extern int _Py_normalize_encoding(const char *, char *, size_t);
/* Workaround FreeBSD and OpenIndiana locale encoding issue with the C locale.
@@ -194,7 +194,7 @@
}
#endif /* !defined(__APPLE__) && !defined(MS_WINDOWS) */
-#if !defined(__APPLE__) && (!defined(MS_WINDOWS) || !defined(HAVE_MBRTOWC))
+#if !defined(__APPLE__) && !defined(__ANDROID__) && (!defined(MS_WINDOWS) || !defined(HAVE_MBRTOWC))
static wchar_t*
decode_ascii_surrogateescape(const char *arg, size_t *size)
{
@@ -241,7 +241,7 @@
wchar_t*
_Py_char2wchar(const char* arg, size_t *size)
{
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__ANDROID__)
wchar_t *wstr;
wstr = _Py_DecodeUTF8_surrogateescape(arg, strlen(arg));
if (size != NULL) {
@@ -384,7 +384,7 @@
char*
_Py_wchar2char(const wchar_t *text, size_t *error_pos)
{
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__ANDROID__)
Py_ssize_t len;
PyObject *unicode, *bytes = NULL;
char *cpath;
diff -ru Python-3.3.5/Python/formatter_unicode.c Python-3.3.5-android/Python/formatter_unicode.c
--- Python-3.3.5/Python/formatter_unicode.c 2014-03-09 09:40:32.000000000 +0100
+++ Python-3.3.5-android/Python/formatter_unicode.c 2014-08-04 22:16:29.000000000 +0200
@@ -665,6 +665,7 @@
{
switch (type) {
case LT_CURRENT_LOCALE: {
+#ifndef __ANDROID__
struct lconv *locale_data = localeconv();
locale_info->decimal_point = PyUnicode_DecodeLocale(
locale_data->decimal_point,
@@ -680,6 +681,7 @@
}
locale_info->grouping = locale_data->grouping;
break;
+#endif // __ANDROID__
}
case LT_DEFAULT_LOCALE:
locale_info->decimal_point = PyUnicode_FromOrdinal('.');
diff -ru Python-3.3.5/Python/pystrtod.c Python-3.3.5-android/Python/pystrtod.c
--- Python-3.3.5/Python/pystrtod.c 2014-03-09 09:40:33.000000000 +0100
+++ Python-3.3.5-android/Python/pystrtod.c 2014-08-04 22:16:29.000000000 +0200
@@ -177,8 +177,12 @@
fail_pos = NULL;
+#ifdef __ANDROID__
+ decimal_point = ".";
+#else
locale_data = localeconv();
decimal_point = locale_data->decimal_point;
+#endif
decimal_point_len = strlen(decimal_point);
assert(decimal_point_len != 0);
@@ -378,8 +382,12 @@
Py_LOCAL_INLINE(void)
change_decimal_from_locale_to_dot(char* buffer)
{
+#ifdef __ANDROID__
+ const char *decimal_point = ".";
+#else
struct lconv *locale_data = localeconv();
const char *decimal_point = locale_data->decimal_point;
+#endif
if (decimal_point[0] != '.' || decimal_point[1] != 0) {
size_t decimal_point_len = strlen(decimal_point);
diff -ru Python-3.3.5/Python/pythonrun.c Python-3.3.5-android/Python/pythonrun.c
--- Python-3.3.5/Python/pythonrun.c 2014-03-09 09:40:33.000000000 +0100
+++ Python-3.3.5-android/Python/pythonrun.c 2014-08-04 22:16:29.000000000 +0200
@@ -188,6 +188,8 @@
return NULL;
}
return get_codec_name(codeset);
+#elif __ANDROID__
+ return get_codec_name("UTF-8");
#else
PyErr_SetNone(PyExc_NotImplementedError);
return NULL;