From: Simon Marlow Date: Tue, 23 Jun 2009 14:38:13 +0000 (+0000) Subject: Call nl_langinfo(CODESET) to get the name of the locale encoding on Unix X-Git-Tag: 2009-06-25~5 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=185bcffd05a9a289fe8cb6240de3255ffe534b5d;p=ghc-base.git Call nl_langinfo(CODESET) to get the name of the locale encoding on Unix --- diff --git a/GHC/IO/Encoding/Iconv.hs b/GHC/IO/Encoding/Iconv.hs index 237468a..25e22ab 100644 --- a/GHC/IO/Encoding/Iconv.hs +++ b/GHC/IO/Encoding/Iconv.hs @@ -1,4 +1,4 @@ -{-# OPTIONS_GHC -fno-implicit-prelude -#include "HsBase.h" #-} +{-# OPTIONS_GHC -fno-implicit-prelude #-} ----------------------------------------------------------------------------- -- | -- Module : GHC.IO.Encoding.Iconv @@ -25,6 +25,8 @@ module GHC.IO.Encoding.Iconv ( #endif ) where +#include "HsBaseConfig.h" + #if !defined(mingw32_HOST_OS) #undef DEBUG_DUMP @@ -98,7 +100,15 @@ utf32be = unsafePerformIO (mkTextEncoding "UTF32BE") {-# NOINLINE localeEncoding #-} localeEncoding :: TextEncoding -localeEncoding = unsafePerformIO (mkTextEncoding "") +localeEncoding = unsafePerformIO $ do +#if HAVE_LANGINFO_H + cstr <- c_localeEncoding -- use nl_langinfo(CODESET) to get the encoding + -- if we have it + r <- peekCString cstr + mkTextEncoding r +#else + mkTextEncoding "" -- GNU iconv accepts "" to mean the -- locale encoding. +#endif -- We hope iconv_t is a storable type. It should be, since it has at least the -- value -1, which is a possible return value from iconv_open. @@ -114,6 +124,9 @@ foreign import ccall unsafe "iconv" iconv :: IConv -> Ptr CString -> Ptr CSize -> Ptr CString -> Ptr CSize -> IO CSize +foreign import ccall unsafe "localeEncoding" + c_localeEncoding :: IO CString + haskellChar :: String #ifdef WORDS_BIGENDIAN haskellChar | charSize == 2 = "UTF16BE" diff --git a/cbits/PrelIOUtils.c b/cbits/PrelIOUtils.c index de7fed4..6444bd0 100644 --- a/cbits/PrelIOUtils.c +++ b/cbits/PrelIOUtils.c @@ -24,4 +24,14 @@ void debugBelch2(const char*s, char *t) { debugBelch(s,t); } + +// Use a C wrapper for this because we avoid hsc2hs in base +#if HAVE_LANGINFO_H +#include +char *localeEncoding (void) +{ + return nl_langinfo(CODESET); +} +#endif + #endif /* __GLASGOW_HASKELL__ */ diff --git a/configure.ac b/configure.ac index 4ae0be1..cd153c3 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl ** check for full ANSI header (.h) files AC_HEADER_STDC # check for specific header (.h) files that we are interested in -AC_CHECK_HEADERS([ctype.h dirent.h errno.h fcntl.h inttypes.h limits.h signal.h sys/resource.h sys/select.h sys/stat.h sys/syscall.h sys/time.h sys/timeb.h sys/timers.h sys/times.h sys/types.h sys/utsname.h sys/wait.h termios.h time.h unistd.h utime.h windows.h winsock.h]) +AC_CHECK_HEADERS([ctype.h dirent.h errno.h fcntl.h inttypes.h limits.h signal.h sys/resource.h sys/select.h sys/stat.h sys/syscall.h sys/time.h sys/timeb.h sys/timers.h sys/times.h sys/types.h sys/utsname.h sys/wait.h termios.h time.h unistd.h utime.h windows.h winsock.h langinfo.h]) # Enable large file support. Do this before testing the types ino_t, off_t, and # rlim_t, because it will affect the result of that test.