{-# LINE 1 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE Trustworthy #-}
-----------------------------------------------------------------------------

-- |

-- Module      :  System.Win32.NLS

-- Copyright   :  (c) Alastair Reid, 1997-2003

-- License     :  BSD-style (see the file libraries/base/LICENSE)

--

-- Maintainer  :  Esa Ilari Vuokko <ei@vuokko.info>

-- Stability   :  provisional

-- Portability :  portable

--

-- A collection of FFI declarations for interfacing with Win32.

--

-----------------------------------------------------------------------------


module System.Win32.NLS  (
        module System.Win32.NLS,

{-# LINE 20 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
        CodePage,

{-# LINE 22 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

        -- defined in System.Win32.Types

        LCID, LANGID, SortID, SubLANGID, PrimaryLANGID,
        mAKELCID, lANGIDFROMLCID, sORTIDFROMLCID,
        mAKELANGID, pRIMARYLANGID, sUBLANGID
        ) where

import System.Win32.String (withTStringBufferLen)
import System.Win32.Types
import System.Win32.Utils (trySized)


{-# LINE 36 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
import Control.Monad (when)
import Data.IORef (modifyIORef, newIORef, readIORef)
import Foreign
import Foreign.C

{-# LINE 41 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
import GHC.IO.Encoding.CodePage (CodePage)

{-# LINE 43 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
import Text.Printf (printf)

#include "windows_cconv.h"

-- Somewhere, WINVER and _WIN32_WINNT are being defined as less than 0x0600 -

-- that is, before Windows Vista. Support for Windows XP was dropped in

-- GHC 8.0.1 of May 2016. This forces them to be at least 0x0600.


{-# LINE 54 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

{-# LINE 58 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}








type NLS_FUNCTION = DWORD

lOCALE_SYSTEM_DEFAULT  :: LCID
lOCALE_SYSTEM_DEFAULT :: Word32
lOCALE_SYSTEM_DEFAULT  =  Word32
2048
lOCALE_USER_DEFAULT    :: LCID
lOCALE_USER_DEFAULT :: Word32
lOCALE_USER_DEFAULT    =  Word32
1024
lOCALE_NEUTRAL         :: LCID
lOCALE_NEUTRAL :: Word32
lOCALE_NEUTRAL         =  Word32
0

{-# LINE 73 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

foreign import WINDOWS_CCONV unsafe "windows.h ConvertDefaultLocale"
  convertDefaultLocale :: LCID -> IO LCID

-- TODO: various enum functions.



{-# LINE 82 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

cP_ACP        :: CodePage
cP_ACP :: Word32
cP_ACP        =  Word32
0
cP_MACCP      :: CodePage
cP_MACCP :: Word32
cP_MACCP      =  Word32
2
cP_OEMCP      :: CodePage
cP_OEMCP :: Word32
cP_OEMCP      =  Word32
1

{-# LINE 88 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

foreign import WINDOWS_CCONV unsafe "windows.h GetACP"
  getACP :: IO CodePage

foreign import WINDOWS_CCONV unsafe "windows.h SetThreadLocale"
  setThreadLocale :: LCID -> IO ()

type LCTYPE = UINT

-- The following locale information constants are excluded from the `enum` list

-- below, for the reason indicated:

-- LOCALE_IDIALINGCODE -- Introduced in Windows 10 but not supported. Synonym

                       -- for LOCALE_ICOUNTRY.

-- LOCALE_INEGATIVEPERCENT -- Introduced in Windows 7 but not supported.

-- LOCALE_IPOSITIVEPERCENT -- Introduced in Windows 7 but not supported.

-- LOCALE_IREADINGLAYOUT -- Introduced in Windows 7 but not supported.

-- LOCALE_SAM -- Introduced by Windows 10 but not supported. Synonym for

              -- LOCALE_S1159.

-- LOCALE_SENGLISHDISPLAYNAME -- Introduced in Windows 7 but not supported.

-- LOCALE_SIETFLANGUAGE -- Not supported (deprecated from Windows Vista).

-- LOCALE_SNATIVEDISPLAYNAME -- Introduced in Windows 7 but not supported.

-- LOCALE_SNATIVELANGUAGENAME -- Introduced in Windows 7 but not supported.

-- LOCALE_SPERCENT -- Introduced in Windows 7 but not supported.

-- LOCALE_SPM -- Introduced in Windows 10 but not supported. Synonym for

              -- LOCALE_S2359.

-- LOCALE_SSHORTESTAM -- Not supported.

-- LOCALE_SSHORTESTPM -- Not supported.

-- LOCALE_SSHORTTIME -- Introduced in Windows 7 but not supported.


-- The following locale information constant is included in the list below, but

-- note:

-- LOCALE_IINTLCURRDIGITS -- Not supported by Windows 10, use

                          -- LOCALE_ICURRDIGITS.


lOCALE_FONTSIGNATURE  :: LCTYPE
lOCALE_FONTSIGNATURE :: Word32
lOCALE_FONTSIGNATURE  =  Word32
88
lOCALE_ICALENDARTYPE  :: LCTYPE
lOCALE_ICALENDARTYPE :: Word32
lOCALE_ICALENDARTYPE  =  Word32
4105
lOCALE_ICENTURY       :: LCTYPE
lOCALE_ICENTURY :: Word32
lOCALE_ICENTURY       =  Word32
36
lOCALE_ICOUNTRY       :: LCTYPE
lOCALE_ICOUNTRY :: Word32
lOCALE_ICOUNTRY       =  Word32
5
lOCALE_ICURRDIGITS    :: LCTYPE
lOCALE_ICURRDIGITS :: Word32
lOCALE_ICURRDIGITS    =  Word32
25
lOCALE_ICURRENCY      :: LCTYPE
lOCALE_ICURRENCY :: Word32
lOCALE_ICURRENCY      =  Word32
27
lOCALE_IDATE          :: LCTYPE
lOCALE_IDATE :: Word32
lOCALE_IDATE          =  Word32
33
lOCALE_IDAYLZERO      :: LCTYPE
lOCALE_IDAYLZERO :: Word32
lOCALE_IDAYLZERO      =  Word32
38
lOCALE_IDEFAULTANSICODEPAGE  :: LCTYPE
lOCALE_IDEFAULTANSICODEPAGE :: Word32
lOCALE_IDEFAULTANSICODEPAGE  =  Word32
4100
lOCALE_IDEFAULTCODEPAGE  :: LCTYPE
lOCALE_IDEFAULTCODEPAGE :: Word32
lOCALE_IDEFAULTCODEPAGE  =  Word32
11
lOCALE_IDEFAULTCOUNTRY  :: LCTYPE
lOCALE_IDEFAULTCOUNTRY :: Word32
lOCALE_IDEFAULTCOUNTRY  =  Word32
10
lOCALE_IDEFAULTEBCDICCODEPAGE  :: LCTYPE
lOCALE_IDEFAULTEBCDICCODEPAGE :: Word32
lOCALE_IDEFAULTEBCDICCODEPAGE  =  Word32
4114
lOCALE_IDEFAULTLANGUAGE  :: LCTYPE
lOCALE_IDEFAULTLANGUAGE :: Word32
lOCALE_IDEFAULTLANGUAGE  =  Word32
9
lOCALE_IDEFAULTMACCODEPAGE  :: LCTYPE
lOCALE_IDEFAULTMACCODEPAGE :: Word32
lOCALE_IDEFAULTMACCODEPAGE  =  Word32
4113
lOCALE_IDIGITS        :: LCTYPE
lOCALE_IDIGITS :: Word32
lOCALE_IDIGITS        =  Word32
17
lOCALE_IDIGITSUBSTITUTION  :: LCTYPE
lOCALE_IDIGITSUBSTITUTION :: Word32
lOCALE_IDIGITSUBSTITUTION  =  Word32
4116
lOCALE_IFIRSTDAYOFWEEK  :: LCTYPE
lOCALE_IFIRSTDAYOFWEEK :: Word32
lOCALE_IFIRSTDAYOFWEEK  =  Word32
4108
lOCALE_IFIRSTWEEKOFYEAR  :: LCTYPE
lOCALE_IFIRSTWEEKOFYEAR :: Word32
lOCALE_IFIRSTWEEKOFYEAR  =  Word32
4109
lOCALE_IGEOID         :: LCTYPE
lOCALE_IGEOID :: Word32
lOCALE_IGEOID         =  Word32
91
lOCALE_IINTLCURRDIGITS  :: LCTYPE
lOCALE_IINTLCURRDIGITS :: Word32
lOCALE_IINTLCURRDIGITS  =  Word32
26
lOCALE_ILANGUAGE      :: LCTYPE
lOCALE_ILANGUAGE :: Word32
lOCALE_ILANGUAGE      =  Word32
1
lOCALE_ILDATE         :: LCTYPE
lOCALE_ILDATE :: Word32
lOCALE_ILDATE         =  Word32
34
lOCALE_ILZERO         :: LCTYPE
lOCALE_ILZERO :: Word32
lOCALE_ILZERO         =  Word32
18
lOCALE_IMEASURE       :: LCTYPE
lOCALE_IMEASURE :: Word32
lOCALE_IMEASURE       =  Word32
13
lOCALE_IMONLZERO      :: LCTYPE
lOCALE_IMONLZERO :: Word32
lOCALE_IMONLZERO      =  Word32
39
lOCALE_INEGCURR       :: LCTYPE
lOCALE_INEGCURR :: Word32
lOCALE_INEGCURR       =  Word32
28
lOCALE_INEGNUMBER     :: LCTYPE
lOCALE_INEGNUMBER :: Word32
lOCALE_INEGNUMBER     =  Word32
4112
lOCALE_INEGSEPBYSPACE  :: LCTYPE
lOCALE_INEGSEPBYSPACE :: Word32
lOCALE_INEGSEPBYSPACE  =  Word32
87
lOCALE_INEGSIGNPOSN    :: LCTYPE
lOCALE_INEGSIGNPOSN :: Word32
lOCALE_INEGSIGNPOSN    =  Word32
83
lOCALE_INEGSYMPRECEDES  :: LCTYPE
lOCALE_INEGSYMPRECEDES :: Word32
lOCALE_INEGSYMPRECEDES  =  Word32
86
lOCALE_IOPTIONALCALENDAR  :: LCTYPE
lOCALE_IOPTIONALCALENDAR :: Word32
lOCALE_IOPTIONALCALENDAR  =  Word32
4107
lOCALE_PAPERSIZE      :: LCTYPE
lOCALE_PAPERSIZE :: Word32
lOCALE_PAPERSIZE      =  Word32
4106
lOCALE_IPOSSEPBYSPACE  :: LCTYPE
lOCALE_IPOSSEPBYSPACE :: Word32
lOCALE_IPOSSEPBYSPACE  =  Word32
85
lOCALE_IPOSSIGNPOSN   :: LCTYPE
lOCALE_IPOSSIGNPOSN :: Word32
lOCALE_IPOSSIGNPOSN   =  Word32
82
lOCALE_IPSSYMPRECEDES  :: LCTYPE
lOCALE_IPSSYMPRECEDES :: Word32
lOCALE_IPSSYMPRECEDES  =  Word32
84
lOCALE_ITIME          :: LCTYPE
lOCALE_ITIME :: Word32
lOCALE_ITIME          =  Word32
35
lOCALE_ITIMEMARKPOSN  :: LCTYPE
lOCALE_ITIMEMARKPOSN :: Word32
lOCALE_ITIMEMARKPOSN  =  Word32
4101
lOCALE_ITLZERO        :: LCTYPE
lOCALE_ITLZERO :: Word32
lOCALE_ITLZERO        =  Word32
37
lOCALE_RETURN_NUMBER  :: LCTYPE
lOCALE_RETURN_NUMBER :: Word32
lOCALE_RETURN_NUMBER  =  Word32
536870912
lOCALE_S1159          :: LCTYPE
lOCALE_S1159 :: Word32
lOCALE_S1159          =  Word32
40
lOCALE_S2359          :: LCTYPE
lOCALE_S2359 :: Word32
lOCALE_S2359          =  Word32
41
lOCALE_SABBREVCTRYNAME  :: LCTYPE
lOCALE_SABBREVCTRYNAME :: Word32
lOCALE_SABBREVCTRYNAME  =  Word32
7
lOCALE_SABBREVDAYNAME1  :: LCTYPE
lOCALE_SABBREVDAYNAME1 :: Word32
lOCALE_SABBREVDAYNAME1  =  Word32
49
lOCALE_SABBREVDAYNAME2  :: LCTYPE
lOCALE_SABBREVDAYNAME2 :: Word32
lOCALE_SABBREVDAYNAME2  =  Word32
50
lOCALE_SABBREVDAYNAME3  :: LCTYPE
lOCALE_SABBREVDAYNAME3 :: Word32
lOCALE_SABBREVDAYNAME3  =  Word32
51
lOCALE_SABBREVDAYNAME4  :: LCTYPE
lOCALE_SABBREVDAYNAME4 :: Word32
lOCALE_SABBREVDAYNAME4  =  Word32
52
lOCALE_SABBREVDAYNAME5  :: LCTYPE
lOCALE_SABBREVDAYNAME5 :: Word32
lOCALE_SABBREVDAYNAME5  =  Word32
53
lOCALE_SABBREVDAYNAME6  :: LCTYPE
lOCALE_SABBREVDAYNAME6 :: Word32
lOCALE_SABBREVDAYNAME6  =  Word32
54
lOCALE_SABBREVDAYNAME7  :: LCTYPE
lOCALE_SABBREVDAYNAME7 :: Word32
lOCALE_SABBREVDAYNAME7  =  Word32
55
lOCALE_SABBREVLANGNAME  :: LCTYPE
lOCALE_SABBREVLANGNAME :: Word32
lOCALE_SABBREVLANGNAME  =  Word32
3
lOCALE_SABBREVMONTHNAME1  :: LCTYPE
lOCALE_SABBREVMONTHNAME1 :: Word32
lOCALE_SABBREVMONTHNAME1  =  Word32
68
lOCALE_SABBREVMONTHNAME2  :: LCTYPE
lOCALE_SABBREVMONTHNAME2 :: Word32
lOCALE_SABBREVMONTHNAME2  =  Word32
69
lOCALE_SABBREVMONTHNAME3  :: LCTYPE
lOCALE_SABBREVMONTHNAME3 :: Word32
lOCALE_SABBREVMONTHNAME3  =  Word32
70
lOCALE_SABBREVMONTHNAME4  :: LCTYPE
lOCALE_SABBREVMONTHNAME4 :: Word32
lOCALE_SABBREVMONTHNAME4  =  Word32
71
lOCALE_SABBREVMONTHNAME5  :: LCTYPE
lOCALE_SABBREVMONTHNAME5 :: Word32
lOCALE_SABBREVMONTHNAME5  =  Word32
72
lOCALE_SABBREVMONTHNAME6  :: LCTYPE
lOCALE_SABBREVMONTHNAME6 :: Word32
lOCALE_SABBREVMONTHNAME6  =  Word32
73
lOCALE_SABBREVMONTHNAME7  :: LCTYPE
lOCALE_SABBREVMONTHNAME7 :: Word32
lOCALE_SABBREVMONTHNAME7  =  Word32
74
lOCALE_SABBREVMONTHNAME8  :: LCTYPE
lOCALE_SABBREVMONTHNAME8 :: Word32
lOCALE_SABBREVMONTHNAME8  =  Word32
75
lOCALE_SABBREVMONTHNAME9  :: LCTYPE
lOCALE_SABBREVMONTHNAME9 :: Word32
lOCALE_SABBREVMONTHNAME9  =  Word32
76
lOCALE_SABBREVMONTHNAME10  :: LCTYPE
lOCALE_SABBREVMONTHNAME10 :: Word32
lOCALE_SABBREVMONTHNAME10  =  Word32
77
lOCALE_SABBREVMONTHNAME11  :: LCTYPE
lOCALE_SABBREVMONTHNAME11 :: Word32
lOCALE_SABBREVMONTHNAME11  =  Word32
78
lOCALE_SABBREVMONTHNAME12  :: LCTYPE
lOCALE_SABBREVMONTHNAME12 :: Word32
lOCALE_SABBREVMONTHNAME12  =  Word32
79
lOCALE_SABBREVMONTHNAME13  :: LCTYPE
lOCALE_SABBREVMONTHNAME13 :: Word32
lOCALE_SABBREVMONTHNAME13  =  Word32
4111
lOCALE_SCONSOLEFALLBACKNAME  :: LCTYPE
lOCALE_SCONSOLEFALLBACKNAME :: Word32
lOCALE_SCONSOLEFALLBACKNAME  =  Word32
110
lOCALE_SCURRENCY      :: LCTYPE
lOCALE_SCURRENCY :: Word32
lOCALE_SCURRENCY      =  Word32
20
lOCALE_SDATE          :: LCTYPE
lOCALE_SDATE :: Word32
lOCALE_SDATE          =  Word32
29
lOCALE_SDAYNAME1      :: LCTYPE
lOCALE_SDAYNAME1 :: Word32
lOCALE_SDAYNAME1      =  Word32
42
lOCALE_SDAYNAME2      :: LCTYPE
lOCALE_SDAYNAME2 :: Word32
lOCALE_SDAYNAME2      =  Word32
43
lOCALE_SDAYNAME3      :: LCTYPE
lOCALE_SDAYNAME3 :: Word32
lOCALE_SDAYNAME3      =  Word32
44
lOCALE_SDAYNAME4      :: LCTYPE
lOCALE_SDAYNAME4 :: Word32
lOCALE_SDAYNAME4      =  Word32
45
lOCALE_SDAYNAME5      :: LCTYPE
lOCALE_SDAYNAME5 :: Word32
lOCALE_SDAYNAME5      =  Word32
46
lOCALE_SDAYNAME6      :: LCTYPE
lOCALE_SDAYNAME6 :: Word32
lOCALE_SDAYNAME6      =  Word32
47
lOCALE_SDAYNAME7      :: LCTYPE
lOCALE_SDAYNAME7 :: Word32
lOCALE_SDAYNAME7      =  Word32
48
lOCALE_SDECIMAL       :: LCTYPE
lOCALE_SDECIMAL :: Word32
lOCALE_SDECIMAL       =  Word32
14
lOCALE_SDURATION      :: LCTYPE
lOCALE_SDURATION :: Word32
lOCALE_SDURATION      =  Word32
93
lOCALE_SENGCURRNAME   :: LCTYPE
lOCALE_SENGCURRNAME :: Word32
lOCALE_SENGCURRNAME   =  Word32
4103
lOCALE_SENGLISHCOUNTRYNAME  :: LCTYPE
lOCALE_SENGLISHCOUNTRYNAME :: Word32
lOCALE_SENGLISHCOUNTRYNAME  =  Word32
4098
lOCALE_SENGLISHLANGUAGENAME  :: LCTYPE
lOCALE_SENGLISHLANGUAGENAME :: Word32
lOCALE_SENGLISHLANGUAGENAME  =  Word32
4097
lOCALE_SGROUPING      :: LCTYPE
lOCALE_SGROUPING      =  16
lOCALE_SINTLSYMBOL    :: LCTYPE
lOCALE_SINTLSYMBOL    =  21
lOCALE_SISO3166CTRYNAME  :: LCTYPE
lOCALE_SISO3166CTRYNAME :: Word32
lOCALE_SISO3166CTRYNAME  =  Word32
90
lOCALE_SISO3166CTRYNAME2  :: LCTYPE
lOCALE_SISO3166CTRYNAME2 :: Word32
lOCALE_SISO3166CTRYNAME2  =  Word32
104
lOCALE_SISO639LANGNAME  :: LCTYPE
lOCALE_SISO639LANGNAME :: Word32
lOCALE_SISO639LANGNAME  =  Word32
89
lOCALE_SISO639LANGNAME2  :: LCTYPE
lOCALE_SISO639LANGNAME2 :: Word32
lOCALE_SISO639LANGNAME2  =  Word32
103
lOCALE_SKEYBOARDSTOINSTALL  :: LCTYPE
lOCALE_SKEYBOARDSTOINSTALL :: Word32
lOCALE_SKEYBOARDSTOINSTALL  =  Word32
94
lOCALE_SLIST          :: LCTYPE
lOCALE_SLIST :: Word32
lOCALE_SLIST          =  Word32
12
lOCALE_SLONGDATE      :: LCTYPE
lOCALE_SLONGDATE :: Word32
lOCALE_SLONGDATE      =  Word32
32
lOCALE_SMONDECIMALSEP  :: LCTYPE
lOCALE_SMONDECIMALSEP :: Word32
lOCALE_SMONDECIMALSEP  =  Word32
22
lOCALE_SMONGROUPING   :: LCTYPE
lOCALE_SMONGROUPING :: Word32
lOCALE_SMONGROUPING   =  Word32
24
lOCALE_SMONTHNAME1    :: LCTYPE
lOCALE_SMONTHNAME1 :: Word32
lOCALE_SMONTHNAME1    =  Word32
56
lOCALE_SMONTHNAME2    :: LCTYPE
lOCALE_SMONTHNAME2 :: Word32
lOCALE_SMONTHNAME2    =  Word32
57
lOCALE_SMONTHNAME3    :: LCTYPE
lOCALE_SMONTHNAME3 :: Word32
lOCALE_SMONTHNAME3    =  Word32
58
lOCALE_SMONTHNAME4    :: LCTYPE
lOCALE_SMONTHNAME4 :: Word32
lOCALE_SMONTHNAME4    =  Word32
59
lOCALE_SMONTHNAME5    :: LCTYPE
lOCALE_SMONTHNAME5 :: Word32
lOCALE_SMONTHNAME5    =  Word32
60
lOCALE_SMONTHNAME6    :: LCTYPE
lOCALE_SMONTHNAME6 :: Word32
lOCALE_SMONTHNAME6    =  Word32
61
lOCALE_SMONTHNAME7    :: LCTYPE
lOCALE_SMONTHNAME7 :: Word32
lOCALE_SMONTHNAME7    =  Word32
62
lOCALE_SMONTHNAME8    :: LCTYPE
lOCALE_SMONTHNAME8 :: Word32
lOCALE_SMONTHNAME8    =  Word32
63
lOCALE_SMONTHNAME9    :: LCTYPE
lOCALE_SMONTHNAME9 :: Word32
lOCALE_SMONTHNAME9    =  Word32
64
lOCALE_SMONTHNAME10   :: LCTYPE
lOCALE_SMONTHNAME10   =  65
lOCALE_SMONTHNAME11   :: LCTYPE
lOCALE_SMONTHNAME11   =  66
lOCALE_SMONTHNAME12   :: LCTYPE
lOCALE_SMONTHNAME12   =  67
lOCALE_SMONTHNAME13   :: LCTYPE
lOCALE_SMONTHNAME13 :: Word32
lOCALE_SMONTHNAME13   =  4110
lOCALE_SMONTHOUSANDSEP  :: LCTYPE
lOCALE_SMONTHOUSANDSEP :: Word32
lOCALE_SMONTHOUSANDSEP  =  Word32
23
lOCALE_SNAME          :: LCTYPE
lOCALE_SNAME :: Word32
lOCALE_SNAME          =  Word32
92
lOCALE_SNAN           :: LCTYPE
lOCALE_SNAN           =  105
lOCALE_SNATIVECOUNTRYNAME  :: LCTYPE
lOCALE_SNATIVECOUNTRYNAME :: Word32
lOCALE_SNATIVECOUNTRYNAME  =  Word32
8
lOCALE_SNATIVECURRNAME  :: LCTYPE
lOCALE_SNATIVECURRNAME :: Word32
lOCALE_SNATIVECURRNAME  =  Word32
4104
lOCALE_SNATIVEDIGITS  :: LCTYPE
lOCALE_SNATIVEDIGITS :: Word32
lOCALE_SNATIVEDIGITS  =  Word32
19
lOCALE_SNEGATIVESIGN  :: LCTYPE
lOCALE_SNEGATIVESIGN :: Word32
lOCALE_SNEGATIVESIGN  =  Word32
81
lOCALE_SNEGINFINITY   :: LCTYPE
lOCALE_SNEGINFINITY :: Word32
lOCALE_SNEGINFINITY   =  Word32
107
lOCALE_SPARENT        :: LCTYPE
lOCALE_SPARENT :: Word32
lOCALE_SPARENT        =  Word32
109
lOCALE_SPOSINFINITY   :: LCTYPE
lOCALE_SPOSINFINITY :: Word32
lOCALE_SPOSINFINITY   =  Word32
106
lOCALE_SPOSITIVESIGN  :: LCTYPE
lOCALE_SPOSITIVESIGN :: Word32
lOCALE_SPOSITIVESIGN  =  80
lOCALE_SSCRIPTS       :: LCTYPE
lOCALE_SSCRIPTS :: Word32
lOCALE_SSCRIPTS       =  Word32
108
lOCALE_SSHORTDATE     :: LCTYPE
lOCALE_SSHORTDATE :: Word32
lOCALE_SSHORTDATE     =  31
lCMAP_SIMPLIFIED_CHINESE :: Word32
lOCALE_SSHORTESTDAYNAME1  :: LCTYPE
lOCALE_SSHORTESTDAYNAME1 :: Word32
lOCALE_SSHORTESTDAYNAME1  =  Word32
96
lOCALE_SSHORTESTDAYNAME2  :: LCTYPE
lOCALE_SSHORTESTDAYNAME2 :: Word32
lOCALE_SSHORTESTDAYNAME2  =  Word32
97
lOCALE_SSHORTESTDAYNAME3  :: LCTYPE
lOCALE_SSHORTESTDAYNAME3 :: Word32
lOCALE_SSHORTESTDAYNAME3  =  Word32
98
lOCALE_SSHORTESTDAYNAME4  :: LCTYPE
lOCALE_SSHORTESTDAYNAME4 :: Word32
lOCALE_SSHORTESTDAYNAME4  =  Word32
99
lOCALE_SSHORTESTDAYNAME5  :: LCTYPE
lOCALE_SSHORTESTDAYNAME5 :: Word32
lOCALE_SSHORTESTDAYNAME5  =  Word32
100
lOCALE_SSHORTESTDAYNAME6  :: LCTYPE
lOCALE_SSHORTESTDAYNAME6 :: Word32
lOCALE_SSHORTESTDAYNAME6  =  Word32
101
lOCALE_SSHORTESTDAYNAME7  :: LCTYPE
lOCALE_SSHORTESTDAYNAME7 :: Word32
lOCALE_SSHORTESTDAYNAME7  =  Word32
102
lOCALE_SSORTNAME      :: LCTYPE
lOCALE_SSORTNAME :: Word32
lOCALE_SSORTNAME      =  Word32
4115
lOCALE_STHOUSAND      :: LCTYPE
lOCALE_STHOUSAND :: Word32
lOCALE_STHOUSAND      =  Word32
15
lOCALE_STIME          :: LCTYPE
lOCALE_STIME :: Word32
lOCALE_STIME          =  Word32
30
lOCALE_STIMEFORMAT    :: LCTYPE
lOCALE_STIMEFORMAT :: Word32
lOCALE_STIMEFORMAT    =  Word32
4099
lOCALE_SYEARMONTH     :: LCTYPE
lOCALE_SYEARMONTH :: Word32
lOCALE_SYEARMONTH     =  Word32
4102

{-# LINE 251 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

-- |Type representing locale data

data LCData
  -- | Data in the form of a Unicode string.

  = LCTextualData !String
  -- | Data in the form of a number. See 'lOCAL_RETURN_NUMBER' and @LOCAL_I*@

  -- locate information constants.

  | LCNumericData !DWORD
  -- | Data in the fomr of a 'LOCALESIGNATURE'. See 'lOCAL_FONTSIGNATURE' locale

  -- information constant.

  | LCSignatureData !LOCALESIGNATURE
  deriving (Eq, Show)

data LOCALESIGNATURE = LOCALESIGNATURE
  { lsUsb :: !UnicodeSubsetBitfield
  , lsCsbDefault :: !DDWORD
  , lsCsbSupported :: !DDWORD
  } deriving (Eq, Show)

instance Storable LOCALESIGNATURE where
  sizeOf = const (32)
{-# LINE 272 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  alignment _ = 4
{-# LINE 273 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  peek buf = do
    lsUsb'          <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
{-# LINE 275 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    lsCsbDefault'   <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) buf
{-# LINE 276 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    lsCsbSupported' <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) buf
{-# LINE 277 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    return $ LOCALESIGNATURE lsUsb' lsCsbDefault' lsCsbSupported'
  poke buf info = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) buf (lsUsb info)
{-# LINE 280 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) buf (lsCsbDefault info)
{-# LINE 281 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) buf (lsCsbSupported info)
{-# LINE 282 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

-- | Type representing 128-bit Unicode subset bitfields, as the @base@ package

-- does include a module exporting a 128-bit unsigned integer type.

data UnicodeSubsetBitfield = UnicodeSubsetBitfield
  { usbLow :: !DDWORD
  , usbHigh :: !DDWORD
  } deriving (Eq, Show)

instance Storable UnicodeSubsetBitfield where
  sizeOf _ = 2 * sizeOf (undefined :: DDWORD)
  alignment _ = alignment (undefined :: DWORD)
  peek buf = do
    usbLow'  <- (peekByteOff buf 0 :: IO DDWORD)
    usbHigh' <- (peekByteOff buf (sizeOf (undefined :: DDWORD)) :: IO DDWORD)
    return $ UnicodeSubsetBitfield usbLow' usbHigh'
  poke buf info = do
    pokeByteOff buf 0 (usbLow info)
    pokeByteOff buf (sizeOf (undefined :: DDWORD)) (usbHigh info)

getLocaleInfoEx :: Maybe String -> LCTYPE -> IO LCData
getLocaleInfoEx locale ty
  | ty == lOCALE_FONTSIGNATURE =
      getLocaleInfoEx' LCSignatureData localSigCharCount

  | ty .&. lOCALE_RETURN_NUMBER /= 0 =
      getLocaleInfoEx' LCNumericData dWORDCharCount

  | otherwise = maybeWith withTString locale $ \c_locale ->
      LCTextualData <$> trySized cFuncName (c_GetLocaleInfoEx c_locale ty)
 where
  cFuncName = "GetLocaleInfoEx"
  -- See https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getlocaleinfoex

  localSigCharCount = ((32)) `div` ((2))
{-# LINE 315 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  dWORDCharCount = ((4)) `div` ((2))
{-# LINE 316 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

  getLocaleInfoEx' constructor bufSize = maybeWith withTString locale $
    \c_locale -> do
      value <- alloca $ \buf -> do
        _ <- failIfZero cFuncName
          $ c_GetLocaleInfoEx c_locale ty (castPtr buf) bufSize
        peek buf
      return $ constructor value

foreign import WINDOWS_CCONV unsafe "windows.h GetLocaleInfoEx"
  c_GetLocaleInfoEx :: LPCWSTR -> LCTYPE -> LPWSTR -> CInt -> IO CInt

setLocaleInfo :: LCID -> LCTYPE -> String -> IO ()
setLocaleInfo locale ty info =
  withTString info $ \ c_info ->
  failIfFalse_ "SetLocaleInfo" $ c_SetLocaleInfo locale ty c_info
foreign import WINDOWS_CCONV unsafe "windows.h SetLocaleInfoW"
  c_SetLocaleInfo :: LCID -> LCTYPE -> LPCTSTR -> IO Bool

type LCMapFlags = DWORD

lCMAP_BYTEREV               :: LCMapFlags
lCMAP_BYTEREV               =  2048
lCMAP_FULLWIDTH             :: LCMapFlags
lCMAP_FULLWIDTH             =  8388608
lCMAP_HALFWIDTH             :: LCMapFlags
lCMAP_HALFWIDTH             =  4194304
lCMAP_HIRAGANA              :: LCMapFlags
lCMAP_HIRAGANA              =  1048576
lCMAP_KATAKANA              :: LCMapFlags
lCMAP_KATAKANA              =  2097152
lCMAP_LINGUISTIC_CASING     :: LCMapFlags
lCMAP_LINGUISTIC_CASING     =  16777216
lCMAP_LOWERCASE             :: LCMapFlags
lCMAP_LOWERCASE             =  256
lCMAP_SIMPLIFIED_CHINESE    :: LCMapFlags
lCMAP_SIMPLIFIED_CHINESE    =  33554432
lCMAP_SORTKEY               :: LCMapFlags
lCMAP_SORTKEY               =  1024
lCMAP_TRADITIONAL_CHINESE   :: LCMapFlags
lCMAP_TRADITIONAL_CHINESE   =  67108864
lCMAP_UPPERCASE             :: LCMapFlags
lCMAP_UPPERCASE             =  512
lINGUISTIC_IGNORECASE       :: LCMapFlags
lINGUISTIC_IGNORECASE       =  16
lINGUISTIC_IGNOREDIACRITIC  :: LCMapFlags
lINGUISTIC_IGNOREDIACRITIC  =  32
nORM_IGNORECASE             :: LCMapFlags
nORM_IGNORECASE             =  1
nORM_IGNORENONSPACE         :: LCMapFlags
nORM_IGNORENONSPACE         =  2
nORM_IGNOREKANATYPE         :: LCMapFlags
nORM_IGNOREKANATYPE         =  65536
nORM_IGNORESYMBOLS          :: LCMapFlags
nORM_IGNORESYMBOLS          =  4
nORM_IGNOREWIDTH            :: LCMapFlags
nORM_IGNOREWIDTH            =  131072
nORM_LINGUISTIC_CASING      :: LCMapFlags
nORM_LINGUISTIC_CASING      =  134217728
sORT_STRINGSORT             :: LCMapFlags
sORT_STRINGSORT             =  4096

{-# LINE 359 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

data NLSVERSIONINFOEX = NLSVERSIONINFOEX
  { dwNLSVersionInfoSize :: DWORD
  , dwNLSVersion :: DWORD
  , dwDefinedVersion :: DWORD
  , dwEffectiveId :: DWORD
  , guidCustomVersion :: GUID
  } deriving (Eq, Show)

instance Storable NLSVERSIONINFOEX where
  sizeOf = const (32)
{-# LINE 370 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  alignment _ = 4
{-# LINE 371 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  peek buf = do
    dwNLSVersionInfoSize' <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
{-# LINE 373 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    dwNLSVersion' <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) buf
{-# LINE 374 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    dwDefinedVersion' <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) buf
{-# LINE 375 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    dwEffectiveId' <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) buf
{-# LINE 376 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    guidCustomVersion' <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) buf
{-# LINE 377 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    return $ NLSVERSIONINFOEX dwNLSVersionInfoSize' dwNLSVersion'
               dwDefinedVersion' dwEffectiveId' guidCustomVersion'
  poke buf info = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) buf
{-# LINE 381 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
      (dwNLSVersionInfoSize info)
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) buf (dwNLSVersion info)
{-# LINE 383 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) buf (dwDefinedVersion info)
{-# LINE 384 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) buf (dwEffectiveId info)
{-# LINE 385 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) buf (guidCustomVersion info)
{-# LINE 386 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

-- Based on the `UnpackedUUID` type of package `uuid-types`.

data GUID = GUID
  !Word32
  !Word16
  !Word16
  !Word8
  !Word8
  !Word8
  !Word8
  !Word8
  !Word8
  !Word8
  !Word8
  deriving (GUID -> GUID -> Bool
(GUID -> GUID -> Bool) -> (GUID -> GUID -> Bool) -> Eq GUID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GUID -> GUID -> Bool
== :: GUID -> GUID -> Bool
$c/= :: GUID -> GUID -> Bool
/= :: GUID -> GUID -> Bool
Eq)

instance Show GUID where
  show :: GUID -> [Char]
show (GUID Word32
data1 Word16
data2 Word16
data3 Word8
b1 Word8
b2 Word8
b3 Word8
b4 Word8
b5 Word8
b6 Word8
b7 Word8
b8) =
    [Char]
-> Word32
-> Word16
-> Word16
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> [Char]
forall r. PrintfType r => [Char] -> r
printf [Char]
"{%.8x-%.4x-%.4x-%.2x%2x-%.2x%.2x%.2x%.2x%.2x%.2x}" Word32
data1 Word16
data2 Word16
data3 Word8
b1 Word8
b2 Word8
b3 Word8
b4 Word8
b5 Word8
b6 Word8
b7 Word8
b8

instance Storable GUID where
  sizeOf :: GUID -> Int
sizeOf GUID
_ = Int
16
  alignment :: GUID -> Int
alignment GUID
_ = Int
4
  peekByteOff :: forall b. Ptr b -> Int -> IO GUID
peekByteOff Ptr b
p Int
off = Word32
-> Word16
-> Word16
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> GUID
GUID
    (Word32
 -> Word16
 -> Word16
 -> Word8
 -> Word8
 -> Word8
 -> Word8
 -> Word8
 -> Word8
 -> Word8
 -> Word8
 -> GUID)
-> IO Word32
-> IO
     (Word16
      -> Word16
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> GUID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr b -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p Int
off
    IO
  (Word16
   -> Word16
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> GUID)
-> IO Word16
-> IO
     (Word16
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word16
forall b. Ptr b -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4)
    IO
  (Word16
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> GUID)
-> IO Word16
-> IO
     (Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> Word8
      -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word16
forall b. Ptr b -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6)
    IO
  (Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> Word8
   -> GUID)
-> IO Word8
-> IO
     (Word8
      -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
8)
    IO
  (Word8
   -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
-> IO Word8
-> IO (Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
9)
    IO (Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
-> IO Word8
-> IO (Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
10)
    IO (Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> GUID)
-> IO Word8 -> IO (Word8 -> Word8 -> Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
11)
    IO (Word8 -> Word8 -> Word8 -> Word8 -> GUID)
-> IO Word8 -> IO (Word8 -> Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12)
    IO (Word8 -> Word8 -> Word8 -> GUID)
-> IO Word8 -> IO (Word8 -> Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
13)
    IO (Word8 -> Word8 -> GUID) -> IO Word8 -> IO (Word8 -> GUID)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
14)
    IO (Word8 -> GUID) -> IO Word8 -> IO GUID
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr b -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
15)
  pokeByteOff :: forall b. Ptr b -> Int -> GUID -> IO ()
pokeByteOff Ptr b
p Int
off (GUID Word32
data1 Word16
data2 Word16
data3 Word8
b1 Word8
b2 Word8
b3 Word8
b4 Word8
b5 Word8
b6 Word8
b7 Word8
b8) = do
    Ptr b -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p Int
off Word32
data1
    Ptr b -> Int -> Word16 -> IO ()
forall b. Ptr b -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) Word16
data2
    Ptr b -> Int -> Word16 -> IO ()
forall b. Ptr b -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6) Word16
data3
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
8) Word8
b1
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
9) Word8
b2
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
10) Word8
b3
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
11) Word8
b4
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12) Word8
b5
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
13) Word8
b6
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
14) Word8
b7
    Ptr b -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr b
p (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
15) Word8
b8

getNLSVersionEx :: Maybe String -> IO NLSVERSIONINFOEX
getNLSVersionEx :: Maybe [Char] -> IO NLSVERSIONINFOEX
getNLSVersionEx Maybe [Char]
locale = ([Char]
 -> (Ptr CWchar -> IO NLSVERSIONINFOEX) -> IO NLSVERSIONINFOEX)
-> Maybe [Char]
-> (Ptr CWchar -> IO NLSVERSIONINFOEX)
-> IO NLSVERSIONINFOEX
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith [Char]
-> (Ptr CWchar -> IO NLSVERSIONINFOEX) -> IO NLSVERSIONINFOEX
forall a. [Char] -> (Ptr CWchar -> IO a) -> IO a
withTString Maybe [Char]
locale ((Ptr CWchar -> IO NLSVERSIONINFOEX) -> IO NLSVERSIONINFOEX)
-> (Ptr CWchar -> IO NLSVERSIONINFOEX) -> IO NLSVERSIONINFOEX
forall a b. (a -> b) -> a -> b
$ \Ptr CWchar
c_locale ->
  NLSVERSIONINFOEX
-> (Ptr NLSVERSIONINFOEX -> IO NLSVERSIONINFOEX)
-> IO NLSVERSIONINFOEX
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with NLSVERSIONINFOEX
defaultVersionInfo ((Ptr NLSVERSIONINFOEX -> IO NLSVERSIONINFOEX)
 -> IO NLSVERSIONINFOEX)
-> (Ptr NLSVERSIONINFOEX -> IO NLSVERSIONINFOEX)
-> IO NLSVERSIONINFOEX
forall a b. (a -> b) -> a -> b
$ \Ptr NLSVERSIONINFOEX
c_versionInfo -> do
    [Char] -> IO Bool -> IO ()
failIfFalse_ [Char]
"GetNLSVersionEx" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$
      Word32 -> Ptr CWchar -> Ptr NLSVERSIONINFOEX -> IO Bool
c_GetNLSVersionEx Word32
function Ptr CWchar
c_locale Ptr NLSVERSIONINFOEX
c_versionInfo
    Ptr NLSVERSIONINFOEX -> IO NLSVERSIONINFOEX
forall a. Storable a => Ptr a -> IO a
peek Ptr NLSVERSIONINFOEX
c_versionInfo
 where
  function :: Word32
function = Word32
1
{-# LINE 442 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
  defaultVersionInfo = NLSVERSIONINFOEX
    { dwNLSVersionInfoSize = (32)
{-# LINE 444 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}
    , dwNLSVersion = 0
    , dwDefinedVersion = 0
    , dwEffectiveId = 0
    , guidCustomVersion = GUID 0 0 0 0 0 0 0 0 0 0 0
    }
foreign import WINDOWS_CCONV unsafe "windows.h GetNLSVersionEx"
  c_GetNLSVersionEx :: NLS_FUNCTION
                    -> LPCWSTR
                    -> Ptr NLSVERSIONINFOEX
                    -> IO Bool

lCMapStringEx :: Maybe String
              -> LCMapFlags
              -> String
              -> NLSVERSIONINFOEX
              -> IO String
lCMapStringEx :: Maybe [Char] -> Word32 -> [Char] -> NLSVERSIONINFOEX -> IO [Char]
lCMapStringEx Maybe [Char]
locale Word32
flags [Char]
src NLSVERSIONINFOEX
versionInfo =
  ([Char] -> (Ptr CWchar -> IO [Char]) -> IO [Char])
-> Maybe [Char] -> (Ptr CWchar -> IO [Char]) -> IO [Char]
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith [Char] -> (Ptr CWchar -> IO [Char]) -> IO [Char]
forall a. [Char] -> (Ptr CWchar -> IO a) -> IO a
withTString Maybe [Char]
locale ((Ptr CWchar -> IO [Char]) -> IO [Char])
-> (Ptr CWchar -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \Ptr CWchar
c_locale ->
    [Char] -> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a. [Char] -> ((Ptr CWchar, Int) -> IO a) -> IO a
withTStringLen [Char]
src (((Ptr CWchar, Int) -> IO [Char]) -> IO [Char])
-> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \(Ptr CWchar
c_src, Int
src_len) ->
      NLSVERSIONINFOEX
-> (Ptr NLSVERSIONINFOEX -> IO [Char]) -> IO [Char]
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with NLSVERSIONINFOEX
versionInfo ((Ptr NLSVERSIONINFOEX -> IO [Char]) -> IO [Char])
-> (Ptr NLSVERSIONINFOEX -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \Ptr NLSVERSIONINFOEX
c_versionInfo -> do
        let c_src_len :: CInt
c_src_len = Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
src_len
            c_func :: Ptr CWchar -> CInt -> IO CInt
c_func Ptr CWchar
s CInt
l = Ptr CWchar
-> Word32
-> Ptr CWchar
-> CInt
-> Ptr CWchar
-> CInt
-> Ptr NLSVERSIONINFOEX
-> LPVOID
-> CIntPtr
-> IO CInt
c_LCMapStringEx Ptr CWchar
c_locale
                                         Word32
flags
                                         Ptr CWchar
c_src CInt
c_src_len
                                         Ptr CWchar
s CInt
l
                                         Ptr NLSVERSIONINFOEX
c_versionInfo
                                         LPVOID
forall a. Ptr a
nullPtr -- Reserved, must be NULL

                                         CIntPtr
0 -- Reserved, must be 0

        [Char] -> (Ptr CWchar -> CInt -> IO CInt) -> IO [Char]
trySized [Char]
"LCMapStringEx" Ptr CWchar -> CInt -> IO CInt
c_func
foreign import WINDOWS_CCONV unsafe "windows.h LCMapStringEx"
  c_LCMapStringEx :: LPCWSTR
                  -> LCMapFlags
                  -> LPCWSTR
                  -> CInt
                  -> LPWSTR
                  -> CInt
                  -> Ptr NLSVERSIONINFOEX
                  -> LPVOID
                  -> LPARAM
                  -> IO CInt

lCMapString :: LCID -> LCMapFlags -> String -> Int -> IO String
lCMapString :: Word32 -> Word32 -> [Char] -> Int -> IO [Char]
lCMapString Word32
locale Word32
flags [Char]
src Int
dest_size =
  [Char] -> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a. [Char] -> ((Ptr CWchar, Int) -> IO a) -> IO a
withTStringLen [Char]
src (((Ptr CWchar, Int) -> IO [Char]) -> IO [Char])
-> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \ (Ptr CWchar
c_src, Int
src_len) ->
  Int -> (Ptr CWchar -> IO [Char]) -> IO [Char]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
dest_size ((Ptr CWchar -> IO [Char]) -> IO [Char])
-> (Ptr CWchar -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \ Ptr CWchar
c_dest -> do
  _ <- [Char] -> IO Int -> IO Int
forall a. (Eq a, Num a) => [Char] -> IO a -> IO a
failIfZero [Char]
"LCMapString" (IO Int -> IO Int) -> IO Int -> IO Int
forall a b. (a -> b) -> a -> b
$
    Word32
-> Word32 -> Ptr CWchar -> Int -> Ptr CWchar -> Int -> IO Int
c_LCMapString Word32
locale Word32
flags Ptr CWchar
c_src Int
src_len Ptr CWchar
c_dest Int
dest_size
  peekTString c_dest
foreign import WINDOWS_CCONV unsafe "windows.h LCMapStringW"
  c_LCMapString :: LCID -> LCMapFlags -> LPCTSTR -> Int -> LPCTSTR -> Int -> IO Int

type LocaleTestFlags = DWORD

lCID_INSTALLED        :: LocaleTestFlags
lCID_INSTALLED :: Word32
lCID_INSTALLED        =  Word32
1
lCID_SUPPORTED        :: LocaleTestFlags
lCID_SUPPORTED :: Word32
lCID_SUPPORTED        =  Word32
2

{-# LINE 501 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

isValidLocaleName :: Maybe String -> IO Bool
isValidLocaleName :: Maybe [Char] -> IO Bool
isValidLocaleName Maybe [Char]
lpLocaleName =
  ([Char] -> (Ptr CWchar -> IO Bool) -> IO Bool)
-> Maybe [Char] -> (Ptr CWchar -> IO Bool) -> IO Bool
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith [Char] -> (Ptr CWchar -> IO Bool) -> IO Bool
forall a. [Char] -> (Ptr CWchar -> IO a) -> IO a
withTString Maybe [Char]
lpLocaleName Ptr CWchar -> IO Bool
c_IsValidLocaleName
foreign import WINDOWS_CCONV unsafe "windows.h IsValidLocaleName"
  c_IsValidLocaleName :: LPCWSTR -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h IsValidLocale"
  isValidLocale :: LCID -> LocaleTestFlags -> IO Bool

type EnumLocalesFlag = DWORD

-- The following locale enumeration flag constants are excluded from the `enum`

-- list below, for the reason indicated:

-- LOCALE_NEUTRALDATA -- Introduced in Windows 7 but not supported.


lOCALE_ALL              :: EnumLocalesFlag
lOCALE_ALL :: Word32
lOCALE_ALL              =  Word32
0
lOCALE_ALTERNATE_SORTS  :: EnumLocalesFlag
lOCALE_ALTERNATE_SORTS :: Word32
lOCALE_ALTERNATE_SORTS  =  Word32
4
lOCALE_REPLACEMENT      :: EnumLocalesFlag
lOCALE_REPLACEMENT :: Word32
lOCALE_REPLACEMENT      =  Word32
8
lOCALE_SUPPLEMENTAL     :: EnumLocalesFlag
lOCALE_SUPPLEMENTAL :: Word32
lOCALE_SUPPLEMENTAL     =  Word32
2
lOCALE_WINDOWS          :: EnumLocalesFlag
lOCALE_WINDOWS :: Word32
lOCALE_WINDOWS          =  Word32
1

{-# LINE 524 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

type LOCALE_ENUMPROCEX = LPWSTR -> EnumLocalesFlag -> LPARAM -> IO BOOL
foreign import WINDOWS_CCONV "wrapper"
  mkLOCALE_ENUMPROCEX :: LOCALE_ENUMPROCEX -> IO (FunPtr LOCALE_ENUMPROCEX)

enumSystemLocalesEx :: LOCALE_ENUMPROCEX -> EnumLocalesFlag -> LPARAM -> IO ()
enumSystemLocalesEx :: LOCALE_ENUMPROCEX -> Word32 -> CIntPtr -> IO ()
enumSystemLocalesEx LOCALE_ENUMPROCEX
callback Word32
dwFlags CIntPtr
lParam = do
  c_callback <- LOCALE_ENUMPROCEX -> IO (FunPtr LOCALE_ENUMPROCEX)
mkLOCALE_ENUMPROCEX LOCALE_ENUMPROCEX
callback
  failIfFalse_ "EnumSystemLocalesEx" $
    c_EnumSystemLocalesEx c_callback dwFlags lParam nullPtr
  freeHaskellFunPtr c_callback
foreign import WINDOWS_CCONV safe "windows.h EnumSystemLocalesEx"
  c_EnumSystemLocalesEx :: (FunPtr LOCALE_ENUMPROCEX)
                        -> DWORD
                        -> LPARAM
                        -> LPVOID
                        -> IO Bool

enumSystemLocalesEx' :: EnumLocalesFlag
                     -> Maybe Bool
                     -- ^ Maybe include (or exclude) replacement locales?

                     -> IO [String]
enumSystemLocalesEx' :: Word32 -> Maybe Bool -> IO [[Char]]
enumSystemLocalesEx' Word32
dwFlags Maybe Bool
mIsReplacement = do
  store <- [[Char]] -> IO (IORef [[Char]])
forall a. a -> IO (IORef a)
newIORef []
  let localeEnumProcEx Ptr CWchar
c_locale Word32
arg2 p
_ = do
        locale <- Ptr CWchar -> IO [Char]
peekTString Ptr CWchar
c_locale
        case mIsReplacement of
          Maybe Bool
Nothing -> IORef [[Char]] -> ([[Char]] -> [[Char]]) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef IORef [[Char]]
store ([Char]
locale[Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
          Just Bool
isReplacement ->
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
isReplacement Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== (Word32
arg2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
lOCALE_REPLACEMENT Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word32
0)) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
              IORef [[Char]] -> ([[Char]] -> [[Char]]) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef IORef [[Char]]
store ([Char]
locale[Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
        return True
  enumSystemLocalesEx localeEnumProcEx dwFlags 0
  reverse <$> readIORef store

foreign import WINDOWS_CCONV unsafe "windows.h IsValidCodePage"
  isValidCodePage :: CodePage -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h GetUserDefaultLCID"
  getUserDefaultLCID :: LCID

foreign import WINDOWS_CCONV unsafe "windows.h GetUserDefaultLangID"
  getUserDefaultLangID :: LANGID

-- #define LOCALE_NAME_INVARIANT L""

lOCALE_NAME_INVARIANT :: Maybe String
lOCALE_NAME_INVARIANT :: Maybe [Char]
lOCALE_NAME_INVARIANT = [Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
""

 -- #define LOCALE_NAME_SYSTEM_DEFAULT L"!x-sys-default-locale"

lOCALE_NAME_SYSTEM_DEFAULT :: Maybe String
lOCALE_NAME_SYSTEM_DEFAULT :: Maybe [Char]
lOCALE_NAME_SYSTEM_DEFAULT = [Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
"!x-sys-default-locale"

 -- #define LOCALE_NAME_USER_DEFAULT NULL

lOCALE_NAME_USER_DEFAULT :: Maybe String
lOCALE_NAME_USER_DEFAULT :: Maybe [Char]
lOCALE_NAME_USER_DEFAULT = Maybe [Char]
forall a. Maybe a
Nothing

getUserDefaultLocaleName :: IO String
getUserDefaultLocaleName :: IO [Char]
getUserDefaultLocaleName =
  [Char] -> (Ptr CWchar -> CInt -> IO CInt) -> IO [Char]
getDefaultLocaleName [Char]
"GetUserDefaultLocaleName" Ptr CWchar -> CInt -> IO CInt
c_GetUserDefaultLocaleName
foreign import WINDOWS_CCONV unsafe "windows.h GetUserDefaultLocaleName"
  c_GetUserDefaultLocaleName :: LPWSTR -> CInt -> IO CInt

lOCALE_NAME_MAX_LENGTH  :: CInt
lOCALE_NAME_MAX_LENGTH :: CInt
lOCALE_NAME_MAX_LENGTH  =  CInt
85

{-# LINE 589 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

-- |Helper function for use with 'c_GetUserDefaultLocaleName' or

-- 'c_GetSystemDefaultLocaleName'. See 'getUserDefaultLocaleName' and

-- 'getSystemUserDefaultLocaleName'.

getDefaultLocaleName :: String -> (LPWSTR -> CInt -> IO CInt) -> IO String
getDefaultLocaleName :: [Char] -> (Ptr CWchar -> CInt -> IO CInt) -> IO [Char]
getDefaultLocaleName [Char]
cDefaultLocaleFuncName Ptr CWchar -> CInt -> IO CInt
cDefaultLocaleFunc =
  Int -> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a. Int -> ((Ptr CWchar, Int) -> IO a) -> IO a
withTStringBufferLen Int
maxLength (((Ptr CWchar, Int) -> IO [Char]) -> IO [Char])
-> ((Ptr CWchar, Int) -> IO [Char]) -> IO [Char]
forall a b. (a -> b) -> a -> b
$ \(Ptr CWchar
buf, Int
len) -> do
    let c_len :: CInt
c_len = Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len
    c_len' <- [Char] -> IO CInt -> IO CInt
forall a. (Eq a, Num a) => [Char] -> IO a -> IO a
failIfZero [Char]
cDefaultLocaleFuncName (IO CInt -> IO CInt) -> IO CInt -> IO CInt
forall a b. (a -> b) -> a -> b
$
      Ptr CWchar -> CInt -> IO CInt
cDefaultLocaleFunc Ptr CWchar
buf CInt
c_len
    let len' = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
c_len'
    peekTStringLen (buf, len' - 1) -- Drop final null character

 where
  maxLength :: Int
maxLength = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
lOCALE_NAME_MAX_LENGTH

foreign import WINDOWS_CCONV unsafe "windows.h GetThreadLocale"
  getThreadLocale :: IO LCID

foreign import WINDOWS_CCONV unsafe "windows.h GetSystemDefaultLCID"
  getSystemDefaultLCID :: LCID

foreign import WINDOWS_CCONV unsafe "windows.h GetSystemDefaultLangID"
  getSystemDefaultLangID :: LANGID

getSystemDefaultLocaleName :: IO String
getSystemDefaultLocaleName :: IO [Char]
getSystemDefaultLocaleName =
  [Char] -> (Ptr CWchar -> CInt -> IO CInt) -> IO [Char]
getDefaultLocaleName [Char]
"GetSystemDefaultLocaleName" Ptr CWchar -> CInt -> IO CInt
c_GetSystemDefaultLocaleName
foreign import WINDOWS_CCONV unsafe "windows.h GetSystemDefaultLocaleName"
  c_GetSystemDefaultLocaleName :: LPWSTR -> CInt -> IO CInt

foreign import WINDOWS_CCONV unsafe "windows.h GetOEMCP"
  getOEMCP :: CodePage

lANG_NEUTRAL          :: PrimaryLANGID
lANG_NEUTRAL :: Word16
lANG_NEUTRAL          =  Word16
0
lANG_BULGARIAN        :: PrimaryLANGID
lANG_BULGARIAN :: Word16
lANG_BULGARIAN        =  Word16
2
lANG_CHINESE          :: PrimaryLANGID
lANG_CHINESE :: Word16
lANG_CHINESE          =  Word16
4
lANG_CZECH            :: PrimaryLANGID
lANG_CZECH :: Word16
lANG_CZECH            =  Word16
5
lANG_DANISH           :: PrimaryLANGID
lANG_DANISH :: Word16
lANG_DANISH           =  Word16
6
lANG_GERMAN           :: PrimaryLANGID
lANG_GERMAN :: Word16
lANG_GERMAN           =  Word16
7
lANG_GREEK            :: PrimaryLANGID
lANG_GREEK :: Word16
lANG_GREEK            =  Word16
8
lANG_ENGLISH          :: PrimaryLANGID
lANG_ENGLISH :: Word16
lANG_ENGLISH          =  Word16
9
lANG_SPANISH          :: PrimaryLANGID
lANG_SPANISH :: Word16
lANG_SPANISH          =  Word16
10
lANG_FINNISH          :: PrimaryLANGID
lANG_FINNISH :: Word16
lANG_FINNISH          =  Word16
11
lANG_FRENCH           :: PrimaryLANGID
lANG_FRENCH :: Word16
lANG_FRENCH           =  Word16
12
lANG_HUNGARIAN        :: PrimaryLANGID
lANG_HUNGARIAN :: Word16
lANG_HUNGARIAN        =  Word16
14
lANG_ICELANDIC        :: PrimaryLANGID
lANG_ICELANDIC :: Word16
lANG_ICELANDIC        =  Word16
15
lANG_ITALIAN          :: PrimaryLANGID
lANG_ITALIAN :: Word16
lANG_ITALIAN          =  Word16
16
lANG_JAPANESE         :: PrimaryLANGID
lANG_JAPANESE :: Word16
lANG_JAPANESE         =  Word16
17
lANG_KOREAN           :: PrimaryLANGID
lANG_KOREAN :: Word16
lANG_KOREAN           =  Word16
18
lANG_DUTCH            :: PrimaryLANGID
lANG_DUTCH :: Word16
lANG_DUTCH            =  Word16
19
lANG_NORWEGIAN        :: PrimaryLANGID
lANG_NORWEGIAN :: Word16
lANG_NORWEGIAN        =  Word16
20
lANG_POLISH           :: PrimaryLANGID
lANG_POLISH :: Word16
lANG_POLISH           =  Word16
21
lANG_PORTUGUESE       :: PrimaryLANGID
lANG_PORTUGUESE :: Word16
lANG_PORTUGUESE       =  Word16
22
lANG_ROMANIAN         :: PrimaryLANGID
lANG_ROMANIAN :: Word16
lANG_ROMANIAN         =  Word16
24
lANG_RUSSIAN          :: PrimaryLANGID
lANG_RUSSIAN :: Word16
lANG_RUSSIAN          =  Word16
25
lANG_CROATIAN         :: PrimaryLANGID
lANG_CROATIAN :: Word16
lANG_CROATIAN         =  Word16
26
lANG_SLOVAK           :: PrimaryLANGID
lANG_SLOVAK :: Word16
lANG_SLOVAK           =  Word16
27
lANG_SWEDISH          :: PrimaryLANGID
lANG_SWEDISH :: Word16
lANG_SWEDISH          =  Word16
29
lANG_TURKISH          :: PrimaryLANGID
lANG_TURKISH :: Word16
lANG_TURKISH          =  Word16
31
lANG_SLOVENIAN        :: PrimaryLANGID
lANG_SLOVENIAN :: Word16
lANG_SLOVENIAN        =  Word16
36
lANG_ARABIC           :: PrimaryLANGID
lANG_ARABIC :: Word16
lANG_ARABIC           =  Word16
1
lANG_CATALAN          :: PrimaryLANGID
lANG_CATALAN :: Word16
lANG_CATALAN          =  Word16
3
lANG_HEBREW           :: PrimaryLANGID
lANG_HEBREW :: Word16
lANG_HEBREW           =  Word16
13
lANG_SERBIAN          :: PrimaryLANGID
lANG_SERBIAN :: Word16
lANG_SERBIAN          =  Word16
26
lANG_ALBANIAN         :: PrimaryLANGID
lANG_ALBANIAN :: Word16
lANG_ALBANIAN         =  Word16
28
lANG_THAI             :: PrimaryLANGID
lANG_THAI :: Word16
lANG_THAI             =  Word16
30
lANG_URDU             :: PrimaryLANGID
lANG_URDU :: Word16
lANG_URDU             =  Word16
32
lANG_INDONESIAN       :: PrimaryLANGID
lANG_INDONESIAN :: Word16
lANG_INDONESIAN       =  Word16
33
lANG_BELARUSIAN       :: PrimaryLANGID
lANG_BELARUSIAN :: Word16
lANG_BELARUSIAN       =  Word16
35
lANG_ESTONIAN         :: PrimaryLANGID
lANG_ESTONIAN :: Word16
lANG_ESTONIAN         =  Word16
37
sORT_DEFAULT :: Word16
lANG_LATVIAN          :: PrimaryLANGID
lANG_LATVIAN :: Word16
lANG_LATVIAN          =  Word16
38
lANG_LITHUANIAN       :: PrimaryLANGID
lANG_LITHUANIAN :: Word16
lANG_LITHUANIAN       =  Word16
39
lANG_FARSI            :: PrimaryLANGID
lANG_FARSI :: Word16
lANG_FARSI            =  Word16
41
lANG_VIETNAMESE       :: PrimaryLANGID
lANG_VIETNAMESE :: Word16
lANG_VIETNAMESE       =  Word16
42
lANG_ARMENIAN         :: PrimaryLANGID
lANG_ARMENIAN :: Word16
lANG_ARMENIAN         =  Word16
43
lANG_AZERI            :: PrimaryLANGID
lANG_AZERI :: Word16
lANG_AZERI            =  Word16
44
lANG_BASQUE           :: PrimaryLANGID
lANG_BASQUE :: Word16
lANG_BASQUE           =  Word16
45
lANG_MACEDONIAN       :: PrimaryLANGID
lANG_MACEDONIAN :: Word16
lANG_MACEDONIAN       =  Word16
47
lANG_AFRIKAANS        :: PrimaryLANGID
lANG_AFRIKAANS :: Word16
lANG_AFRIKAANS        =  54
lANG_GEORGIAN         :: PrimaryLANGID
lANG_GEORGIAN :: Word16
lANG_GEORGIAN         =  55
lANG_FAEROESE         :: PrimaryLANGID
lANG_FAEROESE :: Word16
lANG_FAEROESE         =  56
lANG_HINDI            :: PrimaryLANGID
lANG_HINDI :: Word16
lANG_HINDI            =  Word16
57
lANG_MALAY            :: PrimaryLANGID
lANG_MALAY :: Word16
lANG_MALAY            =  Word16
62
lANG_KAZAK            :: PrimaryLANGID
lANG_KAZAK :: Word16
lANG_KAZAK            =  Word16
63
lANG_SWAHILI          :: PrimaryLANGID
lANG_SWAHILI :: Word16
lANG_SWAHILI          =  Word16
65
lANG_UZBEK            :: PrimaryLANGID
lANG_UZBEK :: Word16
lANG_UZBEK            =  Word16
67
lANG_TATAR            :: PrimaryLANGID
lANG_TATAR :: Word16
lANG_TATAR            =  Word16
68
lANG_BENGALI          :: PrimaryLANGID
lANG_BENGALI :: Word16
lANG_BENGALI          =  Word16
69
lANG_PUNJABI          :: PrimaryLANGID
lANG_PUNJABI :: Word16
lANG_PUNJABI          =  Word16
70
lANG_GUJARATI         :: PrimaryLANGID
lANG_GUJARATI :: Word16
lANG_GUJARATI         =  Word16
71
lANG_ORIYA            :: PrimaryLANGID
lANG_ORIYA :: Word16
lANG_ORIYA            =  Word16
72
lANG_TAMIL            :: PrimaryLANGID
lANG_TAMIL :: Word16
lANG_TAMIL            =  73
lANG_TELUGU           :: PrimaryLANGID
lANG_TELUGU :: Word16
lANG_TELUGU           =  Word16
74
lANG_KANNADA          :: PrimaryLANGID
lANG_KANNADA :: Word16
lANG_KANNADA          =  Word16
75
sUBLANG_GERMAN :: Word16
lANG_MALAYALAM        :: PrimaryLANGID
lANG_MALAYALAM :: Word16
lANG_MALAYALAM        =  Word16
76
lANG_ASSAMESE         :: PrimaryLANGID
lANG_ASSAMESE :: Word16
lANG_ASSAMESE         =  77
lANG_MARATHI          :: PrimaryLANGID
lANG_MARATHI :: Word16
lANG_MARATHI          =  Word16
78
lANG_SANSKRIT         :: PrimaryLANGID
lANG_SANSKRIT :: Word16
lANG_SANSKRIT         =  Word16
79
lANG_KONKANI          :: PrimaryLANGID
lANG_KONKANI :: Word16
lANG_KONKANI          =  87
lANG_MANIPURI         :: PrimaryLANGID
lANG_MANIPURI :: Word16
lANG_MANIPURI         =  88
lANG_SINDHI           :: PrimaryLANGID
lANG_SINDHI :: Word16
lANG_SINDHI           =  Word16
89
lANG_KASHMIRI         :: PrimaryLANGID
lANG_KASHMIRI :: Word16
lANG_KASHMIRI         =  Word16
96
lANG_NEPALI           :: PrimaryLANGID
lANG_NEPALI :: Word16
lANG_NEPALI           =  Word16
97

{-# LINE 694 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

sORT_DEFAULT          :: SortID
sORT_DEFAULT          =  0
sORT_JAPANESE_XJIS    :: SortID
sORT_JAPANESE_XJIS    =  0
sORT_JAPANESE_UNICODE  :: SortID
sORT_JAPANESE_UNICODE  =  1
sORT_CHINESE_BIG5     :: SortID
sORT_CHINESE_BIG5     =  0
sORT_CHINESE_UNICODE  :: SortID
sORT_CHINESE_UNICODE  =  1
sORT_KOREAN_KSC       :: SortID
sORT_KOREAN_KSC       =  0
sORT_KOREAN_UNICODE   :: SortID
sORT_KOREAN_UNICODE   =  1

{-# LINE 704 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

sUBLANG_NEUTRAL                       :: SubLANGID
sUBLANG_NEUTRAL                       =  0
sUBLANG_DEFAULT                       :: SubLANGID
sUBLANG_DEFAULT                       =  1
sUBLANG_SYS_DEFAULT                   :: SubLANGID
sUBLANG_SYS_DEFAULT                   =  2
sUBLANG_CHINESE_TRADITIONAL           :: SubLANGID
sUBLANG_CHINESE_TRADITIONAL           =  1
sUBLANG_CHINESE_SIMPLIFIED            :: SubLANGID
sUBLANG_CHINESE_SIMPLIFIED            =  2
sUBLANG_CHINESE_HONGKONG              :: SubLANGID
sUBLANG_CHINESE_HONGKONG              =  3
sUBLANG_CHINESE_SINGAPORE             :: SubLANGID
sUBLANG_CHINESE_SINGAPORE             =  4
sUBLANG_DUTCH                         :: SubLANGID
sUBLANG_DUTCH                         =  1
sUBLANG_DUTCH_BELGIAN                 :: SubLANGID
sUBLANG_DUTCH_BELGIAN                 =  2
sUBLANG_ENGLISH_US                    :: SubLANGID
sUBLANG_ENGLISH_US                    =  1
sUBLANG_ENGLISH_UK                    :: SubLANGID
sUBLANG_ENGLISH_UK                    =  2
sUBLANG_ENGLISH_AUS                   :: SubLANGID
sUBLANG_ENGLISH_AUS                   =  3
sUBLANG_ENGLISH_CAN                   :: SubLANGID
sUBLANG_ENGLISH_CAN                   =  4
sUBLANG_ENGLISH_NZ                    :: SubLANGID
sUBLANG_ENGLISH_NZ                    =  5
sUBLANG_ENGLISH_EIRE                  :: SubLANGID
sUBLANG_ENGLISH_EIRE                  =  6
sUBLANG_FRENCH                        :: SubLANGID
sUBLANG_FRENCH                        =  1
sUBLANG_FRENCH_BELGIAN                :: SubLANGID
sUBLANG_FRENCH_BELGIAN                =  2
sUBLANG_FRENCH_CANADIAN               :: SubLANGID
sUBLANG_FRENCH_CANADIAN               =  3
sUBLANG_FRENCH_SWISS                  :: SubLANGID
sUBLANG_FRENCH_SWISS                  =  4
sUBLANG_GERMAN                        :: SubLANGID
sUBLANG_GERMAN                        =  1
sUBLANG_GERMAN_SWISS                  :: SubLANGID
sUBLANG_GERMAN_SWISS                  =  2
sUBLANG_GERMAN_AUSTRIAN               :: SubLANGID
sUBLANG_GERMAN_AUSTRIAN               =  3
sUBLANG_ITALIAN                       :: SubLANGID
sUBLANG_ITALIAN                       =  1
sUBLANG_ITALIAN_SWISS                 :: SubLANGID
sUBLANG_ITALIAN_SWISS                 =  2
sUBLANG_NORWEGIAN_BOKMAL              :: SubLANGID
sUBLANG_NORWEGIAN_BOKMAL              =  1
sUBLANG_NORWEGIAN_NYNORSK             :: SubLANGID
sUBLANG_NORWEGIAN_NYNORSK             =  2
sUBLANG_PORTUGUESE                    :: SubLANGID
sUBLANG_PORTUGUESE                    =  2
sUBLANG_PORTUGUESE_BRAZILIAN          :: SubLANGID
sUBLANG_PORTUGUESE_BRAZILIAN          =  1
sUBLANG_SPANISH                       :: SubLANGID
sUBLANG_SPANISH                       =  1
sUBLANG_SPANISH_MEXICAN               :: SubLANGID
sUBLANG_SPANISH_MEXICAN :: Word16
sUBLANG_SPANISH_MEXICAN               =  Word16
2
sUBLANG_SPANISH_MODERN                :: SubLANGID
sUBLANG_SPANISH_MODERN :: Word16
sUBLANG_SPANISH_MODERN                =  Word16
3
sUBLANG_ARABIC_SAUDI_ARABIA           :: SubLANGID
sUBLANG_ARABIC_SAUDI_ARABIA :: Word16
sUBLANG_ARABIC_SAUDI_ARABIA           =  Word16
1
sUBLANG_ARABIC_IRAQ                   :: SubLANGID
sUBLANG_ARABIC_IRAQ :: Word16
sUBLANG_ARABIC_IRAQ                   =  Word16
2
sUBLANG_ARABIC_EGYPT                  :: SubLANGID
sUBLANG_ARABIC_EGYPT :: Word16
sUBLANG_ARABIC_EGYPT                  =  Word16
3
sUBLANG_ARABIC_LIBYA                  :: SubLANGID
sUBLANG_ARABIC_LIBYA :: Word16
sUBLANG_ARABIC_LIBYA                  =  Word16
4
sUBLANG_ARABIC_ALGERIA                :: SubLANGID
sUBLANG_ARABIC_ALGERIA :: Word16
sUBLANG_ARABIC_ALGERIA                =  Word16
5
sUBLANG_ARABIC_MOROCCO                :: SubLANGID
sUBLANG_ARABIC_MOROCCO :: Word16
sUBLANG_ARABIC_MOROCCO                =  Word16
6
sUBLANG_ARABIC_TUNISIA                :: SubLANGID
sUBLANG_ARABIC_TUNISIA :: Word16
sUBLANG_ARABIC_TUNISIA                =  Word16
7
sUBLANG_ARABIC_OMAN                   :: SubLANGID
sUBLANG_ARABIC_OMAN :: Word16
sUBLANG_ARABIC_OMAN                   =  Word16
8
sUBLANG_ARABIC_YEMEN                  :: SubLANGID
sUBLANG_ARABIC_YEMEN :: Word16
sUBLANG_ARABIC_YEMEN                  =  Word16
9
sUBLANG_ARABIC_SYRIA                  :: SubLANGID
sUBLANG_ARABIC_SYRIA :: Word16
sUBLANG_ARABIC_SYRIA                  =  Word16
10
sUBLANG_ARABIC_JORDAN                 :: SubLANGID
sUBLANG_ARABIC_JORDAN :: Word16
sUBLANG_ARABIC_JORDAN                 =  Word16
11
sUBLANG_ARABIC_LEBANON                :: SubLANGID
sUBLANG_ARABIC_LEBANON :: Word16
sUBLANG_ARABIC_LEBANON                =  Word16
12
sUBLANG_ARABIC_KUWAIT                 :: SubLANGID
sUBLANG_ARABIC_KUWAIT :: Word16
sUBLANG_ARABIC_KUWAIT                 =  Word16
13
sUBLANG_ARABIC_UAE                    :: SubLANGID
sUBLANG_ARABIC_UAE :: Word16
sUBLANG_ARABIC_UAE                    =  Word16
14
sUBLANG_ARABIC_BAHRAIN                :: SubLANGID
sUBLANG_ARABIC_BAHRAIN :: Word16
sUBLANG_ARABIC_BAHRAIN                =  Word16
15
sUBLANG_ARABIC_QATAR                  :: SubLANGID
sUBLANG_ARABIC_QATAR :: Word16
sUBLANG_ARABIC_QATAR                  =  Word16
16
sUBLANG_AZERI_CYRILLIC                :: SubLANGID
sUBLANG_AZERI_CYRILLIC :: Word16
sUBLANG_AZERI_CYRILLIC                =  Word16
2
sUBLANG_AZERI_LATIN                   :: SubLANGID
sUBLANG_AZERI_LATIN :: Word16
sUBLANG_AZERI_LATIN                   =  Word16
1
sUBLANG_CHINESE_MACAU                 :: SubLANGID
sUBLANG_CHINESE_MACAU :: Word16
sUBLANG_CHINESE_MACAU                 =  Word16
5
sUBLANG_ENGLISH_SOUTH_AFRICA          :: SubLANGID
sUBLANG_ENGLISH_SOUTH_AFRICA :: Word16
sUBLANG_ENGLISH_SOUTH_AFRICA          =  Word16
7
sUBLANG_ENGLISH_JAMAICA               :: SubLANGID
sUBLANG_ENGLISH_JAMAICA               =  8
sUBLANG_ENGLISH_CARIBBEAN             :: SubLANGID
sUBLANG_ENGLISH_CARIBBEAN :: Word16
sUBLANG_ENGLISH_CARIBBEAN             =  Word16
9
sUBLANG_ENGLISH_BELIZE                :: SubLANGID
sUBLANG_ENGLISH_BELIZE :: Word16
sUBLANG_ENGLISH_BELIZE                =  Word16
10
sUBLANG_ENGLISH_TRINIDAD              :: SubLANGID
sUBLANG_ENGLISH_TRINIDAD :: Word16
sUBLANG_ENGLISH_TRINIDAD              =  Word16
11
sUBLANG_ENGLISH_PHILIPPINES           :: SubLANGID
sUBLANG_ENGLISH_PHILIPPINES           =  13
sUBLANG_ENGLISH_ZIMBABWE              :: SubLANGID
sUBLANG_ENGLISH_ZIMBABWE              =  12
sUBLANG_FRENCH_LUXEMBOURG             :: SubLANGID
sUBLANG_FRENCH_LUXEMBOURG             =  5
sUBLANG_FRENCH_MONACO                 :: SubLANGID
sUBLANG_FRENCH_MONACO :: Word16
sUBLANG_FRENCH_MONACO                 =  Word16
6
sUBLANG_GERMAN_LUXEMBOURG             :: SubLANGID
sUBLANG_GERMAN_LUXEMBOURG             =  4
sUBLANG_GERMAN_LIECHTENSTEIN          :: SubLANGID
sUBLANG_GERMAN_LIECHTENSTEIN          =  5
sUBLANG_KASHMIRI_INDIA                :: SubLANGID
sUBLANG_KASHMIRI_INDIA                =  2
sUBLANG_KOREAN                        :: SubLANGID
sUBLANG_KOREAN :: Word16
sUBLANG_KOREAN                        =  Word16
1
sUBLANG_LITHUANIAN                    :: SubLANGID
sUBLANG_LITHUANIAN :: Word16
sUBLANG_LITHUANIAN                    =  Word16
1
sUBLANG_MALAY_MALAYSIA                :: SubLANGID
sUBLANG_MALAY_MALAYSIA :: Word16
sUBLANG_MALAY_MALAYSIA                =  Word16
1
sUBLANG_MALAY_BRUNEI_DARUSSALAM       :: SubLANGID
sUBLANG_MALAY_BRUNEI_DARUSSALAM :: Word16
sUBLANG_MALAY_BRUNEI_DARUSSALAM       =  Word16
2
sUBLANG_NEPALI_INDIA                  :: SubLANGID
sUBLANG_NEPALI_INDIA :: Word16
sUBLANG_NEPALI_INDIA                  =  Word16
2
sUBLANG_SERBIAN_LATIN                 :: SubLANGID
sUBLANG_SERBIAN_LATIN :: Word16
sUBLANG_SERBIAN_LATIN                 =  Word16
2
sUBLANG_SERBIAN_CYRILLIC              :: SubLANGID
sUBLANG_SERBIAN_CYRILLIC :: Word16
sUBLANG_SERBIAN_CYRILLIC              =  Word16
3
sUBLANG_SPANISH_GUATEMALA             :: SubLANGID
sUBLANG_SPANISH_GUATEMALA :: Word16
sUBLANG_SPANISH_GUATEMALA             =  Word16
4
sUBLANG_SPANISH_COSTA_RICA            :: SubLANGID
sUBLANG_SPANISH_COSTA_RICA :: Word16
sUBLANG_SPANISH_COSTA_RICA            =  Word16
5
sUBLANG_SPANISH_PANAMA                :: SubLANGID
sUBLANG_SPANISH_PANAMA :: Word16
sUBLANG_SPANISH_PANAMA                =  Word16
6
sUBLANG_SPANISH_DOMINICAN_REPUBLIC    :: SubLANGID
sUBLANG_SPANISH_DOMINICAN_REPUBLIC :: Word16
sUBLANG_SPANISH_DOMINICAN_REPUBLIC    =  Word16
7
sUBLANG_SPANISH_VENEZUELA             :: SubLANGID
sUBLANG_SPANISH_VENEZUELA :: Word16
sUBLANG_SPANISH_VENEZUELA             =  Word16
8
sUBLANG_SPANISH_COLOMBIA              :: SubLANGID
sUBLANG_SPANISH_COLOMBIA :: Word16
sUBLANG_SPANISH_COLOMBIA              =  Word16
9
sUBLANG_SPANISH_PERU                  :: SubLANGID
sUBLANG_SPANISH_PERU :: Word16
sUBLANG_SPANISH_PERU                  =  Word16
10
sUBLANG_SPANISH_ARGENTINA             :: SubLANGID
sUBLANG_SPANISH_ARGENTINA :: Word16
sUBLANG_SPANISH_ARGENTINA             =  Word16
11
sUBLANG_SPANISH_ECUADOR               :: SubLANGID
sUBLANG_SPANISH_ECUADOR :: Word16
sUBLANG_SPANISH_ECUADOR               =  Word16
12
sUBLANG_SPANISH_CHILE                 :: SubLANGID
sUBLANG_SPANISH_CHILE :: Word16
sUBLANG_SPANISH_CHILE                 =  Word16
13
sUBLANG_SPANISH_URUGUAY               :: SubLANGID
sUBLANG_SPANISH_URUGUAY :: Word16
sUBLANG_SPANISH_URUGUAY               =  Word16
14
sUBLANG_SPANISH_PARAGUAY              :: SubLANGID
sUBLANG_SPANISH_PARAGUAY :: Word16
sUBLANG_SPANISH_PARAGUAY              =  Word16
15
sUBLANG_SPANISH_BOLIVIA               :: SubLANGID
sUBLANG_SPANISH_BOLIVIA :: Word16
sUBLANG_SPANISH_BOLIVIA               =  Word16
16
sUBLANG_SPANISH_EL_SALVADOR           :: SubLANGID
sUBLANG_SPANISH_EL_SALVADOR :: Word16
sUBLANG_SPANISH_EL_SALVADOR           =  Word16
17
sUBLANG_SPANISH_HONDURAS              :: SubLANGID
sUBLANG_SPANISH_HONDURAS :: Word16
sUBLANG_SPANISH_HONDURAS              =  Word16
18
sUBLANG_SPANISH_NICARAGUA             :: SubLANGID
sUBLANG_SPANISH_NICARAGUA :: Word16
sUBLANG_SPANISH_NICARAGUA             =  Word16
19
sUBLANG_SPANISH_PUERTO_RICO           :: SubLANGID
sUBLANG_SPANISH_PUERTO_RICO :: Word16
sUBLANG_SPANISH_PUERTO_RICO           =  Word16
20
sUBLANG_SWEDISH                       :: SubLANGID
sUBLANG_SWEDISH :: Word16
sUBLANG_SWEDISH                       =  Word16
1
sUBLANG_SWEDISH_FINLAND               :: SubLANGID
sUBLANG_SWEDISH_FINLAND :: Word16
sUBLANG_SWEDISH_FINLAND               =  Word16
2
sUBLANG_URDU_PAKISTAN                 :: SubLANGID
sUBLANG_URDU_PAKISTAN :: Word16
sUBLANG_URDU_PAKISTAN                 =  Word16
1
sUBLANG_URDU_INDIA                    :: SubLANGID
sUBLANG_URDU_INDIA :: Word16
sUBLANG_URDU_INDIA                    =  Word16
2
sUBLANG_UZBEK_LATIN                   :: SubLANGID
sUBLANG_UZBEK_LATIN :: Word16
sUBLANG_UZBEK_LATIN                   =  Word16
1
sUBLANG_UZBEK_CYRILLIC                :: SubLANGID
sUBLANG_UZBEK_CYRILLIC :: Word16
sUBLANG_UZBEK_CYRILLIC                =  Word16
2

{-# LINE 799 "libraries\\Win32\\System\\Win32\\NLS.hsc" #-}

-- , SUBLANG_LITHUANIAN_CLASSIC (not in mingw-20001111)


-- ----------------------------------------------------------------------------


-- | The `System.IO` input functions (e.g., `getLine`) don't

-- automatically convert to Unicode, so this function is provided to

-- make the conversion from a multibyte string in the given code page

-- to a proper Unicode string.  To get the code page for the console,

-- use `getConsoleCP`.


stringToUnicode :: CodePage -> String -> IO String
stringToUnicode _cp "" = return ""
     -- MultiByteToWideChar doesn't handle empty strings (#1929)

stringToUnicode cp mbstr =
  withCAStringLen mbstr $ \(cstr,len) -> do
    wchars <- failIfZero "MultiByteToWideChar" $ multiByteToWideChar
                cp
                0
                cstr
                (fromIntegral len)
                nullPtr 0
    -- wchars is the length of buffer required

    allocaArray (fromIntegral wchars) $ \cwstr -> do
      wchars' <- failIfZero "MultiByteToWideChar" $ multiByteToWideChar
                cp
                0
                cstr
                (fromIntegral len)
                cwstr wchars
      peekCWStringLen (cwstr,fromIntegral wchars')  -- converts UTF-16 to [Char]


foreign import WINDOWS_CCONV unsafe "MultiByteToWideChar"
  multiByteToWideChar
        :: CodePage
        -> DWORD   -- dwFlags,

        -> LPCSTR  -- lpMultiByteStr

        -> CInt    -- cbMultiByte

        -> LPWSTR  -- lpWideCharStr

        -> CInt    -- cchWideChar

        -> IO CInt