Author: rfm
Date: Sat Apr 9 07:49:16 2016
New Revision: 39655
URL: http://svn.gna.org/viewcvs/gnustep?rev=39655&view=rev
Log:
Locale fixups
Modified:
libs/base/trunk/Source/Additions/Unicode.m
libs/base/trunk/Source/GSPrivate.h
Modified: libs/base/trunk/Source/Additions/Unicode.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/Additions/Unicode.m?rev=39655&r1=39654&r2=39655&view=diff
==============================================================================
--- libs/base/trunk/Source/Additions/Unicode.m (original)
+++ libs/base/trunk/Source/Additions/Unicode.m Sat Apr 9 07:49:16 2016
@@ -143,6 +143,7 @@
typedef unsigned char unc;
static NSStringEncoding defEnc = GSUndefinedEncoding;
static NSStringEncoding natEnc = GSUndefinedEncoding;
+static NSStringEncoding icuEnc = GSUndefinedEncoding;
static NSStringEncoding *_availableEncodings = 0;
struct _strenc_ {
@@ -2376,14 +2377,133 @@
}
NSStringEncoding
+GSPrivateCStringEncoding(const char *encoding)
+{
+ NSStringEncoding enc = GSUndefinedEncoding;
+
+ if (0 != encoding)
+ {
+ GSSetupEncodingTable();
+
+ if (strcmp(encoding, "ANSI_X3.4-1968") == 0 /* glibc */
+ || strcmp(encoding, "ISO_646.IRV:1983") == 0 /* glibc */
+ || strcmp(encoding, "646") == 0 /* Solaris NetBSD */)
+ enc = NSISOLatin1StringEncoding;
+ else if (strcmp(encoding, "EUC-JP") == 0 /* glibc */
+ /* HP-UX IRIX OSF/1 Solaris NetBSD */
+ || strcmp(encoding, "eucJP") == 0
+ || strcmp(encoding, "IBM-eucJP") == 0 /* AIX */)
+ enc = NSJapaneseEUCStringEncoding;
+ else if (strcmp(encoding, "UTF-8") == 0 /* glibc AIX OSF/1 Solaris */
+ || strcmp(encoding, "utf8") == 0 /* HP-UX */)
+ enc = NSUTF8StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-1") == 0 /* glibc */
+ /* AIX IRIX OSF/1 Solaris NetBSD */
+ || strcmp(encoding, "ISO8859-1") == 0
+ || strcmp(encoding, "iso88591") == 0 /* HP-UX */)
+ enc = NSISOLatin1StringEncoding;
+ else if (strcmp(encoding, "IBM-932") == 0 /* AIX */
+ || strcmp(encoding, "SJIS") == 0 /* HP-UX OSF/1 NetBSD */
+ || strcmp(encoding, "PCK") == 0 /* Solaris */)
+ enc = NSShiftJISStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-2") == 0 /* glibc */
+ /* AIX IRIX OSF/1 Solaris NetBSD */
+ || strcmp(encoding, "ISO8859-2") == 0
+ || strcmp(encoding, "iso88592") == 0 /* HP-UX */)
+ enc = NSISOLatin2StringEncoding;
+ else if (strcmp(encoding, "CP1251") == 0 /* glibc */
+ || strcmp(encoding, "ansi-1251") == 0 /* Solaris */)
+ enc = NSWindowsCP1251StringEncoding;
+ else if (strcmp(encoding, "CP1252") == 0 /* */
+ || strcmp(encoding, "IBM-1252") == 0 /* AIX */)
+ enc = NSWindowsCP1252StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-5") == 0 /* glibc */
+ /* AIX IRIX OSF/1 Solaris NetBSD */
+ || strcmp(encoding, "ISO8859-5") == 0
+ || strcmp(encoding, "iso88595") == 0 /* HP-UX */)
+ enc = NSISOCyrillicStringEncoding;
+ else if (strcmp(encoding, "KOI8-R") == 0 /* glibc */
+ || strcmp(encoding, "koi8-r") == 0 /* Solaris */)
+ enc = NSKOI8RStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-3") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-3") == 0 /* Solaris */)
+ enc = NSISOLatin3StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-4") == 0 /* */
+ || strcmp(encoding, "ISO8859-4") == 0 /* OSF/1 Solaris NetBSD */)
+ enc = NSISOLatin4StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-6") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-6") == 0 /* AIX Solaris */
+ || strcmp(encoding, "iso88596") == 0 /* HP-UX */)
+ enc = NSISOArabicStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-7") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-7") == 0 /* AIX IRIX OSF/1 Solaris */
+ || strcmp(encoding, "iso88597") == 0 /* HP-UX */)
+ enc = NSISOGreekStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-8") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-8") == 0 /* AIX OSF/1 Solaris */
+ || strcmp(encoding, "iso88598") == 0 /* HP-UX */)
+ enc = NSISOHebrewStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-9") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-9") == 0 /* AIX IRIX OSF/1 Solaris */
+ || strcmp(encoding, "iso88599") == 0 /* HP-UX */)
+ enc = NSISOLatin5StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-10") == 0 /* */
+ || strcmp(encoding, "ISO8859-10") == 0 /* */)
+ enc = NSISOLatin6StringEncoding;
+ else if (strcmp(encoding, "TIS-620") == 0 /* glibc AIX */
+ || strcmp(encoding, "tis620") == 0 /* HP-UX */
+ || strcmp(encoding, "TIS620.2533") == 0 /* Solaris */
+ || strcmp(encoding, "TACTIS") == 0 /* OSF/1 */)
+ enc = NSISOThaiStringEncoding;
+ else if (strcmp(encoding, "ISO-8859-13") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-13") == 0 /* */
+ || strcmp(encoding, "IBM-921") == 0 /* AIX */)
+ enc = NSISOLatin7StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-14") == 0 /* glibc */
+ || strcmp(encoding, "ISO8859-14") == 0 /* */)
+ enc = NSISOLatin8StringEncoding;
+ else if (strcmp(encoding, "ISO-8859-15") == 0 /* glibc */
+ /* AIX OSF/1 Solaris NetBSD */
+ || strcmp(encoding, "ISO8859-15") == 0
+ || strcmp(encoding, "iso885915") == 0 /* HP-UX */)
+ enc = NSISOLatin9StringEncoding;
+ else if (strcmp(encoding, "GB2312") == 0 /* glibc */
+ || strcmp(encoding, "gb2312") == 0 /* Solaris */
+ || strcmp(encoding, "eucCN") == 0 /* IRIX NetBSD */
+ || strcmp(encoding, "IBM-eucCN") == 0 /* AIX */
+ || strcmp(encoding, "hp15CN") == 0 /* HP-UX */)
+ enc = NSGB2312StringEncoding;
+ else if (strcmp(encoding, "BIG5") == 0 /* glibc Solaris NetBSD */
+ || strcmp(encoding, "big5") == 0 /* AIX HP-UX OSF/1 */)
+ enc = NSBIG5StringEncoding;
+ else if (strcmp(encoding, "EUC-KR") == 0 /* glibc */
+ || strcmp(encoding, "eucKR") == 0 /* HP-UX IRIX OSF/1 NetBSD */
+ || strcmp(encoding, "IBM-eucKR") == 0 /* AIX */
+ || strcmp(encoding, "5601") == 0 /* Solaris */)
+ enc = NSKoreanEUCStringEncoding;
+ }
+
+ if (enc == GSUndefinedEncoding)
+ {
+ enc = NSISOLatin1StringEncoding;
+ }
+ else if (GSPrivateIsEncodingSupported(enc) == NO)
+ {
+ fprintf(stderr, "WARNING: %s - encoding not implemented as "
+ "c string encoding.\n", encoding);
+ fprintf(stderr, " NSISOLatin1StringEncoding used instead.\n");
+ enc = NSISOLatin1StringEncoding;
+ }
+
+ return enc;
+}
+
+NSStringEncoding
GSPrivateDefaultCStringEncoding()
{
if (defEnc == GSUndefinedEncoding)
{
const char *encoding = 0;
-#if HAVE_LANGINFO_CODESET
- char encbuf[BUFSIZ];
-#endif
unsigned int count;
GSSetupEncodingTable();
@@ -2394,150 +2514,6 @@
[local_lock unlock];
return defEnc;
}
-
- if (natEnc == GSUndefinedEncoding)
- {
- /* Encoding not set */
-#if HAVE_UNICODE_UCNV_H
-
- const char *defaultName;
- UErrorCode err = U_ZERO_ERROR;
-
- defaultName = ucnv_getDefaultName ();
- encoding = ucnv_getStandardName (defaultName, "MIME", &err);
- if (0 == encoding)
- {
- encoding = ucnv_getStandardName (defaultName, "IANA", &err);
- }
-#endif
-#if HAVE_LANGINFO_CODESET
- if (0 == encoding)
- {
- char *old;
- /* Take it from the system locale information. */
- [gnustep_global_lock lock];
- /* Initialise locale system by setting current locale from
- * environment and then resetting it. Must be done before
- * any call to nl_langinfo()
- */
- if (0 != (old = setlocale(LC_CTYPE, "")))
- {
- setlocale(LC_CTYPE, old);
- }
- strncpy(encbuf, nl_langinfo(CODESET), sizeof(encbuf)-1);
- encbuf[sizeof(encbuf)-1] = '\0';
- [gnustep_global_lock unlock];
- encoding = encbuf;
- }
-#endif
-
- if (0 != encoding)
- {
- /*
- * First handle the fallback response from nl_langinfo() ...
- * if we are getting the default value we can't assume that
- * the user has set anything up at all, so we must use the
- * OpenStep/GNUstep default encoding ... latin1, even though
- * the nl_langinfo() stuff would say default is ascii.
- */
- if (strcmp(encoding, "ANSI_X3.4-1968") == 0 /* glibc */
- || strcmp(encoding, "ISO_646.IRV:1983") == 0 /* glibc */
- || strcmp(encoding, "646") == 0 /* Solaris NetBSD */)
- natEnc = NSISOLatin1StringEncoding;
- else if (strcmp(encoding, "EUC-JP") == 0 /* glibc */
- /* HP-UX IRIX OSF/1 Solaris NetBSD */
- || strcmp(encoding, "eucJP") == 0
- || strcmp(encoding, "IBM-eucJP") == 0 /* AIX */)
- natEnc = NSJapaneseEUCStringEncoding;
- else if (strcmp(encoding, "UTF-8") == 0 /* glibc AIX OSF/1
Solaris */
- || strcmp(encoding, "utf8") == 0 /* HP-UX */)
- natEnc = NSUTF8StringEncoding;
- else if (strcmp(encoding, "ISO-8859-1") == 0 /* glibc */
- /* AIX IRIX OSF/1 Solaris NetBSD */
- || strcmp(encoding, "ISO8859-1") == 0
- || strcmp(encoding, "iso88591") == 0 /* HP-UX */)
- natEnc = NSISOLatin1StringEncoding;
- else if (strcmp(encoding, "IBM-932") == 0 /* AIX */
- || strcmp(encoding, "SJIS") == 0 /* HP-UX OSF/1 NetBSD */
- || strcmp(encoding, "PCK") == 0 /* Solaris */)
- natEnc = NSShiftJISStringEncoding;
- else if (strcmp(encoding, "ISO-8859-2") == 0 /* glibc */
- /* AIX IRIX OSF/1 Solaris NetBSD */
- || strcmp(encoding, "ISO8859-2") == 0
- || strcmp(encoding, "iso88592") == 0 /* HP-UX */)
- natEnc = NSISOLatin2StringEncoding;
- else if (strcmp(encoding, "CP1251") == 0 /* glibc */
- || strcmp(encoding, "ansi-1251") == 0 /* Solaris */)
- natEnc = NSWindowsCP1251StringEncoding;
- else if (strcmp(encoding, "CP1252") == 0 /* */
- || strcmp(encoding, "IBM-1252") == 0 /* AIX */)
- natEnc = NSWindowsCP1252StringEncoding;
- else if (strcmp(encoding, "ISO-8859-5") == 0 /* glibc */
- /* AIX IRIX OSF/1 Solaris NetBSD */
- || strcmp(encoding, "ISO8859-5") == 0
- || strcmp(encoding, "iso88595") == 0 /* HP-UX */)
- natEnc = NSISOCyrillicStringEncoding;
- else if (strcmp(encoding, "KOI8-R") == 0 /* glibc */
- || strcmp(encoding, "koi8-r") == 0 /* Solaris */)
- natEnc = NSKOI8RStringEncoding;
- else if (strcmp(encoding, "ISO-8859-3") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-3") == 0 /* Solaris */)
- natEnc = NSISOLatin3StringEncoding;
- else if (strcmp(encoding, "ISO-8859-4") == 0 /* */
- || strcmp(encoding, "ISO8859-4") == 0 /* OSF/1 Solaris NetBSD
*/)
- natEnc = NSISOLatin4StringEncoding;
- else if (strcmp(encoding, "ISO-8859-6") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-6") == 0 /* AIX Solaris */
- || strcmp(encoding, "iso88596") == 0 /* HP-UX */)
- natEnc = NSISOArabicStringEncoding;
- else if (strcmp(encoding, "ISO-8859-7") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-7") == 0 /* AIX IRIX OSF/1
Solaris */
- || strcmp(encoding, "iso88597") == 0 /* HP-UX */)
- natEnc = NSISOGreekStringEncoding;
- else if (strcmp(encoding, "ISO-8859-8") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-8") == 0 /* AIX OSF/1 Solaris */
- || strcmp(encoding, "iso88598") == 0 /* HP-UX */)
- natEnc = NSISOHebrewStringEncoding;
- else if (strcmp(encoding, "ISO-8859-9") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-9") == 0 /* AIX IRIX OSF/1
Solaris */
- || strcmp(encoding, "iso88599") == 0 /* HP-UX */)
- natEnc = NSISOLatin5StringEncoding;
- else if (strcmp(encoding, "ISO-8859-10") == 0 /* */
- || strcmp(encoding, "ISO8859-10") == 0 /* */)
- natEnc = NSISOLatin6StringEncoding;
- else if (strcmp(encoding, "TIS-620") == 0 /* glibc AIX */
- || strcmp(encoding, "tis620") == 0 /* HP-UX */
- || strcmp(encoding, "TIS620.2533") == 0 /* Solaris */
- || strcmp(encoding, "TACTIS") == 0 /* OSF/1 */)
- natEnc = NSISOThaiStringEncoding;
- else if (strcmp(encoding, "ISO-8859-13") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-13") == 0 /* */
- || strcmp(encoding, "IBM-921") == 0 /* AIX */)
- natEnc = NSISOLatin7StringEncoding;
- else if (strcmp(encoding, "ISO-8859-14") == 0 /* glibc */
- || strcmp(encoding, "ISO8859-14") == 0 /* */)
- natEnc = NSISOLatin8StringEncoding;
- else if (strcmp(encoding, "ISO-8859-15") == 0 /* glibc */
- /* AIX OSF/1 Solaris NetBSD */
- || strcmp(encoding, "ISO8859-15") == 0
- || strcmp(encoding, "iso885915") == 0 /* HP-UX */)
- natEnc = NSISOLatin9StringEncoding;
- else if (strcmp(encoding, "GB2312") == 0 /* glibc */
- || strcmp(encoding, "gb2312") == 0 /* Solaris */
- || strcmp(encoding, "eucCN") == 0 /* IRIX NetBSD */
- || strcmp(encoding, "IBM-eucCN") == 0 /* AIX */
- || strcmp(encoding, "hp15CN") == 0 /* HP-UX */)
- natEnc = NSGB2312StringEncoding;
- else if (strcmp(encoding, "BIG5") == 0 /* glibc Solaris NetBSD */
- || strcmp(encoding, "big5") == 0 /* AIX HP-UX OSF/1 */)
- natEnc = NSBIG5StringEncoding;
- else if (strcmp(encoding, "EUC-KR") == 0 /* glibc */
- || strcmp(encoding, "eucKR") == 0 /* HP-UX IRIX OSF/1 NetBSD */
- || strcmp(encoding, "IBM-eucKR") == 0 /* AIX */
- || strcmp(encoding, "5601") == 0 /* Solaris */)
- natEnc = NSKoreanEUCStringEncoding;
- }
- }
encoding = getenv("GNUSTEP_STRING_ENCODING");
if (encoding != 0)
@@ -2564,7 +2540,7 @@
}
if (defEnc == GSUndefinedEncoding)
{
- defEnc = natEnc;
+ defEnc = GSPrivateICUCStringEncoding();
}
if (defEnc == GSUndefinedEncoding)
{
@@ -2579,11 +2555,6 @@
defEnc = NSISOLatin1StringEncoding;
}
- if (natEnc == GSUndefinedEncoding)
- {
- natEnc = defEnc;
- }
-
[local_lock unlock];
}
return defEnc;
@@ -2613,15 +2584,63 @@
return encInfo->eightBit;
}
+/* Returns the C-String encoding as used by native locale functions.
+ * We can use this to convert strings produced by those functions to
+ * NSString objects.
+ */
NSStringEncoding
GSPrivateNativeCStringEncoding()
{
if (natEnc == GSUndefinedEncoding)
{
- /* GSPrivateDefaultCStringEncoding() will actually set the encoding.
+ char encbuf[BUFSIZ];
+#if HAVE_LANGINFO_CODESET
+ char *old;
+
+ /* Take it from the system locale information. */
+ [gnustep_global_lock lock];
+ /* Initialise locale system by setting current locale from
+ * environment and then resetting it. Must be done before
+ * any call to nl_langinfo()
*/
- GSPrivateDefaultCStringEncoding();
+ if (0 != (old = setlocale(LC_CTYPE, "")))
+ {
+ setlocale(LC_CTYPE, old);
+ }
+ strncpy(encbuf, nl_langinfo(CODESET), sizeof(encbuf)-1);
+ encbuf[sizeof(encbuf)-1] = '\0';
+ [gnustep_global_lock unlock];
+#else
+ encbuf[0] = '\0';
+#endif
+ natEnc = GSPrivateCStringEncoding(encbuf);
}
return natEnc;
}
+/* Returns the C-String encoding as used by ICU library functions.
+ * We can use this to convert strings produced by those functions
+ * to NSString objects.
+ */
+NSStringEncoding
+GSPrivateICUCStringEncoding()
+{
+ if (icuEnc == GSUndefinedEncoding)
+ {
+ const char *encoding = 0;
+#if HAVE_UNICODE_UCNV_H
+ const char *defaultName;
+ UErrorCode err = U_ZERO_ERROR;
+
+ defaultName = ucnv_getDefaultName ();
+ encoding = ucnv_getStandardName (defaultName, "MIME", &err);
+ if (0 == encoding)
+ {
+ encoding = ucnv_getStandardName (defaultName, "IANA", &err);
+ }
+#endif
+ icuEnc = GSPrivateCStringEncoding(encoding);
+ }
+ return icuEnc;
+}
+
Modified: libs/base/trunk/Source/GSPrivate.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSPrivate.h?rev=39655&r1=39654&r2=39655&view=diff
==============================================================================
--- libs/base/trunk/Source/GSPrivate.h (original)
+++ libs/base/trunk/Source/GSPrivate.h Sat Apr 9 07:49:16 2016
@@ -418,10 +418,16 @@
/* Get the native C-string encoding as used by locale specific code in the
* operating system. This may differ from the default C-string encoding
- * if the latter has bewen set via an environment variable.
+ * if the latter has been set via an environment variable.
*/
NSStringEncoding
GSPrivateNativeCStringEncoding() GS_ATTRIB_PRIVATE;
+
+/* Get the native C-string encoding as used by the ICU library, which may
+ * differ from the native locale encoding or the default C-string encoding
+ */
+NSStringEncoding
+GSPrivateICUCStringEncoding() GS_ATTRIB_PRIVATE;
/* Function used by the NSRunLoop and friends for processing
* queued notifications which should be processed at the first safe moment.
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs