#ifndef _WINNLS_H
#define _WINNLS_H

/* Windows NLS component definitions */

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_LEADBYTES  12
#define MAX_DEFAULTCHAR  2

#define CSTR_LESS_THAN  1
#define CSTR_EQUAL  2
#define CSTR_GREATER_THAN  3

#define CP_ACP  0
#define CP_OEMCP  1
#define CP_MACCP  2
#define CP_THREAD_ACP  3
#define CP_SYMBOL  42

#define CP_UTF7  65000
#define CP_UTF8  65001

#define MB_PRECOMPOSED  0x00000001
#define MB_COMPOSITE  0x00000002
#define MB_USEGLYPHCHARS  0x00000004
#define MB_ERR_INVALID_CHARS  0x00000008

#define WC_COMPOSITECHECK  0x00000200
#define WC_DISCARDNS  0x00000010
#define WC_SEPCHARS  0x00000020
#define WC_DEFAULTCHAR  0x00000040

#if (WINVER >= 0x0500)
#define WC_NO_BEST_FIT_CHARS  0x00000400
#endif

#define CT_CTYPE1  0x00000001
#define CT_CTYPE2  0x00000002
#define CT_CTYPE3  0x00000004

#define C1_UPPER  0x0001
#define C1_LOWER  0x0002
#define C1_DIGIT  0x0004
#define C1_SPACE  0x0008
#define C1_PUNCT  0x0010
#define C1_CNTRL  0x0020
#define C1_BLANK  0x0040
#define C1_XDIGIT  0x0080
#define C1_ALPHA  0x0100

#define C2_LEFTTORIGHT  0x0001
#define C2_RIGHTTOLEFT  0x0002
#define C2_EUROPENUMBER  0x0003
#define C2_EUROPESEPARATOR  0x0004
#define C2_EUROPETERMINATOR  0x0005
#define C2_ARABICNUMBER  0x0006
#define C2_COMMONSEPARATOR  0x0007
#define C2_BLOCKSEPARATOR  0x0008
#define C2_SEGMENTSEPARATOR  0x0009
#define C2_WHITESPACE  0x000A
#define C2_OTHERNEUTRAL  0x000B
#define C2_NOTAPPLICABLE  0x0000

#define C3_NONSPACING  0x0001
#define C3_DIACRITIC  0x0002
#define C3_VOWELMARK  0x0004
#define C3_SYMBOL  0x0008
#define C3_KATAKANA  0x0010
#define C3_HIRAGANA  0x0020
#define C3_HALFWIDTH  0x0040
#define C3_FULLWIDTH  0x0080
#define C3_IDEOGRAPH  0x0100
#define C3_KASHIDA  0x0200
#define C3_LEXICAL  0x0400
#define C3_ALPHA  0x8000
#define C3_NOTAPPLICABLE  0x0000

#define NORM_IGNORECASE  0x00000001
#define NORM_IGNORENONSPACE  0x00000002
#define NORM_IGNORESYMBOLS  0x00000004
#define NORM_IGNOREKANATYPE  0x00010000
#define NORM_IGNOREWIDTH  0x00020000

#define MAP_FOLDCZONE  0x00000010
#define MAP_PRECOMPOSED  0x00000020
#define MAP_COMPOSITE  0x00000040
#define MAP_FOLDDIGITS  0x00000080
#if (WINVER >= 0x0500)
#define MAP_EXPAND_LIGATURES  0x00002000
#endif

#define LCMAP_LOWERCASE  0x00000100
#define LCMAP_UPPERCASE  0x00000200
#define LCMAP_SORTKEY  0x00000400
#define LCMAP_BYTEREV  0x00000800
#define LCMAP_HIRAGANA  0x00100000
#define LCMAP_KATAKANA  0x00200000
#define LCMAP_HALFWIDTH  0x00400000
#define LCMAP_FULLWIDTH  0x00800000
#define LCMAP_LINGUISTIC_CASING  0x01000000
#define LCMAP_SIMPLIFIED_CHINESE  0x02000000
#define LCMAP_TRADITIONAL_CHINESE  0x04000000

#define LCID_INSTALLED  0x00000001
#define LCID_SUPPORTED  0x00000002
#define LCID_ALTERNATE_SORTS  0x00000004

#define CP_INSTALLED  0x00000001
#define CP_SUPPORTED  0x00000002

#define SORT_STRINGSORT  0x00001000

#define CTRY_DEFAULT  0
#define CTRY_ALBANIA  355
#define CTRY_ALGERIA  213
#define CTRY_ARGENTINA  54
#define CTRY_AUSTRALIA  61
#define CTRY_AUSTRIA  43
#define CTRY_BAHRAIN  973
#define CTRY_BELARUS  375
#define CTRY_BELGIUM  32
#define CTRY_BELIZE  501
#define CTRY_BOLIVIA  591
#define CTRY_BRAZIL  55
#define CTRY_BRUNEI_DARUSSALAM  673
#define CTRY_BULGARIA  359
#define CTRY_CANADA  2
#define CTRY_CARIBBEAN  1
#define CTRY_CHILE  56
#define CTRY_COLOMBIA  57
#define CTRY_COSTA_RICA  506
#define CTRY_CROATIA  385
#define CTRY_CZECH  420
#define CTRY_DENMARK  45
#define CTRY_DOMINICAN_REPUBLIC  1
#define CTRY_ECUADOR  593
#define CTRY_EGYPT  20
#define CTRY_EL_SALVADOR  503
#define CTRY_ESTONIA  372
#define CTRY_FAEROE_ISLANDS  298
#define CTRY_FINLAND  358
#define CTRY_FRANCE  33
#define CTRY_GERMANY  49
#define CTRY_GREECE  30
#define CTRY_GUATEMALA  502
#define CTRY_HONDURAS  504
#define CTRY_HONG_KONG  852
#define CTRY_HUNGARY  36
#define CTRY_ICELAND  354
#define CTRY_INDIA  91
#define CTRY_INDONESIA  62
#define CTRY_IRAN  981
#define CTRY_IRAQ  964
#define CTRY_IRELAND  353
#define CTRY_ISRAEL  972
#define CTRY_ITALY  39
#define CTRY_JAMAICA  1
#define CTRY_JAPAN  81
#define CTRY_JORDAN  962
#define CTRY_KENYA  254
#define CTRY_KUWAIT  965
#define CTRY_LATVIA  371
#define CTRY_LEBANON  961
#define CTRY_LIBYA  218
#define CTRY_LIECHTENSTEIN  41
#define CTRY_LITHUANIA  370
#define CTRY_LUXEMBOURG  352
#define CTRY_MACAU  853
#define CTRY_MACEDONIA  389
#define CTRY_MALAYSIA  60
#define CTRY_MEXICO  52
#define CTRY_MONACO  33
#define CTRY_MOROCCO  212
#define CTRY_NETHERLANDS  31
#define CTRY_NEW_ZEALAND  64
#define CTRY_NICARAGUA  505
#define CTRY_NORWAY  47
#define CTRY_OMAN  968
#define CTRY_PAKISTAN  92
#define CTRY_PANAMA  507
#define CTRY_PARAGUAY  595
#define CTRY_PERU  51
#define CTRY_PHILIPPINES  63
#define CTRY_POLAND  48
#define CTRY_PORTUGAL  351
#define CTRY_PRCHINA  86
#define CTRY_PUERTO_RICO  1
#define CTRY_QATAR  974
#define CTRY_ROMANIA  40
#define CTRY_RUSSIA  7
#define CTRY_SAUDI_ARABIA  966
#define CTRY_SERBIA  381
#define CTRY_SINGAPORE  65
#define CTRY_SLOVAK  421
#define CTRY_SLOVENIA  386
#define CTRY_SOUTH_AFRICA  27
#define CTRY_SOUTH_KOREA  82
#define CTRY_SPAIN  34
#define CTRY_SWEDEN  46
#define CTRY_SWITZERLAND  41
#define CTRY_SYRIA  963
#define CTRY_TAIWAN  886
#define CTRY_THAILAND  66
#define CTRY_TRINIDAD_Y_TOBAGO  1
#define CTRY_TUNISIA  216
#define CTRY_TURKEY  90
#define CTRY_UAE  971
#define CTRY_UKRAINE  380
#define CTRY_UNITED_KINGDOM  44
#define CTRY_UNITED_STATES  1
#define CTRY_URUGUAY  598
#define CTRY_VENEZUELA  58
#define CTRY_VIET_NAM  84
#define CTRY_YEMEN  967
#define CTRY_ZIMBABWE  263

#define LOCALE_NOUSEROVERRIDE  0x80000000
#define LOCALE_USE_CP_ACP  0x40000000
#define LOCALE_RETURN_NUMBER  0x20000000
#define LOCALE_ILANGUAGE  0x00000001
#define LOCALE_SLANGUAGE  0x00000002
#define LOCALE_SENGLANGUAGE  0x00001001
#define LOCALE_SABBREVLANGNAME  0x00000003
#define LOCALE_SNATIVELANGNAME  0x00000004
#define LOCALE_ICOUNTRY  0x00000005
#define LOCALE_SCOUNTRY  0x00000006
#define LOCALE_SENGCOUNTRY  0x00001002
#define LOCALE_SABBREVCTRYNAME  0x00000007
#define LOCALE_SNATIVECTRYNAME  0x00000008
#define LOCALE_IDEFAULTLANGUAGE  0x00000009
#define LOCALE_IDEFAULTCOUNTRY  0x0000000A
#define LOCALE_IDEFAULTCODEPAGE  0x0000000B
#define LOCALE_IDEFAULTANSICODEPAGE  0x00001004
#define LOCALE_IDEFAULTMACCODEPAGE  0x00001011
#define LOCALE_SLIST  0x0000000C
#define LOCALE_IMEASURE  0x0000000D
#define LOCALE_SDECIMAL  0x0000000E
#define LOCALE_STHOUSAND  0x0000000F
#define LOCALE_SGROUPING  0x00000010
#define LOCALE_IDIGITS  0x00000011
#define LOCALE_ILZERO  0x00000012
#define LOCALE_INEGNUMBER  0x00001010
#define LOCALE_SNATIVEDIGITS  0x00000013
#define LOCALE_SCURRENCY  0x00000014
#define LOCALE_SINTLSYMBOL  0x00000015
#define LOCALE_SMONDECIMALSEP  0x00000016
#define LOCALE_SMONTHOUSANDSEP  0x00000017
#define LOCALE_SMONGROUPING  0x00000018
#define LOCALE_ICURRDIGITS  0x00000019
#define LOCALE_IINTLCURRDIGITS  0x0000001A
#define LOCALE_ICURRENCY  0x0000001B
#define LOCALE_INEGCURR  0x0000001C
#define LOCALE_SDATE  0x0000001D
#define LOCALE_STIME  0x0000001E
#define LOCALE_SSHORTDATE  0x0000001F
#define LOCALE_SLONGDATE  0x00000020
#define LOCALE_STIMEFORMAT  0x00001003
#define LOCALE_IDATE  0x00000021
#define LOCALE_ILDATE  0x00000022
#define LOCALE_ITIME  0x00000023
#define LOCALE_ITIMEMARKPOSN  0x00001005
#define LOCALE_ICENTURY  0x00000024
#define LOCALE_ITLZERO  0x00000025
#define LOCALE_IDAYLZERO  0x00000026
#define LOCALE_IMONLZERO  0x00000027
#define LOCALE_S1159  0x00000028
#define LOCALE_S2359  0x00000029
#define LOCALE_ICALENDARTYPE  0x00001009
#define LOCALE_IOPTIONALCALENDAR  0x0000100B
#define LOCALE_IFIRSTDAYOFWEEK  0x0000100C
#define LOCALE_IFIRSTWEEKOFYEAR  0x0000100D
#define LOCALE_SDAYNAME1  0x0000002A
#define LOCALE_SDAYNAME2  0x0000002B
#define LOCALE_SDAYNAME3  0x0000002C
#define LOCALE_SDAYNAME4  0x0000002D
#define LOCALE_SDAYNAME5  0x0000002E
#define LOCALE_SDAYNAME6  0x0000002F
#define LOCALE_SDAYNAME7  0x00000030
#define LOCALE_SABBREVDAYNAME1  0x00000031
#define LOCALE_SABBREVDAYNAME2  0x00000032
#define LOCALE_SABBREVDAYNAME3  0x00000033
#define LOCALE_SABBREVDAYNAME4  0x00000034
#define LOCALE_SABBREVDAYNAME5  0x00000035
#define LOCALE_SABBREVDAYNAME6  0x00000036
#define LOCALE_SABBREVDAYNAME7  0x00000037
#define LOCALE_SMONTHNAME1  0x00000038
#define LOCALE_SMONTHNAME2  0x00000039
#define LOCALE_SMONTHNAME3  0x0000003A
#define LOCALE_SMONTHNAME4  0x0000003B
#define LOCALE_SMONTHNAME5  0x0000003C
#define LOCALE_SMONTHNAME6  0x0000003D
#define LOCALE_SMONTHNAME7  0x0000003E
#define LOCALE_SMONTHNAME8  0x0000003F
#define LOCALE_SMONTHNAME9  0x00000040
#define LOCALE_SMONTHNAME10  0x00000041
#define LOCALE_SMONTHNAME11  0x00000042
#define LOCALE_SMONTHNAME12  0x00000043
#define LOCALE_SMONTHNAME13  0x0000100E
#define LOCALE_SABBREVMONTHNAME1  0x00000044
#define LOCALE_SABBREVMONTHNAME2  0x00000045
#define LOCALE_SABBREVMONTHNAME3  0x00000046
#define LOCALE_SABBREVMONTHNAME4  0x00000047
#define LOCALE_SABBREVMONTHNAME5  0x00000048
#define LOCALE_SABBREVMONTHNAME6  0x00000049
#define LOCALE_SABBREVMONTHNAME7  0x0000004A
#define LOCALE_SABBREVMONTHNAME8  0x0000004B
#define LOCALE_SABBREVMONTHNAME9  0x0000004C
#define LOCALE_SABBREVMONTHNAME10  0x0000004D
#define LOCALE_SABBREVMONTHNAME11  0x0000004E
#define LOCALE_SABBREVMONTHNAME12  0x0000004F
#define LOCALE_SABBREVMONTHNAME13  0x0000100F
#define LOCALE_SPOSITIVESIGN  0x00000050
#define LOCALE_SNEGATIVESIGN  0x00000051
#define LOCALE_IPOSSIGNPOSN  0x00000052
#define LOCALE_INEGSIGNPOSN  0x00000053
#define LOCALE_IPOSSYMPRECEDES  0x00000054
#define LOCALE_IPOSSEPBYSPACE  0x00000055
#define LOCALE_INEGSYMPRECEDES  0x00000056
#define LOCALE_INEGSEPBYSPACE  0x00000057
#define LOCALE_FONTSIGNATURE  0x00000058
#define LOCALE_SISO639LANGNAME  0x00000059
#define LOCALE_SISO3166CTRYNAME  0x0000005A
#if (WINVER >= 0x0500)
#define LOCALE_IDEFAULTEBCDICCODEPAGE  0x00001012
#define LOCALE_IPAPERSIZE  0x0000100A
#define LOCALE_SENGCURRNAME  0x00001007
#define LOCALE_SNATIVECURRNAME  0x00001008
#define LOCALE_SYEARMONTH  0x00001006
#define LOCALE_SSORTNAME  0x00001013
#define LOCALE_IDIGITSUBSTITUTION  0x00001014
#endif /* WINVER >= 0x0500 */

#define TIME_NOMINUTESORSECONDS  0x00000001
#define TIME_NOSECONDS  0x00000002
#define TIME_NOTIMEMARKER  0x00000004
#define TIME_FORCE24HOURFORMAT  0x00000008

#define DATE_SHORTDATE  0x00000001
#define DATE_LONGDATE  0x00000002
#define DATE_USE_ALT_CALENDAR  0x00000004

#if (WINVER >= 0x0500)
#define DATE_YEARMONTH  0x00000008
#define DATE_LTRREADING  0x00000010
#define DATE_RTLREADING  0x00000020
#endif

#define CAL_ICALINTVALUE  0x00000001
#define CAL_SCALNAME  0x00000002
#define CAL_IYEAROFFSETRANGE  0x00000003
#define CAL_SERASTRING  0x00000004
#define CAL_SSHORTDATE  0x00000005
#define CAL_SLONGDATE  0x00000006
#define CAL_SDAYNAME1  0x00000007
#define CAL_SDAYNAME2  0x00000008
#define CAL_SDAYNAME3  0x00000009
#define CAL_SDAYNAME4  0x0000000A
#define CAL_SDAYNAME5  0x0000000B
#define CAL_SDAYNAME6  0x0000000C
#define CAL_SDAYNAME7  0x0000000D
#define CAL_SABBREVDAYNAME1  0x0000000E
#define CAL_SABBREVDAYNAME2  0x0000000F
#define CAL_SABBREVDAYNAME3  0x00000010
#define CAL_SABBREVDAYNAME4  0x00000011
#define CAL_SABBREVDAYNAME5  0x00000012
#define CAL_SABBREVDAYNAME6  0x00000013
#define CAL_SABBREVDAYNAME7  0x00000014
#define CAL_SMONTHNAME1  0x00000015
#define CAL_SMONTHNAME2  0x00000016
#define CAL_SMONTHNAME3  0x00000017
#define CAL_SMONTHNAME4  0x00000018
#define CAL_SMONTHNAME5  0x00000019
#define CAL_SMONTHNAME6  0x0000001A
#define CAL_SMONTHNAME7  0x0000001B
#define CAL_SMONTHNAME8  0x0000001C
#define CAL_SMONTHNAME9  0x0000001D
#define CAL_SMONTHNAME10  0x0000001E
#define CAL_SMONTHNAME11  0x0000001F
#define CAL_SMONTHNAME12  0x00000020
#define CAL_SMONTHNAME13  0x00000021
#define CAL_SABBREVMONTHNAME1  0x00000022
#define CAL_SABBREVMONTHNAME2  0x00000023
#define CAL_SABBREVMONTHNAME3  0x00000024
#define CAL_SABBREVMONTHNAME4  0x00000025
#define CAL_SABBREVMONTHNAME5  0x00000026
#define CAL_SABBREVMONTHNAME6  0x00000027
#define CAL_SABBREVMONTHNAME7  0x00000028
#define CAL_SABBREVMONTHNAME8  0x00000029
#define CAL_SABBREVMONTHNAME9  0x0000002A
#define CAL_SABBREVMONTHNAME10  0x0000002B
#define CAL_SABBREVMONTHNAME11  0x0000002C
#define CAL_SABBREVMONTHNAME12  0x0000002D
#define CAL_SABBREVMONTHNAME13  0x0000002E

#if (WINVER >= 0x0500)
#define CAL_SYEARMONTH  0x0000002F
#define CAL_ITWODIGITYEARMAX  0x00000030
#endif

#define ENUM_ALL_CALENDARS  0xffffffff

#define CAL_GREGORIAN  1
#define CAL_GREGORIAN_US  2
#define CAL_JAPAN  3
#define CAL_TAIWAN  4
#define CAL_KOREA  5
#define CAL_HIJRI  6
#define CAL_THAI  7
#define CAL_HEBREW  8
#define CAL_GREGORIAN_ME_FRENCH  9
#define CAL_GREGORIAN_ARABIC  10
#define CAL_GREGORIAN_XLIT_ENGLISH  11
#define CAL_GREGORIAN_XLIT_FRENCH  12

#define LGRPID_WESTERN_EUROPE  0x0001
#define LGRPID_CENTRAL_EUROPE  0x0002
#define LGRPID_BALTIC  0x0003
#define LGRPID_GREEK  0x0004
#define LGRPID_CYRILLIC  0x0005
#define LGRPID_TURKISH  0x0006
#define LGRPID_JAPANESE  0x0007
#define LGRPID_KOREAN  0x0008
#define LGRPID_TRADITIONAL_CHINESE  0x0009
#define LGRPID_SIMPLIFIED_CHINESE  0x000A
#define LGRPID_THAI  0x000B
#define LGRPID_HEBREW  0x000C
#define LGRPID_ARABIC  0x000D
#define LGRPID_VIETNAMESE  0x000E
#define LGRPID_INDIC  0x000F
#define LGRPID_GEORGIAN  0x0010
#define LGRPID_ARMENIAN  0x0011

typedef DWORD LGRPID;
typedef DWORD LCTYPE;
typedef DWORD CALTYPE;
typedef DWORD CALID;

typedef struct _cpinfo {
    UINT MaxCharSize;
    BYTE DefaultChar[MAX_DEFAULTCHAR];
    BYTE LeadByte[MAX_LEADBYTES];
} CPINFO, *LPCPINFO;

typedef struct _cpinfoexA {
    UINT MaxCharSize;
    BYTE DefaultChar[MAX_DEFAULTCHAR];
    BYTE LeadByte[MAX_LEADBYTES];
    WCHAR UnicodeDefaultChar;
    UINT CodePage;
    CHAR CodePageName[MAX_PATH];
} CPINFOEXA, *LPCPINFOEXA;

typedef struct _cpinfoexW {
    UINT MaxCharSize;
    BYTE DefaultChar[MAX_DEFAULTCHAR];
    BYTE LeadByte[MAX_LEADBYTES];
    WCHAR UnicodeDefaultChar;
    UINT CodePage;
    WCHAR CodePageName[MAX_PATH];
} CPINFOEXW, *LPCPINFOEXW;

typedef struct _numberfmtA {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPSTR lpDecimalSep;
    LPSTR lpThousandSep;
    UINT NegativeOrder;
} NUMBERFMTA, *LPNUMBERFMTA;

typedef struct _numberfmtW {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPWSTR lpDecimalSep;
    LPWSTR lpThousandSep;
    UINT NegativeOrder;
} NUMBERFMTW, *LPNUMBERFMTW;

typedef struct _currencyfmtA {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPSTR lpDecimalSep;
    LPSTR lpThousandSep;
    UINT NegativeOrder;
    UINT PositiveOrder;
    LPSTR lpCurrencySymbol;
} CURRENCYFMTA, *LPCURRENCYFMTA;

typedef struct _currencyfmtW {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPWSTR lpDecimalSep;
    LPWSTR lpThousandSep;
    UINT NegativeOrder;
    UINT PositiveOrder;
    LPWSTR lpCurrencySymbol;
} CURRENCYFMTW, *LPCURRENCYFMTW;

#ifdef STRICT
typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID,LPSTR,LPSTR,DWORD,LONG_PTR);
typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCA)(LGRPID,LCID,LPSTR,LONG_PTR);
typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCA)(LPSTR,LONG_PTR);
typedef BOOL (CALLBACK *LOCALE_ENUMPROCA)(LPSTR);
typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCA)(LPSTR);
typedef BOOL (CALLBACK *DATEFMT_ENUMPROCA)(LPSTR);
typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXA)(LPSTR, CALID);
typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCA)(LPSTR);
typedef BOOL (CALLBACK *CALINFO_ENUMPROCA)(LPSTR);
typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXA)(LPSTR, CALID);
typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCW)(LGRPID,LPWSTR,LPWSTR,DWORD,LONG_PTR);
typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCW)(LGRPID,LCID,LPWSTR,LONG_PTR);
typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCW)(LPWSTR,LONG_PTR);
typedef BOOL (CALLBACK *LOCALE_ENUMPROCW)(LPWSTR);
typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCW)(LPWSTR);
typedef BOOL (CALLBACK *DATEFMT_ENUMPROCW)(LPWSTR);
typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXW)(LPWSTR, CALID);
typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCW)(LPWSTR);
typedef BOOL (CALLBACK *CALINFO_ENUMPROCW)(LPWSTR);
typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXW)(LPWSTR, CALID);
#else
typedef FARPROC LANGUAGEGROUP_ENUMPROCA;
typedef FARPROC LANGGROUPLOCALE_ENUMPROCA;
typedef FARPROC UILANGUAGE_ENUMPROCA;
typedef FARPROC LOCALE_ENUMPROCA;
typedef FARPROC CODEPAGE_ENUMPROCA;
typedef FARPROC DATEFMT_ENUMPROCA;
typedef FARPROC DATEFMT_ENUMPROCEXA;
typedef FARPROC TIMEFMT_ENUMPROCA;
typedef FARPROC CALINFO_ENUMPROCA;
typedef FARPROC CALINFO_ENUMPROCEXA;
typedef FARPROC LANGUAGEGROUP_ENUMPROCW;
typedef FARPROC LANGGROUPLOCALE_ENUMPROCW;
typedef FARPROC UILANGUAGE_ENUMPROCW;
typedef FARPROC LOCALE_ENUMPROCW;
typedef FARPROC CODEPAGE_ENUMPROCW;
typedef FARPROC DATEFMT_ENUMPROCW;
typedef FARPROC DATEFMT_ENUMPROCEXW;
typedef FARPROC TIMEFMT_ENUMPROCW;
typedef FARPROC CALINFO_ENUMPROCW;
typedef FARPROC CALINFO_ENUMPROCEXW;
#endif /* STRICT */

WINBASEAPI BOOL WINAPI IsValidCodePage(UINT);
WINBASEAPI UINT WINAPI GetACP(void);
WINBASEAPI UINT WINAPI GetOEMCP(void);
WINBASEAPI BOOL WINAPI GetCPInfo(UINT,LPCPINFO);
WINBASEAPI BOOL WINAPI GetCPInfoExA(UINT,DWORD,LPCPINFOEXA);
WINBASEAPI BOOL WINAPI GetCPInfoExW(UINT,DWORD,LPCPINFOEXW);
WINBASEAPI BOOL WINAPI IsDBCSLeadByte(BYTE);
WINBASEAPI BOOL WINAPI IsDBCSLeadByteEx(UINT,BYTE);
WINBASEAPI int WINAPI MultiByteToWideChar(UINT,DWORD,LPCSTR,int,LPWSTR,int);
WINBASEAPI int WINAPI WideCharToMultiByte(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,PBOOL);
WINBASEAPI int WINAPI CompareStringA(LCID,DWORD,LPCSTR,int,LPCSTR,int);
WINBASEAPI int WINAPI CompareStringW(LCID,DWORD,LPCWSTR,int,LPCWSTR,int);
WINBASEAPI int WINAPI LCMapStringA(LCID,DWORD,LPCSTR,int,LPSTR,int);
WINBASEAPI int WINAPI LCMapStringW(LCID,DWORD,LPCWSTR,int,LPWSTR,int);
WINBASEAPI int WINAPI GetLocaleInfoA(LCID,LCTYPE,LPSTR,int);
WINBASEAPI int WINAPI GetLocaleInfoW(LCID,LCTYPE,LPWSTR,int);
WINBASEAPI BOOL WINAPI SetLocaleInfoA(LCID,LCTYPE,LPCSTR);
WINBASEAPI BOOL WINAPI SetLocaleInfoW(LCID,LCTYPE,LPCWSTR);
WINBASEAPI int WINAPI GetTimeFormatA(LCID,DWORD,CONST SYSTEMTIME*,LPCSTR,LPSTR,int);
WINBASEAPI int WINAPI GetTimeFormatW(LCID,DWORD,CONST SYSTEMTIME*,LPCWSTR,LPWSTR,int);
WINBASEAPI int WINAPI GetDateFormatA(LCID,DWORD,CONST SYSTEMTIME*,LPCSTR,LPSTR,int);
WINBASEAPI int WINAPI GetDateFormatW(LCID,DWORD,CONST SYSTEMTIME*,LPCWSTR,LPWSTR,int);
WINBASEAPI int WINAPI GetNumberFormatA(LCID,DWORD,LPCSTR,CONST NUMBERFMTA*,LPSTR,int);
WINBASEAPI int WINAPI GetNumberFormatW(LCID,DWORD,LPCWSTR,CONST NUMBERFMTW*,LPWSTR,int);
WINBASEAPI int WINAPI GetCurrencyFormatA(LCID,DWORD,LPCSTR,CONST CURRENCYFMTA*,LPSTR,int);
WINBASEAPI int WINAPI GetCurrencyFormatW(LCID,DWORD,LPCWSTR,CONST CURRENCYFMTW*,LPWSTR,int);
WINBASEAPI BOOL WINAPI EnumCalendarInfoA(CALINFO_ENUMPROCA,LCID,CALID,CALTYPE);
WINBASEAPI BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW,LCID,CALID,CALTYPE);
WINBASEAPI BOOL WINAPI EnumTimeFormatsA(TIMEFMT_ENUMPROCA,LCID,DWORD);
WINBASEAPI BOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW,LCID,DWORD);
WINBASEAPI BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA,LCID,DWORD);
WINBASEAPI BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW,LCID,DWORD);
WINBASEAPI BOOL WINAPI IsValidLocale(LCID,DWORD);
WINBASEAPI LCID WINAPI ConvertDefaultLocale(LCID);
WINBASEAPI LCID WINAPI GetThreadLocale(void);
WINBASEAPI BOOL WINAPI SetThreadLocale(LCID);
WINBASEAPI LANGID WINAPI GetSystemDefaultLangID(void);
WINBASEAPI LANGID WINAPI GetUserDefaultLangID(void);
WINBASEAPI LCID WINAPI GetSystemDefaultLCID(void);
WINBASEAPI LCID WINAPI GetUserDefaultLCID(void);
WINBASEAPI BOOL WINAPI GetStringTypeExA(LCID,DWORD,LPCSTR,int,LPWORD);
WINBASEAPI BOOL WINAPI GetStringTypeExW(LCID,DWORD,LPCWSTR,int,LPWORD);
WINBASEAPI BOOL WINAPI GetStringTypeA(LCID,DWORD,LPCSTR,int,LPWORD);
WINBASEAPI BOOL WINAPI GetStringTypeW(DWORD,LPCWSTR,int,LPWORD);
WINBASEAPI int WINAPI FoldStringA(DWORD,LPCSTR,int,LPSTR,int);
WINBASEAPI int WINAPI FoldStringW(DWORD,LPCWSTR,int,LPWSTR,int);
WINBASEAPI BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA,DWORD);
WINBASEAPI BOOL WINAPI EnumSystemLocalesW(LOCALE_ENUMPROCW,DWORD);
WINBASEAPI BOOL WINAPI EnumSystemCodePagesA(CODEPAGE_ENUMPROCA,DWORD);
WINBASEAPI BOOL WINAPI EnumSystemCodePagesW(CODEPAGE_ENUMPROCW,DWORD);
#if (WINVER >= 0x0500)
WINBASEAPI BOOL WINAPI EnumCalendarInfoExA(CALINFO_ENUMPROCEXA,LCID,CALID,CALTYPE);
WINBASEAPI BOOL WINAPI EnumCalendarInfoExW(CALINFO_ENUMPROCEXW,LCID,CALID,CALTYPE);
WINBASEAPI BOOL WINAPI EnumDateFormatsExA(DATEFMT_ENUMPROCEXA,LCID,DWORD);
WINBASEAPI BOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW,LCID,DWORD);
WINBASEAPI BOOL WINAPI EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA,LGRPID,DWORD,LONG_PTR);
WINBASEAPI BOOL WINAPI EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW,LGRPID,DWORD,LONG_PTR);
WINBASEAPI BOOL WINAPI EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA,DWORD,LONG_PTR);
WINBASEAPI BOOL WINAPI EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW,DWORD,LONG_PTR);
WINBASEAPI BOOL WINAPI EnumUILanguagesA(UILANGUAGE_ENUMPROCA,DWORD,LONG_PTR);
WINBASEAPI BOOL WINAPI EnumUILanguagesW(UILANGUAGE_ENUMPROCW,DWORD,LONG_PTR);
WINBASEAPI LANGID WINAPI GetSystemDefaultUILanguage(void);
WINBASEAPI LANGID WINAPI GetUserDefaultUILanguage(void);
WINBASEAPI BOOL WINAPI IsValidLanguageGroup(LGRPID,DWORD);
#endif /* WINVER >= 0x0500 */

#ifdef UNICODE
typedef CPINFOEXW CPINFOEX;
typedef LPCPINFOEXW LPCPINFOEX;
typedef NUMBERFMTW NUMBERFMT;
typedef LPNUMBERFMTW LPNUMBERFMT;
typedef CURRENCYFMTW CURRENCYFMT;
typedef LPCURRENCYFMTW LPCURRENCYFMT;
#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCW
#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCW
#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCW
#define LOCALE_ENUMPROC LOCALE_ENUMPROCW
#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCW
#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCW
#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXW
#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCW
#define CALINFO_ENUMPROC CALINFO_ENUMPROCW
#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXW
#define GetCPInfoEx GetCPInfoExW
#define CompareString CompareStringW
#define LCMapString LCMapStringW
#define GetLocaleInfo GetLocaleInfoW
#define SetLocaleInfo SetLocaleInfoW
#define GetTimeFormat GetTimeFormatW
#define GetDateFormat GetDateFormatW
#define GetNumberFormat GetNumberFormatW
#define GetCurrencyFormat GetCurrencyFormatW
#define EnumCalendarInfo EnumCalendarInfoW
#define EnumTimeFormats EnumTimeFormatsW
#define EnumDateFormats EnumDateFormatsW
#define EnumDateFormatsEx EnumDateFormatsExW
#define GetStringTypeEx GetStringTypeExW
#define FoldString FoldStringW
#define EnumSystemLocales EnumSystemLocalesW
#define EnumSystemCodePages EnumSystemCodePagesW
#else
typedef CPINFOEXA CPINFOEX;
typedef LPCPINFOEXA LPCPINFOEX;
typedef NUMBERFMTA NUMBERFMT;
typedef LPNUMBERFMTA LPNUMBERFMT;
typedef CURRENCYFMTA CURRENCYFMT;
typedef LPCURRENCYFMTA LPCURRENCYFMT;
#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCA
#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCA
#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCA
#define LOCALE_ENUMPROC LOCALE_ENUMPROCA
#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCA
#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCA
#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXA
#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCA
#define CALINFO_ENUMPROC CALINFO_ENUMPROCA
#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXA
#define GetCPInfoEx GetCPInfoExA
#define CompareString CompareStringA
#define LCMapString LCMapStringA
#define GetLocaleInfo GetLocaleInfoA
#define SetLocaleInfo SetLocaleInfoA
#define GetTimeFormat GetTimeFormatA
#define GetDateFormat GetDateFormatA
#define GetNumberFormat GetNumberFormatA
#define GetCurrencyFormat GetCurrencyFormatA
#define EnumCalendarInfo EnumCalendarInfoA
#define EnumTimeFormats EnumTimeFormatsA
#define EnumDateFormats EnumDateFormatsA
#define EnumDateFormatsEx EnumDateFormatsExA
#define GetStringTypeEx GetStringTypeExA
#define FoldString FoldStringA
#define EnumSystemLocales EnumSystemLocalesA
#define EnumSystemCodePages EnumSystemCodePagesA
#endif

#if (WINVER >= 0x0500)
#ifdef UNICODE
#define EnumCalendarInfoEx EnumCalendarInfoExW
#define EnumDateFormatsEx EnumDateFormatsExW
#define EnumLanguageGroupLocales EnumLanguageGroupLocalesW
#define EnumSystemLanguageGroups EnumSystemLanguageGroupsW
#define EnumUILanguages EnumUILanguagesW
#else
#define EnumCalendarInfoEx EnumCalendarInfoExA
#define EnumDateFormatsEx EnumDateFormatsExA
#define EnumLanguageGroupLocales EnumLanguageGroupLocalesA
#define EnumSystemLanguageGroups EnumSystemLanguageGroupsA
#define EnumUILanguages EnumUILanguagesA
#endif
#endif /* WINVER >= 0x0500 */

#ifdef __cplusplus
}
#endif

#endif /* _WINNLS_H */
