1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Written 2000
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Anton Lapach
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <limits.h>
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MSVC) || defined (__ICL)
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <memory.h>
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string.h>
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale.h>
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stdlib.h>
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stdio.h>
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRCPY(D, DS, S) strcpy_s(D, DS, S)
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRNCPY(D, DS, S, C) strncpy_s(D, DS, S, C)
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRCAT(D, DS, S) strcat_s(D, DS, S)
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRCPY(D, DS, S) strcpy(D, S)
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRNCPY(D, DS, S, C) strncpy(D, S, C)
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_STRCAT(D, DS, S) strcat(D, S)
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__cplusplus)
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottextern "C" {
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Framework functions */
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  locale :: "lang[_country[.code_page]]"
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  | ".code_page"
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  | ""
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  | NULL
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott*/
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _LOCALECONV {
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char* name;
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char* abbrev;
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} LOCALECONV;
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAX_LANG_LEN        64  /* max language name length */
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAX_CTRY_LEN        64  /* max country name length */
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAX_MODIFIER_LEN    0   /* max modifier name length - n/a */
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAX_LC_LEN          (MAX_LANG_LEN+MAX_CTRY_LEN+MAX_MODIFIER_LEN+3)
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                /* max entire locale string length */
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAX_CP_LEN          5   /* max code page name length */
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (LANG_INVARIANT)
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define LANG_INVARIANT 0x7f
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_LANG_INVARIANT_DEFINED
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef CP_UTF7
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define CP_UTF7 65000
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef CP_UTF8
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define CP_UTF8 65001
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define INVARIANT_LCID MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char *_C_name = "C";
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*  non-NLS language string table */
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic LOCALECONV __rg_language[] = {
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"american",                    "ENU"},
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"american english",            "ENU"},
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"american-english",            "ENU"},
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"australian",                  "ENA"},
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"belgian",                     "NLB"},
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"canadian",                    "ENC"},
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chh",                         "ZHH"},
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chi",                         "ZHI"},
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chinese",                     "CHS"},
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chinese-hongkong",            "ZHH"},
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chinese-simplified",          "CHS"},
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chinese-singapore",           "ZHI"},
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"chinese-traditional",         "CHT"},
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"dutch-belgian",               "NLB"},
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-american",            "ENU"},
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-aus",                 "ENA"},
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-belize",              "ENL"},
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-can",                 "ENC"},
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-caribbean",           "ENB"},
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-ire",                 "ENI"},
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-jamaica",             "ENJ"},
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-nz",                  "ENZ"},
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-south africa",        "ENS"},
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-trinidad y tobago",   "ENT"},
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-uk",                  "ENG"},
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-us",                  "ENU"},
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"english-usa",                 "ENU"},
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"french-belgian",              "FRB"},
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"french-canadian",             "FRC"},
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"french-luxembourg",           "FRL"},
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"french-swiss",                "FRS"},
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"german-austrian",             "DEA"},
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"german-lichtenstein",         "DEC"},
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"german-luxembourg",           "DEL"},
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"german-swiss",                "DES"},
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"irish-english",               "ENI"},
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"italian-swiss",               "ITS"},
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"norwegian",                   "NOR"},
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"norwegian-bokmal",            "NOR"},
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"norwegian-nynorsk",           "NON"},
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"portuguese-brazilian",        "PTB"},
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-argentina",           "ESS"},
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-bolivia",             "ESB"},
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-chile",               "ESL"},
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-colombia",            "ESO"},
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-costa rica",          "ESC"},
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-dominican republic",  "ESD"},
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-ecuador",             "ESF"},
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-el salvador",         "ESE"},
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-guatemala",           "ESG"},
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-honduras",            "ESH"},
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-mexican",             "ESM"},
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-modern",              "ESN"},
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-nicaragua",           "ESI"},
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-panama",              "ESA"},
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-paraguay",            "ESZ"},
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-peru",                "ESR"},
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-puerto rico",         "ESU"},
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-uruguay",             "ESY"},
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"spanish-venezuela",           "ESV"},
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"swedish-finland",             "SVF"},
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"swiss",                       "DES"},
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"uk",                          "ENG"},
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"us",                          "ENU"},
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"usa",                         "ENU"}
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*  non-NLS country string table */
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic LOCALECONV __rg_country[] = {
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"america",                     "USA"},
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"britain",                     "GBR"},
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"china",                       "CHN"},
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"czech",                       "CZE"},
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"england",                     "GBR"},
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"great britain",               "GBR"},
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"holland",                     "NLD"},
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"hong-kong",                   "HKG"},
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"new-zealand",                 "NZL"},
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"nz",                          "NZL"},
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"pr china",                    "CHN"},
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"pr-china",                    "CHN"},
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"puerto-rico",                 "PRI"},
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"slovak",                      "SVK"},
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"south africa",                "ZAF"},
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"south korea",                 "KOR"},
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"south-africa",                "ZAF"},
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"south-korea",                 "KOR"},
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"trinidad & tobago",           "TTO"},
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"uk",                          "GBR"},
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"united-kingdom",              "GBR"},
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"united-states",               "USA"},
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {"us",                          "USA"},
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_name_hint {
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LCID id;
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_lcid_t;
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_ctype {
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_lcid_t lc;
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  UINT cp;
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned short ctable[256];
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_ctype_t;
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_numeric {
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_lcid_t lc;
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char decimal_point[4];
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char thousands_sep[4];
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *grouping;
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_numeric_t;
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_time {
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_lcid_t lc;
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *month[12];
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *abbrev_month[12];
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *dayofweek[7];
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *abbrev_dayofweek[7];
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *date_time_format;
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *long_date_time_format;
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *date_format;
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *long_date_format;
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *time_format;
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char am[9];
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char pm[9];
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_time_t;
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_collate {
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_lcid_t lc;
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_collate_t;
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef struct _Locale_monetary {
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_lcid_t lc;
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char decimal_point[4];
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char thousands_sep[4];
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *grouping;
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char int_curr_symbol[5]; /* 3 + 1 + 1 */
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char curr_symbol[6];
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char negative_sign[5];
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char positive_sign[5];
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int frac_digits;
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int int_frac_digits;
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} _Locale_monetary_t;
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Internal function */
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void __FixGrouping(char *grouping);
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* __ConvertName(const char* lname, LOCALECONV* ConvTable, int TableSize);
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __ParseLocaleString(const char* lname, char* lang, char* ctry, char* page);
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __GetLCID(const char* lang, const char* ctry, LCID* lcid);
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __GetLCIDFromName(const char* lname, LCID* lcid, char *cp, _Locale_lcid_t *hint);
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic char const* __GetLocaleName(LCID lcid, const char* cp, char* buf);
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic char const* __Extract_locale_name(const char* loc, const char* category, char* buf);
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic char const* __TranslateToSystem(const char* lname, char* buf, _Locale_lcid_t* hint, int *__err_code);
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void __GetLocaleInfoUsingACP(LCID lcid, const char* cp, LCTYPE lctype, char* buf, int buf_size, wchar_t* wbuf, int wbuf_size);
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __intGetACP(LCID lcid);
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __intGetOCP(LCID lcid);
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __GetDefaultCP(LCID lcid);
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic char* __ConvertToCP(int from_cp, int to_cp, const char *from, size_t size, size_t *ret_buf_size);
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void my_ltoa(long __x, char* buf);
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid my_ltoa(long __x, char* buf) {
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char rbuf[64];
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char* ptr = rbuf;
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__x == 0)
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *ptr++ = '0';
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (; __x != 0; __x /= 10)
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      *ptr++ = (char)(__x % 10) + '0';
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while(ptr > rbuf) *buf++ = *--ptr;
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* psw */
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *buf = '\0';
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__cplusplus)
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottextern "C" {
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_ctype_hint(_Locale_ctype_t* ltype)
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (ltype != 0) ? &ltype->lc : 0; }
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_numeric_hint(_Locale_numeric_t* lnumeric)
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (lnumeric != 0) ? &lnumeric->lc : 0; }
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_time_hint(_Locale_time_t* ltime)
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (ltime != 0) ? &ltime->lc : 0; }
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_collate_hint(_Locale_collate_t* lcollate)
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (lcollate != 0) ? &lcollate->lc : 0; }
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_monetary_hint(_Locale_monetary_t* lmonetary)
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (lmonetary != 0) ? &lmonetary->lc : 0; }
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_lcid_t* _Locale_get_messages_hint(struct _Locale_messages* lmessages) {
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lmessages)
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return 0;
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MAP(x, y) if ((mask & x) != 0) ret |= (y)
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottunsigned short MapCtypeMask(unsigned short mask) {
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned short ret = 0;
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_UPPER, _Locale_UPPER | _Locale_PRINT);
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_LOWER, _Locale_LOWER | _Locale_PRINT);
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_DIGIT, _Locale_DIGIT | _Locale_PRINT);
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_SPACE, _Locale_SPACE | _Locale_PRINT);
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_PUNCT, _Locale_PUNCT | _Locale_PRINT);
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* MAP(C1_BLANK, ?); */
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_XDIGIT, _Locale_XDIGIT | _Locale_PRINT);
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MAP(C1_ALPHA, _Locale_ALPHA | _Locale_PRINT);
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ((mask & C1_CNTRL) != 0) { ret |= _Locale_CNTRL; ret &= ~_Locale_PRINT; }
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ret;
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void MapCtypeMasks(unsigned short *cur, unsigned short *end) {
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (; cur != end; ++cur) {
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *cur = MapCtypeMask(*cur);
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_ctype_t* _Locale_ctype_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp_name[MAX_CP_LEN + 1];
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int NativeCP;
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned char Buffer[256];
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned char *ptr;
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPINFO CPInfo;
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int i;
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t *wbuffer;
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int BufferSize;
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_ctype_t *ltype = (_Locale_ctype_t*)malloc(sizeof(_Locale_ctype_t));
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltype) { *__err_code = _STLP_LOC_NO_MEMORY; return ltype; }
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(ltype, 0, sizeof(_Locale_ctype_t));
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(name, &ltype->lc.id, cp_name, lc_hint) == -1)
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ( ltype->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { ltype->lc.id = 0x409; }
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltype->cp = atoi(cp_name);
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  NativeCP = __GetDefaultCP(ltype->lc.id);
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* Make table with all characters. */
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (i = 0; i < 256; ++i) Buffer[i] = (unsigned char)i;
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!GetCPInfo(NativeCP, &CPInfo)) { free(ltype); return NULL; }
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (CPInfo.MaxCharSize > 1) {
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (ptr = (unsigned char*)CPInfo.LeadByte; *ptr && *(ptr + 1); ptr+=2)
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      for (i = *ptr; i <= *(ptr + 1); ++i) Buffer[i] = 0;
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ((UINT)NativeCP != ltype->cp) {
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    OSVERSIONINFO ver_info;
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ver_info.dwOSVersionInfoSize = sizeof(ver_info);
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetVersionEx(&ver_info);
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (ver_info.dwPlatformId == VER_PLATFORM_WIN32_NT) {
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* Convert character sequence to Unicode. */
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      BufferSize = MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0);
348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (!BufferSize) { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wbuffer = (wchar_t*)malloc(BufferSize * sizeof(wchar_t));
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (!wbuffer) { free(ltype); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize);
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      GetStringTypeW(CT_CTYPE1, wbuffer, 256, ltype->ctable);
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      MapCtypeMasks(ltype->ctable, ltype->ctable + 256);
355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      free(wbuffer);
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      unsigned short ctable[256];
359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      unsigned char TargetBuffer[256];
360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      GetStringTypeA(ltype->lc.id, CT_CTYPE1, (const char*)Buffer, 256, ctable);
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* Convert character sequence to target code page. */
363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      BufferSize = MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0);
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (!BufferSize) { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wbuffer = (wchar_t*)malloc(BufferSize * sizeof(wchar_t));
366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (!wbuffer) { free(ltype); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize);
368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (!WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuffer, BufferSize, (char*)TargetBuffer, 256, NULL, FALSE))
369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      { free(wbuffer); free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      free(wbuffer);
372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* Translate ctype table. */
374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      for (i = 0; i < 256; ++i) {
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (!TargetBuffer[i]) continue;
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ltype->ctable[TargetBuffer[i]] = MapCtypeMask(ctable[i]);
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetStringTypeA(ltype->lc.id, CT_CTYPE1, (const char*)Buffer, 256, ltype->ctable);
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MapCtypeMasks(ltype->ctable, ltype->ctable + 256);
383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ltype;
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_numeric_t* _Locale_numeric_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t wbuf[4];
389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *GroupingBuffer;
390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int BufferSize;
391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_numeric_t *lnum = (_Locale_numeric_t*)malloc(sizeof(_Locale_numeric_t));
393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lnum) { *__err_code = _STLP_LOC_NO_MEMORY; return lnum; }
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(lnum, 0, sizeof(_Locale_numeric_t));
395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(name, &lnum->lc.id, lnum->cp, lc_hint) == -1)
397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { free(lnum); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lnum->lc.id != INVARIANT_LCID) {
401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_SDECIMAL, lnum->decimal_point, 4, wbuf, 4);
403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_STHOUSAND, lnum->thousands_sep, 4, wbuf, 4);
404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lnum->decimal_point[0] = '.';
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lnum->lc.id != INVARIANT_LCID) {
411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    BufferSize = GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, NULL, 0);
412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GroupingBuffer = (char*)malloc(BufferSize);
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!GroupingBuffer) { free(lnum); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __FixGrouping(GroupingBuffer);
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lnum->grouping = GroupingBuffer;
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lnum->grouping = (char*)malloc(1);
420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!lnum->grouping) { free(lnum); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lnum->grouping[0] = 0;
422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return lnum;
425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __ConvertDate(const char *NTDate, char *buffer, int buf_size) {
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* This function will return an incomplete buffer if buffer is not long enough */
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char *cur_char;
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *cur_output, *end_output;
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* Correct time format. */
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cur_char = NTDate;
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cur_output = buffer;
435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  end_output = cur_output + buf_size;
436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buf_size = 0;
437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (*cur_char) {
438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (cur_output && (cur_output == end_output)) break;
439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    switch (*cur_char) {
440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'd':
441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'd') {
443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (*(cur_char + 2) == 'd') {
448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (*(cur_char + 3) == 'd') {
449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'A'; }
450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            buf_size += 2;
451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            cur_char += 3;
452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          }
453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          else {
454e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'a'; }
455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            buf_size += 2;
456e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            cur_char += 2;
457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          }
458e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        else {
460e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'd'; }
461e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          buf_size += 2;
462e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          cur_char++;
463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'd'; }
471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'M':
476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'M') {
478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (*(cur_char + 2) == 'M') {
483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (*(cur_char + 3) == 'M') {
484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'B'; }
485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            buf_size += 2;
486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            cur_char += 3;
487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          }
488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          else {
489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'b'; }
490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            buf_size += 2;
491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            cur_char += 2;
492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          }
493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        else {
495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'm'; }
496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          buf_size += 2;
497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          cur_char++;
498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'm'; }
506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
507e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
508e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'y':
511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'y') {
513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
515e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
516e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
517e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (*(cur_char + 2) == 'y' && *(cur_char + 3) == 'y') {
518e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'Y'; }
519e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          buf_size += 2;
520e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          cur_char += 3;
521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        else {
523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'y'; }
524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          buf_size += 2;
525e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          cur_char++;
526e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
527e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
528e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
529e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
530e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
532e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
533e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'y'; }
534e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case '%':
539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output && (cur_output + 2 > end_output)) {
541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        *cur_output = 0;
542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return ++buf_size;
543e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
544e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '%'; }
545e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      buf_size += 2;
546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
548e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case '\'':
549e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      ++cur_char;
551e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      while (*cur_char != '\'' && *cur_char != 0 && (cur_output == NULL || cur_output != end_output)) {
552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *cur_output++ = *cur_char; }
553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
554e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 1;
555e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
556e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
557e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
558e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default:
559e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output) { *(cur_output++) = *cur_char; }
561e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      buf_size += 1;
562e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
563e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
565e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (*cur_char == 0) break;
566e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++cur_char;
567e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
568e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
569e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!cur_output || cur_output != end_output) {
570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (cur_output) *cur_output = 0;
571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buf_size += 1;
572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
573e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
574e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* We trunc result */
575e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *(--cur_output) = 0;
576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return buf_size;
579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __ConvertTime(const char *NTTime, char *buffer, int buf_size) {
582e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char *cur_char;
583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *cur_output, *end_output;
584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cur_char = NTTime;
585e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  cur_output = buffer;
586e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  end_output = cur_output + buf_size;
587e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buf_size = 0;
588e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (*cur_char) {
589e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    switch(*cur_char) {
590e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'h':
591e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'h') {
592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'I'; }
597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 2;
598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
599e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
600e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
601e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
602e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
605e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'I'; }
606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'H':
610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'H') {
611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
614e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'H'; }
616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 2;
617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
618e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
619e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
624e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'H'; }
625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 'm':
629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 'm') {
630e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
631e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
632e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
633e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
634e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'M'; }
635e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 2;
636e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        cur_char++;
637e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
638e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
641e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
643e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'M'; }
644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
645e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
647e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 's':
648e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 's') {
649e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 2 > end_output)) {
650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
653e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'S'; }
654e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 2;
655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
657e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
658e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output && (cur_output + 3 > end_output)) {
659e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *cur_output = 0;
660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          return ++buf_size;
661e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
662e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'S'; }
663e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 3;
664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
666e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 't':
667e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*(cur_char + 1) == 't')
668e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
669e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output && (cur_output + 2 > end_output)) {
670e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        *cur_output = 0;
671e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return ++buf_size;
672e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
673e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'p'; }
674e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      buf_size += 2;
675e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
676e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case '%':
677e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output && (cur_output + 2 > end_output)) {
678e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        *cur_output = 0;
679e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return ++buf_size;
680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output) { *(cur_output++)='%'; *(cur_output++)='%'; }
682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      buf_size += 2;
683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
684e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case '\'':
685e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      ++cur_char;
686e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      while (*cur_char != '\'' && *cur_char != 0 && (!cur_output || (cur_output != end_output))) {
687e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (cur_output) *cur_output++ = *cur_char;
688e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++cur_char;
689e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        buf_size += 1;
690e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
691e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
692e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default:
693e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (cur_output) { *(cur_output++) = *cur_char; }
694e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      buf_size += 1;
695e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
696e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
697e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (*cur_char == 0) break;
698e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++cur_char;
699e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
700e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!cur_output || cur_output != end_output) {
702e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (cur_output) *cur_output = 0;
703e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buf_size += 1;
704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* We trunc result */
707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *(--cur_output) = 0;
708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
709e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
710e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return buf_size;
711e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
713e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_time_t* _Locale_time_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int size, month, dayofweek;
715e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t length;
716e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char fmt80[80];
717e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t wbuf80[80];
718e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
719e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_time_t *ltime = (_Locale_time_t*)malloc(sizeof(_Locale_time_t));
720e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
721e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime) { *__err_code = _STLP_LOC_NO_MEMORY; return ltime; }
722e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(ltime, 0, sizeof(_Locale_time_t));
723e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
724e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(name, &ltime->lc.id, ltime->cp, lc_hint) == -1)
725e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { free(ltime); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
726e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
727e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ( ltime->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { ltime->lc.id = 0x409; }
730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
732e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (month = LOCALE_SMONTHNAME1; month <= LOCALE_SMONTHNAME12; ++month) { /* Small hack :-) */
733e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ltime->month[month - LOCALE_SMONTHNAME1] = (char*)malloc(size);
735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!ltime->month[month - LOCALE_SMONTHNAME1])
736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
737e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->month[month - LOCALE_SMONTHNAME1], size, wbuf80, 80);
738e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
739e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
740e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (month = LOCALE_SABBREVMONTHNAME1; month <= LOCALE_SABBREVMONTHNAME12; ++month) {
741e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
742e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1] = (char*)malloc(size);
743e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1])
744e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
745e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1], size, wbuf80, 80);
746e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
747e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
748e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (dayofweek = LOCALE_SDAYNAME1; dayofweek <= LOCALE_SDAYNAME7; ++dayofweek) {
749e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int dayindex = ( dayofweek != LOCALE_SDAYNAME7 ) ? dayofweek - LOCALE_SDAYNAME1 + 1 : 0;
750e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ltime->dayofweek[dayindex] = (char*)malloc(size);
752e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!ltime->dayofweek[dayindex])
753e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->dayofweek[dayindex], size, wbuf80, 80);
755e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
756e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (dayofweek = LOCALE_SABBREVDAYNAME1; dayofweek <= LOCALE_SABBREVDAYNAME7; ++dayofweek) {
758e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int dayindex = ( dayofweek != LOCALE_SABBREVDAYNAME7 ) ? dayofweek - LOCALE_SABBREVDAYNAME1 + 1 : 0;
759e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
760e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ltime->abbrev_dayofweek[dayindex] = (char*)malloc(size);
761e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!ltime->abbrev_dayofweek[dayindex])
762e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
763e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->abbrev_dayofweek[dayindex], size, wbuf80, 80);
764e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
765e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
766e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SSHORTDATE, fmt80, 80, wbuf80, 80);
767e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = __ConvertDate(fmt80, NULL, 0);
768e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltime->date_format = (char*)malloc(size);
769e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime->date_format)
770e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
771e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __ConvertDate(fmt80, ltime->date_format, size);
772e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
773e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SLONGDATE, fmt80, 80, wbuf80, 80);
774e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = __ConvertDate(fmt80, NULL, 0);
775e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltime->long_date_format = (char*)malloc(size);
776e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime->long_date_format)
777e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Locale_time_destroy(ltime);*__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
778e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __ConvertDate(fmt80, ltime->long_date_format, size);
779e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
780e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_STIMEFORMAT, fmt80, 80, wbuf80, 80);
781e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = __ConvertTime(fmt80, NULL, 0);
782e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltime->time_format = (char*)malloc(size);
783e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime->time_format)
784e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
785e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __ConvertTime(fmt80, ltime->time_format, size);
786e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
787e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* NT doesn't provide this information, we must simulate. */
788e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  length = strlen(ltime->date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
789e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltime->date_time_format = (char*)malloc(length);
790e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime->date_time_format)
791e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
792e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCPY(ltime->date_time_format, length, ltime->date_format);
793e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCAT(ltime->date_time_format, length, " ");
794e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCAT(ltime->date_time_format, length, ltime->time_format);
795e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
796e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* NT doesn't provide this information, we must simulate. */
797e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  length = strlen(ltime->long_date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
798e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ltime->long_date_time_format = (char*)malloc(length);
799e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime->long_date_time_format)
800e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
801e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCPY(ltime->long_date_time_format, length, ltime->long_date_format);
802e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCAT(ltime->long_date_time_format, length, " ");
803e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STRCAT(ltime->long_date_time_format, length, ltime->time_format);
804e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
805e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S1159, ltime->am, 9, wbuf80, 80);
806e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S2359, ltime->pm, 9, wbuf80, 80);
807e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
808e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ltime;
809e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
810e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
811e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_collate_t* _Locale_collate_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
812e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_collate_t *lcol = (_Locale_collate_t*)malloc(sizeof(_Locale_collate_t));
813e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lcol) { *__err_code = _STLP_LOC_NO_MEMORY; return lcol; }
814e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(lcol, 0, sizeof(_Locale_collate_t));
815e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
816e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(name, &lcol->lc.id, lcol->cp, lc_hint) == -1)
817e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { free(lcol); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
818e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
819e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
820e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ( lcol->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
821e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { lcol->lc.id = 0x409; }
822e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
823e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
824e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return lcol;
825e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
826e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
827e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_monetary_t* _Locale_monetary_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
828e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *GroupingBuffer;
829e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int BufferSize;
830e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char FracDigits[3];
831e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t wbuf[6];
832e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
833e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_monetary_t *lmon = (_Locale_monetary_t*)malloc(sizeof(_Locale_monetary_t));
834e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lmon) { *__err_code = _STLP_LOC_NO_MEMORY; return lmon; }
835e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(lmon, 0, sizeof(_Locale_monetary_t));
836e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
837e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(name, &lmon->lc.id, lmon->cp, lc_hint) == -1)
838e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { free(lmon); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
839e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
840e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lmon->lc.id != INVARIANT_LCID) {
841e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* Extract information about monetary system */
842e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SDECIMAL, lmon->decimal_point, 4, wbuf, 6);
843e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_STHOUSAND, lmon->thousands_sep, 4, wbuf, 6);
844e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
845e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    BufferSize = GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, NULL, 0);
846e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GroupingBuffer = (char*)malloc(BufferSize);
847e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!GroupingBuffer)
848e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    { lmon->grouping = NULL; *__err_code = _STLP_LOC_NO_MEMORY; return lmon; }
849e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
850e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __FixGrouping(GroupingBuffer);
851e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lmon->grouping = GroupingBuffer;
852e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
853e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SCURRENCY, lmon->curr_symbol, 6, wbuf, 6);
854e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SNEGATIVESIGN, lmon->negative_sign, 5, wbuf, 6);
855e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SPOSITIVESIGN, lmon->positive_sign, 5, wbuf, 6);
856e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
857e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lmon->lc.id, LOCALE_ICURRDIGITS, FracDigits, 3);
858e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lmon->frac_digits = atoi(FracDigits);
859e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
860e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lmon->lc.id, LOCALE_IINTLCURRDIGITS, FracDigits, 3);
861e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lmon->int_frac_digits = atoi(FracDigits);
862e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
863e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SINTLSYMBOL, lmon->int_curr_symbol, 5, wbuf, 6);
864e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* Even if Platform SDK documentation says that the returned symbol should
865e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * be a 3 letters symbol followed by a seperation character, experimentation
866e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * has shown that no seperation character is ever appended. We are adding it
867e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * ourself to conform to the POSIX specification.
868e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     */
869e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lmon->int_curr_symbol[3] == 0) {
870e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      lmon->int_curr_symbol[3] = ' ';
871e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      lmon->int_curr_symbol[4] = 0;
872e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
873e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
874e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* else it is already ok */
875e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
876e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return lmon;
877e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
878e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
879e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _Locale_messages* _Locale_messages_create(const char *name, _Locale_lcid_t* lc_hint, int *__err_code) {
880e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* The Win32 API has no support for messages facet */
881e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(name)
882e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lc_hint)
883e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__err_code = _STLP_LOC_UNSUPPORTED_FACET_CATEGORY;
884e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return NULL;
885e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
886e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
887e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* _Locale_common_default(char* buf) {
888e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
889e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int CodePage = __GetDefaultCP(LOCALE_USER_DEFAULT);
890e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  my_ltoa(CodePage, cp);
891e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __GetLocaleName(LOCALE_USER_DEFAULT, cp, buf);
892e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
893e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
894e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_ctype_default(char* buf)
895e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
896e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
897e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_numeric_default(char * buf)
898e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
899e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
900e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_time_default(char* buf)
901e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
902e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
903e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_collate_default(char* buf)
904e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
905e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
906e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_monetary_default(char* buf)
907e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
908e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
909e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_messages_default(char* buf)
910e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_common_default(buf); }
911e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
912e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_ctype_name(const _Locale_ctype_t* ltype, char* buf) {
913e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp_buf[MAX_CP_LEN + 1];
914e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  my_ltoa(ltype->cp, cp_buf);
915e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __GetLocaleName(ltype->lc.id, cp_buf, buf);
916e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
917e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
918e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_numeric_name(const _Locale_numeric_t* lnum, char* buf)
919e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __GetLocaleName(lnum->lc.id, lnum->cp, buf); }
920e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
921e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_time_name(const _Locale_time_t* ltime, char* buf)
922e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __GetLocaleName(ltime->lc.id, ltime->cp, buf); }
923e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
924e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_collate_name(const _Locale_collate_t* lcol, char* buf)
925e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __GetLocaleName(lcol->lc.id, lcol->cp, buf); }
926e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
927e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_monetary_name(const _Locale_monetary_t* lmon, char* buf)
928e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __GetLocaleName(lmon->lc.id, lmon->cp, buf); }
929e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
930e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_messages_name(const struct _Locale_messages* lmes, char* buf) {
931e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
932e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(buf)
933e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return NULL;
934e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
935e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
936e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_ctype_destroy(_Locale_ctype_t* ltype) {
937e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltype) return;
938e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
939e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(ltype);
940e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
941e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
942e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_numeric_destroy(_Locale_numeric_t* lnum) {
943e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lnum) return;
944e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
945e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lnum->grouping) free(lnum->grouping);
946e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(lnum);
947e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
948e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
949e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_time_destroy(_Locale_time_t* ltime) {
950e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int i;
951e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!ltime) return;
952e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
953e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (i = 0; i < 12; ++i) {
954e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (ltime->month[i]) free(ltime->month[i]);
955e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (ltime->abbrev_month[i]) free(ltime->abbrev_month[i]);
956e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
957e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
958e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (i = 0; i < 7; ++i) {
959e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (ltime->dayofweek[i]) free(ltime->dayofweek[i]);
960e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (ltime->abbrev_dayofweek[i]) free(ltime->abbrev_dayofweek[i]);
961e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
962e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
963e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (ltime->date_format) free(ltime->date_format);
964e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (ltime->long_date_format) free(ltime->long_date_format);
965e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (ltime->time_format) free(ltime->time_format);
966e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (ltime->date_time_format) free(ltime->date_time_format);
967e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (ltime->long_date_time_format) free(ltime->long_date_time_format);
968e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
969e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(ltime);
970e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
971e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
972e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_collate_destroy(_Locale_collate_t* lcol) {
973e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lcol) return;
974e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
975e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(lcol);
976e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
977e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
978e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_monetary_destroy(_Locale_monetary_t* lmon) {
979e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lmon) return;
980e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
981e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lmon->grouping) free(lmon->grouping);
982e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(lmon);
983e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
984e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
985e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_messages_destroy(struct _Locale_messages* lmes)
986e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_MARK_PARAMETER_AS_UNUSED(lmes) }
987e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
988e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic char const* _Locale_extract_category_name(const char* name, const char* category, char* buf,
989e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 _Locale_lcid_t* hint, int *__err_code) {
990e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char* cname = __Extract_locale_name(name, category, buf);
991e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (cname == 0 || (cname[0] == 'C' && cname[1] == 0)) {
992e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return cname;
993e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
994e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __TranslateToSystem(cname, buf, hint, __err_code);
995e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
996e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
997e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_ctype_name(const char* cname, char* buf,
998e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       _Locale_lcid_t* hint, int *__err_code)
999e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_extract_category_name(cname, "LC_CTYPE", buf, hint, __err_code); }
1000e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1001e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_numeric_name(const char* cname, char* buf,
1002e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                         _Locale_lcid_t* hint, int *__err_code)
1003e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_extract_category_name(cname, "LC_NUMERIC", buf, hint, __err_code); }
1004e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1005e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_time_name(const char* cname, char* buf,
1006e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                      _Locale_lcid_t* hint, int *__err_code)
1007e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_extract_category_name(cname, "LC_TIME", buf, hint, __err_code); }
1008e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1009e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_collate_name(const char* cname, char* buf,
1010e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                         _Locale_lcid_t* hint, int *__err_code)
1011e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_extract_category_name(cname, "LC_COLLATE", buf, hint, __err_code); }
1012e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1013e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_monetary_name(const char* cname, char* buf,
1014e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                          _Locale_lcid_t* hint, int *__err_code)
1015e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_extract_category_name(cname, "LC_MONETARY", buf, hint, __err_code); }
1016e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1017e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* _Locale_extract_messages_name(const char* cname, char* buf,
1018e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                          _Locale_lcid_t* hint, int *__err_code) {
1019e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (cname[0] == 'L' && cname[1] == 'C' && cname[2] == '_') {
1020e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _C_name;
1021e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1022e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (cname[0] == 'C' && cname[1] == 0) {
1023e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _C_name;
1024e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1025e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __TranslateToSystem(cname, buf, hint, __err_code);
1026e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1027e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1028e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* ctype */
1029e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1030e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst _Locale_mask_t* _Locale_ctype_table(_Locale_ctype_t* ltype) {
1031e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_ASSERT(sizeof(_Locale_mask_t) == sizeof(ltype->ctable[0]))
1032e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (const _Locale_mask_t*)ltype->ctable;
1033e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1034e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1035e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_toupper(_Locale_ctype_t* ltype, int c) {
1036e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[2], out_buf[2];
1037e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buf[0] = (char)c; buf[1] = 0;
1038e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
1039e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
1040e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return out_buf[0];
1041e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1042e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1043e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wchar_t wbuf[2];
1044e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
1045e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
1046e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1047e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
1048e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1049e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
1050e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
1051e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return out_buf[0];
1052e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1053e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1054e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1055e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_tolower(_Locale_ctype_t* ltype, int c) {
1056e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[2], out_buf[2];
1057e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buf[0] = (char)c; buf[1] = 0;
1058e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
1059e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
1060e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return out_buf[0];
1061e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1062e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1063e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wchar_t wbuf[2];
1064e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
1065e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
1066e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1067e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
1068e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1069e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
1070e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
1071e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return out_buf[0];
1072e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1073e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1074e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1075e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef CSTR_EQUAL /* VC5SP3*/
1076e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define CSTR_EQUAL 2
1077e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1078e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef CSTR_LESS_THAN /* VC5SP3 */
1079e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define CSTR_LESS_THAN 1
1080e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1081e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1082e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic DWORD max_DWORD = 0xffffffff;
1083e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic DWORD trim_size_t_to_DWORD(size_t n) { return n < (size_t)max_DWORD ? (DWORD)n : max_DWORD; }
1084e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1085e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Collate */
1086e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* This function takes care of the potential size_t DWORD different size. */
1087e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int _Locale_strcmp_auxA(_Locale_collate_t* lcol,
1088e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               const char* s1, size_t n1,
1089e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               const char* s2, size_t n2) {
1090e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int result = CSTR_EQUAL;
1091e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (n1 > 0 || n2 > 0) {
1092e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    DWORD size1 = trim_size_t_to_DWORD(n1);
1093e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    DWORD size2 = trim_size_t_to_DWORD(n2);
1094e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result = CompareStringA(lcol->lc.id, 0, s1, size1, s2, size2);
1095e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (result != CSTR_EQUAL)
1096e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
1097e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    n1 -= size1;
1098e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    n2 -= size2;
1099e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return result;
1101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_strcmp(_Locale_collate_t* lcol,
1104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                   const char* s1, size_t n1,
1105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                   const char* s2, size_t n2) {
1106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int result;
1107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetDefaultCP(lcol->lc.id) == atoi(lcol->cp)) {
1108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result = _Locale_strcmp_auxA(lcol, s1, n1, s2, n2);
1109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char *buf1, *buf2;
1112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t size1, size2;
1113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buf1 = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), s1, n1, &size1);
1114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buf2 = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), s2, n2, &size2);
1115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result = _Locale_strcmp_auxA(lcol, buf1, size1, buf2, size2);
1117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    free(buf1); free(buf2);
1118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (result == CSTR_EQUAL) ? 0 : (result == CSTR_LESS_THAN) ? -1 : 1;
1120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottsize_t _Locale_strxfrm(_Locale_collate_t* lcol,
1123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       char* dst, size_t dst_size,
1124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       const char* src, size_t src_size) {
1125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int result;
1126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* The Windows API do not support transformation of very long strings (src_size > INT_MAX)
1128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   * In this case the result will just be the input string:
1129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   */
1130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (src_size > INT_MAX) {
1131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (dst != 0) {
1132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(dst, dst_size, src, src_size);
1133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return src_size;
1135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (dst_size > INT_MAX) {
1137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* now that we know that src_size <= INT_MAX we can safely decrease dst_size to INT_MAX. */
1138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    dst_size = INT_MAX;
1139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetDefaultCP(lcol->lc.id) == atoi(lcol->cp))
1142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result = LCMapStringA(lcol->lc.id, LCMAP_SORTKEY, src, (int)src_size, dst, (int)dst_size);
1143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char *buf;
1145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t size;
1146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buf = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), src, src_size, &size);
1147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result = LCMapStringA(lcol->lc.id, LCMAP_SORTKEY, buf, (int)size, dst, (int)dst_size);
1149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    free(buf);
1150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return result != 0 ? result - 1 : 0;
1152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Numeric */
1155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* __true_name = "true";
1156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* __false_name = "false";
1157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_decimal_point(_Locale_numeric_t* lnum)
1159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lnum->decimal_point[0]; }
1160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_thousands_sep(_Locale_numeric_t* lnum)
1162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lnum->thousands_sep[0]; }
1163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_grouping(_Locale_numeric_t * lnum) {
1165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lnum->grouping) return "";
1166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return lnum->grouping;
1167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_true(_Locale_numeric_t * lnum) {
1170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lnum)
1171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __true_name; /* NT does't provide information about this */
1172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_false(_Locale_numeric_t * lnum) {
1175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lnum)
1176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __false_name; /* NT does't provide information about this */
1177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Monetary */
1180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_int_curr_symbol(_Locale_monetary_t * lmon)
1181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->int_curr_symbol; }
1182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_currency_symbol(_Locale_monetary_t * lmon)
1184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->curr_symbol; }
1185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_mon_decimal_point(_Locale_monetary_t * lmon)
1187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->decimal_point[0]; }
1188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_mon_thousands_sep(_Locale_monetary_t * lmon)
1190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->thousands_sep[0]; }
1191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_mon_grouping(_Locale_monetary_t * lmon) {
1193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!lmon->grouping) return "";
1194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return lmon->grouping;
1195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_positive_sign(_Locale_monetary_t * lmon)
1198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->positive_sign; }
1199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_negative_sign(_Locale_monetary_t * lmon)
1201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lmon->negative_sign; }
1202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_int_frac_digits(_Locale_monetary_t * lmon)
1204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (char)lmon->int_frac_digits; }
1205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar _Locale_frac_digits(_Locale_monetary_t * lmon)
1207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (char)lmon->frac_digits; }
1208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_p_cs_precedes(_Locale_monetary_t * lmon) {
1210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSYMPRECEDES, loc_data, 2);
1212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (loc_data[0] == '0') return 0;
1213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (loc_data[0] == '1') return 1;
1214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return -1;
1215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_p_sep_by_space(_Locale_monetary_t * lmon) {
1218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSEPBYSPACE, loc_data, 2);
1220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (loc_data[0] == '0') return 0;
1221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (loc_data[0] == '1') return 1;
1222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return -1;
1223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_p_sign_posn(_Locale_monetary_t * lmon) {
1226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lmon->lc.id != INVARIANT_LCID) {
1228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSIGNPOSN, loc_data, 2);
1229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return atoi(loc_data);
1230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return CHAR_MAX;
1233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_n_cs_precedes(_Locale_monetary_t * lmon) {
1237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSYMPRECEDES, loc_data, 2);
1239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (loc_data[0] == '0') return 0;
1240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (loc_data[0] == '1') return 1;
1241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return -1;
1242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_n_sep_by_space(_Locale_monetary_t * lmon) {
1245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSEPBYSPACE, loc_data, 2);
1247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (loc_data[0] == '0') return 0;
1248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (loc_data[0] == '1') return 1;
1249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return -1;
1250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint _Locale_n_sign_posn(_Locale_monetary_t * lmon) {
1253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char loc_data[2];
1254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lmon->lc.id != INVARIANT_LCID) {
1255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSIGNPOSN, loc_data, 2);
1256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return atoi(loc_data);
1257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return CHAR_MAX;
1260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Time */
1264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_full_monthname(_Locale_time_t * ltime, int month) {
1265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char **names = (const char**)ltime->month;
1266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return names[month];
1267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_abbrev_monthname(_Locale_time_t * ltime, int month) {
1270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char **names = (const char**)ltime->abbrev_month;
1271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return names[month];
1272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_full_dayofweek(_Locale_time_t * ltime, int day) {
1275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char **names = (const char**)ltime->dayofweek;
1276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return names[day];
1277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char * _Locale_abbrev_dayofweek(_Locale_time_t * ltime, int day) {
1280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char **names = (const char**)ltime->abbrev_dayofweek;
1281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return names[day];
1282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_d_t_fmt(_Locale_time_t* ltime)
1285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->date_time_format; }
1286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_long_d_t_fmt(_Locale_time_t* ltime)
1288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->long_date_time_format; }
1289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_d_fmt(_Locale_time_t* ltime)
1291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->date_format; }
1292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_long_d_fmt(_Locale_time_t* ltime)
1294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->long_date_format; }
1295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_t_fmt(_Locale_time_t* ltime)
1297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->time_format; }
1298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_am_str(_Locale_time_t* ltime)
1300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->am; }
1301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_pm_str(_Locale_time_t* ltime)
1303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ltime->pm; }
1304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Messages */
1306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnl_catd_type _Locale_catopen(struct _Locale_messages* lmes, const char* cat_name) {
1307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
1308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(cat_name)
1309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return -1;
1310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_catclose(struct _Locale_messages* lmes, nl_catd_type cat) {
1312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
1313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(&cat)
1314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* _Locale_catgets(struct _Locale_messages* lmes, nl_catd_type cat,
1316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                            int setid, int msgid, const char *dfault) {
1317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
1318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(&cat)
1319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(&setid)
1320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_MARK_PARAMETER_AS_UNUSED(&msgid)
1321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return dfault;
1322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef __cplusplus
1325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} /* extern C */
1326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
1327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __FixGrouping(char *grouping) {
1330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* This converts NT version which uses '0' instead of 0, etc ; to ANSI */
1331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *g = grouping;
1332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char building_group = 0;
1333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char repeat_last = 0;
1334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* Check there is a grouping info otherwise we would add a useless CHAR_MAX */
1335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (*g) {
1336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (; *g; ++g) {
1337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (*g > '0' && *g <= '9') {
1338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (!building_group) {
1339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *grouping = *g - '0';
1340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          building_group = 1;
1341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
1342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        else {
1343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          /* Known issue: grouping might roll. */
1344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *grouping = *grouping * 10 + *g - '0';
1345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
1346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else if (*g == '0') {
1348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (!building_group) {
1349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          repeat_last = 1;
1350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
1351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        else
1352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          /* Known issue: grouping might roll. */
1353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          *grouping *= 10;
1354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else if (*g == ';') {
1356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        /* Stop adding to the current group */
1357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        building_group = 0;
1358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++grouping;
1359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* else we ignore the character */
1361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!repeat_last)
1364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      *grouping++ = CHAR_MAX;
1365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *grouping = 0;
1366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* __ConvertName(const char* lname, LOCALECONV* ConvTable, int TableSize) {
1370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int i;
1371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int cmp;
1372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int low = 0;
1373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int high = TableSize - 1;
1374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /*  typical binary search - do until no more to search or match */
1376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (low <= high) {
1377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i = (low + high) / 2;
1378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if ((cmp = lstrcmpiA(lname, (*(ConvTable + i)).name)) == 0)
1380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return (*(ConvTable + i)).abbrev;
1381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (cmp < 0)
1382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      high = i - 1;
1383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
1384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      low = i + 1;
1385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return lname;
1387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __ParseLocaleString(const char* lname,
1390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                        char* lang, char* ctry, char* page) {
1391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int param = 0;
1392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t len;
1393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t tmpLen;
1394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lname[0] == 0)
1396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
1397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* We look for the first country separator '_' */
1399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  len = strcspn(lname, "_");
1400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lname[len] == '_') {
1401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (len == 0 || len > MAX_LANG_LEN) return -1; /* empty lang is invalid*/
1402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len);
1403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lname += len + 1;
1404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++param;
1405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* We look for the last code page separator '.' */
1408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  len = -1;
1409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  tmpLen = strcspn(lname, ".");
1410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (lname[tmpLen] == '.') {
1411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    len = tmpLen; ++tmpLen;
1412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    tmpLen += strcspn(lname + tmpLen, ".");
1413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (len != -1) { /* Means that we found a '.' */
1415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (param == 0) {
1416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* We have no lang yet so we have to fill it first, no country */
1417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len > MAX_LANG_LEN) return -1;
1418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len == 0) {
1419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        /* No language nor country, only code page */
1420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ++param;
1421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else
1423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      { _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len); }
1424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      ++param;
1425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
1427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* We already have a lang so we are now looking for the country: */
1428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len == 0) return -1; /* We forbid locale name with the "_." motif in it */
1429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len > MAX_CTRY_LEN) return -1;
1430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(ctry, MAX_CTRY_LEN + 1, lname, len);
1431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++param;
1433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    lname += len + 1;
1434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* We look for ',' for compatibility with POSIX */
1437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  len = strcspn(lname, ",");
1438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (param) {
1439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 0:
1440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len > MAX_LANG_LEN) return -1;
1441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len);
1442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
1443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 1:
1444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len > MAX_CTRY_LEN) return -1;
1445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(ctry, MAX_CTRY_LEN + 1, lname, len);
1446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
1447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default:
1448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (len > MAX_CP_LEN) return -1;
1449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(page, MAX_CP_LEN + 1, lname, len);
1450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
1451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* ',' POSIX modifier is not used in NT */
1454e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return 0;
1455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1456e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Data necessary for find LCID*/
1458e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic CRITICAL_SECTION __criticalSection;
1459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int __FindFlag;
1460e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic LCID __FndLCID;
1461e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* __FndLang;
1462e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* __FndCtry;
1463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_init()
1465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ InitializeCriticalSection(&__criticalSection); }
1466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_final()
1468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ DeleteCriticalSection(&__criticalSection); }
1469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic LCID LocaleFromHex(const char* locale) {
1471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned long result = 0;
1472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int digit;
1473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (*locale) {
1474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result <<= 4;
1475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    digit = (*locale >= '0' && *locale <= '9') ? *locale - '0':
1476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            (*locale >= 'A' && *locale <= 'F') ? (*locale - 'A') + 10
1477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                               : (*locale - 'a') + 10;
1478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    result += digit;
1479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++locale;
1480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (LCID)result;
1482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic BOOL CALLBACK EnumLocalesProcA(LPSTR locale) {
1485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LCID lcid = LocaleFromHex(locale);
1486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int LangFlag = 0, CtryFlag = !__FndCtry;
1487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static char Lang[MAX_LANG_LEN], Ctry[MAX_CTRY_LEN];
1488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, Lang, MAX_LANG_LEN);
1490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lstrcmpiA(Lang, __FndLang) != 0) {
1491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lcid, LOCALE_SABBREVLANGNAME, Lang, MAX_LANG_LEN);
1492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lstrcmpiA(Lang, __FndLang) != 0) {
1493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, Lang, MAX_LANG_LEN);
1494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (lstrcmpiA(Lang, __FndLang) == 0) LangFlag = 1;
1495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else LangFlag = 1;
1497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else LangFlag = 1;
1499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__FndCtry) {
1501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY, Ctry, MAX_CTRY_LEN);
1502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lstrcmpiA(Ctry, __FndCtry) != 0) {
1503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      GetLocaleInfoA(lcid, LOCALE_SABBREVCTRYNAME, Ctry, MAX_CTRY_LEN);
1504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (lstrcmpiA(Ctry, __FndCtry) != 0) {
1505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, Ctry, MAX_CTRY_LEN);
1506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (lstrcmpiA(Ctry, __FndCtry) == 0) CtryFlag = 1;
1507e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1508e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else CtryFlag = 1;
1509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
1511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CtryFlag = 1;
1512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (LangFlag && CtryFlag) {
1515e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __FindFlag = 1;
1516e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __FndLCID = lcid;
1517e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return FALSE;
1518e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1519e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1520e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return TRUE;
1521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __GetLCID(const char* lang, const char* ctry, LCID* lcid) {
1524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int ret;
1525e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EnterCriticalSection(&__criticalSection);
1526e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1527e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __FindFlag = 0;
1528e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __FndLang = lang;
1529e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __FndCtry = ctry;
1530e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EnumSystemLocalesA(EnumLocalesProcA, LCID_INSTALLED);
1531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1532e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__FindFlag != 0) *lcid = __FndLCID;
1533e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ret = __FindFlag != 0 ? 0 : -1;
1534e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LeaveCriticalSection(&__criticalSection);
1536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ret;
1537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __GetLCIDFromName(const char* lname, LCID* lcid, char* cp, _Locale_lcid_t *hint) {
1540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char lang[MAX_LANG_LEN + 1], ctry[MAX_CTRY_LEN + 1], page[MAX_CP_LEN + 1];
1541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int result = 0;
1542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lname == NULL || lname[0] == 0) {
1543e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *lcid = LOCALE_USER_DEFAULT;
1544e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
1545e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(lang, 0, MAX_LANG_LEN + 1);
1548e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(ctry, 0, MAX_CTRY_LEN + 1);
1549e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset(page, 0, MAX_CP_LEN + 1);
1550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__ParseLocaleString(lname, lang, ctry, page) == -1) return -1;
1551e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (hint != 0) {
1553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *lcid = hint->id;
1554e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1555e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1556e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lang[0] == 0 && ctry[0] == 0)
1557e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      *lcid = LOCALE_USER_DEFAULT; /* Only code page given. */
1558e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
1559e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (ctry[0] == 0) {
1560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        result = __GetLCID(__ConvertName(lang, __rg_language, sizeof(__rg_language) / sizeof(LOCALECONV)), NULL, lcid);
1561e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (result != 0) {
1562e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          /* Check 'C' special case. Check is done after call to __GetLCID because normal programs do not
1563e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           * generate facet from 'C' name, they use the locale::classic() facets. */
1564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          if (lang[0] == 'C' && lang[1] == 0) {
1565e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            *lcid = INVARIANT_LCID;
1566e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            result = 0;
1567e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          }
1568e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
1569e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
1571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        result = __GetLCID(__ConvertName(lang, __rg_language, sizeof(__rg_language) / sizeof(LOCALECONV)),
1572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                           __ConvertName(ctry, __rg_country, sizeof(__rg_country) / sizeof(LOCALECONV)),
1573e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                           lcid);
1574e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (result != 0) {
1575e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          /* Non NLS mapping might introduce problem with some locales when only one entry is mapped,
1576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           * the lang or the country (example: chinese locales like 'chinese_taiwan' gives 'CHS_taiwan'
1577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           * that do not exists in system). This is why we are giving this locale an other chance by
1578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           * calling __GetLCID without the mapping. */
1579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          result = __GetLCID(lang, ctry, lcid);
1580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
1581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
1582e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1585e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (result == 0) {
1586e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* Handling code page */
1587e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lstrcmpiA(page, "ACP") == 0 || page[0] == 0)
1588e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      my_ltoa(__intGetACP(*lcid), cp);
1589e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (lstrcmpiA(page, "OCP") == 0)
1590e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      my_ltoa(__intGetOCP(*lcid), cp);
1591e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (lstrcmpiA(page, "UTF7") == 0)
1592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      my_ltoa(CP_UTF7, cp);
1593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (lstrcmpiA(page, "UTF8") == 0)
1594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      my_ltoa(CP_UTF8, cp);
1595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
1596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STRNCPY(cp, MAX_CP_LEN + 1, page, 5);
1597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* Code page must be an integer value,
1599e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * 0 returned by __intGetACP and 1 returned by __intGetOCP are invalid
1600e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * values.
1601e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     */
1602e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (cp[1] == 0 && (cp[0] == '0' || cp[1] == '1'))
1603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return -1;
1604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (atoi(cp) == 0)
1605e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return -1;
1606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return result;
1609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* __GetLocaleName(LCID lcid, const char* cp, char* buf) {
1612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (lcid == INVARIANT_LCID) {
1613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _C_name;
1614e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char lang[MAX_LANG_LEN + 1], ctry[MAX_CTRY_LEN + 1];
1617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, lang, MAX_LANG_LEN);
1618e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY, ctry, MAX_CTRY_LEN);
1619e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRCPY(buf, _Locale_MAX_SIMPLE_NAME, lang);
1620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, "_");
1621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, ctry);
1622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, ".");
1623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, cp);
1624e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return buf;
1625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* __Extract_locale_name(const char* loc, const char* category, char* buf) {
1629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *expr;
1630e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t len_name;
1631e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1632e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (loc[0] == 'L' && loc[1] == 'C' && loc[2] == '_') {
1633e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    expr = strstr((char*)loc, category);
1634e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (expr == NULL) return NULL; /* Category not found. */
1635e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    expr = strchr(expr, '=');
1636e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (expr == NULL) return NULL;
1637e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++expr;
1638e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    len_name = strcspn(expr, ";");
1639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    len_name = len_name >= _Locale_MAX_SIMPLE_NAME ? _Locale_MAX_SIMPLE_NAME - 1
1640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   : len_name;
1641e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STRNCPY(buf, _Locale_MAX_SIMPLE_NAME, expr, len_name); buf[len_name] = 0;
1642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return buf;
1643e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
1645e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return loc;
1646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1647e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1648e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1649e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar const* __TranslateToSystem(const char* lname, char* buf, _Locale_lcid_t* hint,
1650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                int *__err_code) {
1651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LCID lcid;
1652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[MAX_CP_LEN + 1];
1653e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__GetLCIDFromName(lname, &lcid, cp, hint) != 0)
1654e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
1655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __GetLocaleName(lcid, cp, buf);
1657e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1658e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1659e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __GetLocaleInfoUsingACP(LCID lcid, const char* cp, LCTYPE lctype, char* buf, int buf_size, wchar_t* wbuf, int wbuf_size) {
1660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t *Buffer;
1661e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int BufferSize;
1662e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int icp;
1663e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  GetLocaleInfoA(lcid, lctype, buf, buf_size);
1665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1666e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  icp = atoi(cp);
1667e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (icp != CP_ACP && buf[0] != 0) {
1668e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    BufferSize = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
1669e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (BufferSize > wbuf_size)
1670e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
1671e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      Buffer = (wchar_t*)malloc(sizeof(wchar_t) * BufferSize);
1672e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1673e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
1674e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
1675e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      Buffer = wbuf;
1676e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1677e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    MultiByteToWideChar(CP_ACP, 0, buf, -1, Buffer, BufferSize);
1678e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    WideCharToMultiByte(icp, 0, Buffer, -1, buf, buf_size, NULL, NULL);
1679e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (Buffer != wbuf)
1680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
1681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      free(Buffer);
1682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1684e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1685e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1686e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Return 0 if ANSI code page not used */
1687e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __intGetACP(LCID lcid) {
1688e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[6];
1689e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!GetLocaleInfoA(lcid, LOCALE_IDEFAULTANSICODEPAGE, cp, 6)) {
1690e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_LANG_INVARIANT_DEFINED)
1691e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (lcid == INVARIANT_LCID) {
1692e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      /* We are using a limited PSDK, we rely on the most common code page */
1693e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return 1252;
1694e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1695e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1696e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
1697e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1698e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return atoi(cp);
1699e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1700e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Return 1 if OEM code page not used */
1702e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __intGetOCP(LCID lcid) {
1703e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char cp[6];
1704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, cp, 6))
1705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
1706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return atoi(cp);
1707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1709e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint __GetDefaultCP(LCID lcid) {
1710e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int cp = __intGetACP(lcid);
1711e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (cp == 0) return __intGetOCP(lcid);
1712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else return cp;
1713e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1715e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int trim_size_t_to_int(size_t n) { return n < (size_t)INT_MAX ? (int)n : INT_MAX; }
1716e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1717e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar* __ConvertToCP(int from_cp, int to_cp, const char *from, size_t size, size_t *ret_buf_size) {
1718e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t wbuffer_size, buffer_size, from_offset, wbuf_offset;
1719e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int from_size, to_size, wbuf_size;
1720e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t *wbuffer;
1721e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char* buffer;
1722e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1723e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t orig_size = size;
1724e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1725e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wbuffer_size = 0;
1726e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  from_offset = 0;
1727e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (size > 0) {
1728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from_size = trim_size_t_to_int(size);
1729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuffer_size += MultiByteToWideChar(from_cp, MB_PRECOMPOSED,
1730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        from + from_offset, from_size, NULL, 0);
1731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from_offset += from_size;
1732e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size -= from_size;
1733e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wbuffer = (wchar_t*)malloc(sizeof(wchar_t)*wbuffer_size);
1736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1737e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = orig_size;
1738e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wbuf_offset = 0;
1739e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  from_offset = 0;
1740e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (size > 0) {
1741e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from_size = trim_size_t_to_int(size);
1742e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_size = trim_size_t_to_int(wbuffer_size - wbuf_offset);
1743e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_offset += MultiByteToWideChar(from_cp, MB_PRECOMPOSED,
1744e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       from + from_offset, from_size, wbuffer + wbuf_offset, wbuf_size);
1745e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from_offset += from_size;
1746e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size -= from_size;
1747e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1748e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1749e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buffer_size = 0;
1750e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wbuf_offset = 0;
1751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = wbuffer_size;
1752e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (size > 0) {
1753e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_size = trim_size_t_to_int(size);
1754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buffer_size += WideCharToMultiByte(to_cp, WC_COMPOSITECHECK | WC_SEPCHARS,
1755e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       wbuffer + wbuf_offset, wbuf_size,
1756e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       NULL, 0, NULL, FALSE);
1757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_offset += wbuf_size;
1758e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size -= wbuf_size;
1759e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1760e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1761e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buffer = (char*)malloc(buffer_size);
1762e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *ret_buf_size = buffer_size;
1763e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1764e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size = wbuffer_size;
1765e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wbuf_offset = 0;
1766e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (size > 0) {
1767e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_size = trim_size_t_to_int(size);
1768e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    to_size = trim_size_t_to_int(buffer_size);
1769e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buffer_size -= WideCharToMultiByte(to_cp, WC_COMPOSITECHECK | WC_SEPCHARS,
1770e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       wbuffer + wbuf_offset, wbuf_size,
1771e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       buffer, to_size, NULL, FALSE);
1772e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    wbuf_offset += wbuf_size;
1773e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size -= wbuf_size;
1774e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1775e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1776e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  free(wbuffer);
1777e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return buffer;
1778e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1779e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1780e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef __cplusplus
1781e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1782e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1783e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1784e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T
1785e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include "c_wlocale_win32.c"
1786e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1787