From 391912b1d9b98996defb99e9ce795821813f4f5e Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Tue, 6 Mar 2007 08:18:53 +0000 Subject: [PATCH] IconvGNU and IconvFBSD transcoders override application-set locale, XERCESC-1660 (patch by Boris Kolpackov) git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@515018 13f79535-47bb-0310-9956-ffa450edef68 --- .../IconvFBSD/IconvFBSDTransService.cpp | 23 ++++++++++++++++--- .../IconvGNU/IconvGNUTransService.cpp | 23 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp index a5ecdbbfb..e54e976f2 100644 --- a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp +++ b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp @@ -509,9 +509,26 @@ IconvFBSDTransService::IconvFBSDTransService() } #endif - // Try to obtain local (host) characterset through the environment - char* fLocalCP = setlocale (LC_CTYPE, ""); - if (fLocalCP == NULL) + // Try to obtain local (host) characterset from the setlocale + // and through the environment. Do not call setlocale(LC_*, "")! + // Using an empty string instead of NULL, will modify the libc + // behavior. + // + char* fLocalCP = setlocale (LC_CTYPE, NULL); + if (fLocalCP == NULL || *fLocalCP == 0 || + strcmp (fLocalCP, "C") == 0 || + strcmp (fLocalCP, "POSIX") == 0) { + fLocalCP = getenv ("LC_ALL"); + if (fLocalCP == NULL) { + fLocalCP = getenv ("LC_CTYPE"); + if (fLocalCP == NULL) + fLocalCP = getenv ("LANG"); + } + } + + if (fLocalCP == NULL || *fLocalCP == 0 || + strcmp (fLocalCP, "C") == 0 || + strcmp (fLocalCP, "POSIX") == 0) fLocalCP = "iso-8859-1"; // fallback locale else { char *ptr = strchr (fLocalCP, '.'); diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp index 302429fde..37faba188 100644 --- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp +++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp @@ -417,9 +417,26 @@ IconvGNUTransService::IconvGNUTransService() } #endif - // Try to obtain local (host) characterset through the environment - char* fLocalCP = setlocale (LC_CTYPE, ""); - if (fLocalCP == NULL) + // Try to obtain local (host) characterset from the setlocale + // and through the environment. Do not call setlocale(LC_*, "")! + // Using an empty string instead of NULL, will modify the libc + // behavior. + // + char* fLocalCP = setlocale (LC_CTYPE, NULL); + if (fLocalCP == NULL || *fLocalCP == 0 || + strcmp (fLocalCP, "C") == 0 || + strcmp (fLocalCP, "POSIX") == 0) { + fLocalCP = getenv ("LC_ALL"); + if (fLocalCP == NULL) { + fLocalCP = getenv ("LC_CTYPE"); + if (fLocalCP == NULL) + fLocalCP = getenv ("LANG"); + } + } + + if (fLocalCP == NULL || *fLocalCP == 0 || + strcmp (fLocalCP, "C") == 0 || + strcmp (fLocalCP, "POSIX") == 0) fLocalCP = "iso-8859-1"; // fallback locale else { char *ptr = strchr (fLocalCP, '.'); -- GitLab