177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Written 2000
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Anton Lapach
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <limits.h>
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MSVC) || defined (__ICL)
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <memory.h>
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <string.h>
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <locale.h>
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <stdlib.h>
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <stdio.h>
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRCPY(D, DS, S) strcpy_s(D, DS, S)
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRNCPY(D, DS, S, C) strncpy_s(D, DS, S, C)
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRCAT(D, DS, S) strcat_s(D, DS, S)
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRCPY(D, DS, S) strcpy(D, S)
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRNCPY(D, DS, S, C) strncpy(D, S, C)
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_STRCAT(D, DS, S) strcat(D, S)
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__cplusplus)
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerextern "C" {
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Framework functions */
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  locale :: "lang[_country[.code_page]]"
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  | ".code_page"
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  | ""
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  | NULL
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner*/
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _LOCALECONV {
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char* name;
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char* abbrev;
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} LOCALECONV;
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAX_LANG_LEN        64  /* max language name length */
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAX_CTRY_LEN        64  /* max country name length */
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAX_MODIFIER_LEN    0   /* max modifier name length - n/a */
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAX_LC_LEN          (MAX_LANG_LEN+MAX_CTRY_LEN+MAX_MODIFIER_LEN+3)
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                /* max entire locale string length */
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAX_CP_LEN          5   /* max code page name length */
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (LANG_INVARIANT)
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define LANG_INVARIANT 0x7f
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_LANG_INVARIANT_DEFINED
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef CP_UTF7
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define CP_UTF7 65000
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef CP_UTF8
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define CP_UTF8 65001
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define INVARIANT_LCID MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char *_C_name = "C";
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*  non-NLS language string table */
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic LOCALECONV __rg_language[] = {
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"american",                    "ENU"},
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"american english",            "ENU"},
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"american-english",            "ENU"},
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"australian",                  "ENA"},
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"belgian",                     "NLB"},
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"canadian",                    "ENC"},
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chh",                         "ZHH"},
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chi",                         "ZHI"},
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chinese",                     "CHS"},
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chinese-hongkong",            "ZHH"},
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chinese-simplified",          "CHS"},
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chinese-singapore",           "ZHI"},
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"chinese-traditional",         "CHT"},
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"dutch-belgian",               "NLB"},
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-american",            "ENU"},
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-aus",                 "ENA"},
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-belize",              "ENL"},
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-can",                 "ENC"},
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-caribbean",           "ENB"},
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-ire",                 "ENI"},
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-jamaica",             "ENJ"},
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-nz",                  "ENZ"},
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-south africa",        "ENS"},
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-trinidad y tobago",   "ENT"},
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-uk",                  "ENG"},
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-us",                  "ENU"},
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"english-usa",                 "ENU"},
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"french-belgian",              "FRB"},
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"french-canadian",             "FRC"},
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"french-luxembourg",           "FRL"},
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"french-swiss",                "FRS"},
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"german-austrian",             "DEA"},
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"german-lichtenstein",         "DEC"},
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"german-luxembourg",           "DEL"},
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"german-swiss",                "DES"},
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"irish-english",               "ENI"},
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"italian-swiss",               "ITS"},
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"norwegian",                   "NOR"},
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"norwegian-bokmal",            "NOR"},
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"norwegian-nynorsk",           "NON"},
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"portuguese-brazilian",        "PTB"},
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-argentina",           "ESS"},
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-bolivia",             "ESB"},
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-chile",               "ESL"},
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-colombia",            "ESO"},
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-costa rica",          "ESC"},
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-dominican republic",  "ESD"},
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-ecuador",             "ESF"},
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-el salvador",         "ESE"},
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-guatemala",           "ESG"},
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-honduras",            "ESH"},
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-mexican",             "ESM"},
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-modern",              "ESN"},
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-nicaragua",           "ESI"},
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-panama",              "ESA"},
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-paraguay",            "ESZ"},
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-peru",                "ESR"},
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-puerto rico",         "ESU"},
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-uruguay",             "ESY"},
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"spanish-venezuela",           "ESV"},
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"swedish-finland",             "SVF"},
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"swiss",                       "DES"},
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"uk",                          "ENG"},
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"us",                          "ENU"},
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"usa",                         "ENU"}
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*  non-NLS country string table */
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic LOCALECONV __rg_country[] = {
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"america",                     "USA"},
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"britain",                     "GBR"},
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"china",                       "CHN"},
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"czech",                       "CZE"},
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"england",                     "GBR"},
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"great britain",               "GBR"},
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"holland",                     "NLD"},
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"hong-kong",                   "HKG"},
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"new-zealand",                 "NZL"},
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"nz",                          "NZL"},
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"pr china",                    "CHN"},
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"pr-china",                    "CHN"},
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"puerto-rico",                 "PRI"},
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"slovak",                      "SVK"},
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"south africa",                "ZAF"},
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"south korea",                 "KOR"},
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"south-africa",                "ZAF"},
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"south-korea",                 "KOR"},
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"trinidad & tobago",           "TTO"},
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"uk",                          "GBR"},
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"united-kingdom",              "GBR"},
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"united-states",               "USA"},
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {"us",                          "USA"},
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_name_hint {
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  LCID id;
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_lcid_t;
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_ctype {
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_lcid_t lc;
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  UINT cp;
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned short ctable[256];
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_ctype_t;
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_numeric {
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_lcid_t lc;
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char decimal_point[4];
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char thousands_sep[4];
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *grouping;
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_numeric_t;
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_time {
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_lcid_t lc;
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *month[12];
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *abbrev_month[12];
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *dayofweek[7];
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *abbrev_dayofweek[7];
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *date_time_format;
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *long_date_time_format;
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *date_format;
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *long_date_format;
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *time_format;
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char am[9];
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char pm[9];
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_time_t;
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_collate {
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_lcid_t lc;
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_collate_t;
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef struct _Locale_monetary {
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_lcid_t lc;
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char decimal_point[4];
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char thousands_sep[4];
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *grouping;
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char int_curr_symbol[5]; /* 3 + 1 + 1 */
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char curr_symbol[6];
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char negative_sign[5];
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char positive_sign[5];
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int frac_digits;
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int int_frac_digits;
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} _Locale_monetary_t;
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Internal function */
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void __FixGrouping(char *grouping);
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* __ConvertName(const char* lname, LOCALECONV* ConvTable, int TableSize);
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __ParseLocaleString(const char* lname, char* lang, char* ctry, char* page);
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __GetLCID(const char* lang, const char* ctry, LCID* lcid);
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __GetLCIDFromName(const char* lname, LCID* lcid, char *cp, _Locale_lcid_t *hint);
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic char const* __GetLocaleName(LCID lcid, const char* cp, char* buf);
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic char const* __Extract_locale_name(const char* loc, const char* category, char* buf);
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic char const* __TranslateToSystem(const char* lname, char* buf, _Locale_lcid_t* hint, int *__err_code);
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void __GetLocaleInfoUsingACP(LCID lcid, const char* cp, LCTYPE lctype, char* buf, int buf_size, wchar_t* wbuf, int wbuf_size);
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __intGetACP(LCID lcid);
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __intGetOCP(LCID lcid);
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __GetDefaultCP(LCID lcid);
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic char* __ConvertToCP(int from_cp, int to_cp, const char *from, size_t size, size_t *ret_buf_size);
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void my_ltoa(long __x, char* buf);
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid my_ltoa(long __x, char* buf) {
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char rbuf[64];
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* ptr = rbuf;
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__x == 0)
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *ptr++ = '0';
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (; __x != 0; __x /= 10)
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      *ptr++ = (char)(__x % 10) + '0';
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while(ptr > rbuf) *buf++ = *--ptr;
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* psw */
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  *buf = '\0';
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__cplusplus)
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerextern "C" {
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_ctype_hint(_Locale_ctype_t* ltype)
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (ltype != 0) ? &ltype->lc : 0; }
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_numeric_hint(_Locale_numeric_t* lnumeric)
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (lnumeric != 0) ? &lnumeric->lc : 0; }
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_time_hint(_Locale_time_t* ltime)
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (ltime != 0) ? &ltime->lc : 0; }
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_collate_hint(_Locale_collate_t* lcollate)
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (lcollate != 0) ? &lcollate->lc : 0; }
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_monetary_hint(_Locale_monetary_t* lmonetary)
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (lmonetary != 0) ? &lmonetary->lc : 0; }
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_lcid_t* _Locale_get_messages_hint(struct _Locale_messages* lmessages) {
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lmessages)
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return 0;
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define MAP(x, y) if ((mask & x) != 0) ret |= (y)
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerunsigned short MapCtypeMask(unsigned short mask) {
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned short ret = 0;
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_UPPER, _Locale_UPPER | _Locale_PRINT);
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_LOWER, _Locale_LOWER | _Locale_PRINT);
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_DIGIT, _Locale_DIGIT | _Locale_PRINT);
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_SPACE, _Locale_SPACE | _Locale_PRINT);
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_PUNCT, _Locale_PUNCT | _Locale_PRINT);
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* MAP(C1_BLANK, ?); */
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_XDIGIT, _Locale_XDIGIT | _Locale_PRINT);
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  MAP(C1_ALPHA, _Locale_ALPHA | _Locale_PRINT);
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((mask & C1_CNTRL) != 0) { ret |= _Locale_CNTRL; ret &= ~_Locale_PRINT; }
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ret;
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void MapCtypeMasks(unsigned short *cur, unsigned short *end) {
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (; cur != end; ++cur) {
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *cur = MapCtypeMask(*cur);
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_ctype_t* _Locale_ctype_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp_name[MAX_CP_LEN + 1];
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int NativeCP;
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned char Buffer[256];
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned char *ptr;
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPINFO CPInfo;
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int i;
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t *wbuffer;
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int BufferSize;
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_ctype_t *ltype = (_Locale_ctype_t*)malloc(sizeof(_Locale_ctype_t));
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltype) { *__err_code = _STLP_LOC_NO_MEMORY; return ltype; }
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(ltype, 0, sizeof(_Locale_ctype_t));
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(name, &ltype->lc.id, cp_name, lc_hint) == -1)
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__)
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ( ltype->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { ltype->lc.id = 0x409; }
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltype->cp = atoi(cp_name);
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  NativeCP = __GetDefaultCP(ltype->lc.id);
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* Make table with all characters. */
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (i = 0; i < 256; ++i) Buffer[i] = (unsigned char)i;
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!GetCPInfo(NativeCP, &CPInfo)) { free(ltype); return NULL; }
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (CPInfo.MaxCharSize > 1) {
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (ptr = (unsigned char*)CPInfo.LeadByte; *ptr && *(ptr + 1); ptr+=2)
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      for (i = *ptr; i <= *(ptr + 1); ++i) Buffer[i] = 0;
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((UINT)NativeCP != ltype->cp) {
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    OSVERSIONINFO ver_info;
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ver_info.dwOSVersionInfoSize = sizeof(ver_info);
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetVersionEx(&ver_info);
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (ver_info.dwPlatformId == VER_PLATFORM_WIN32_NT) {
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* Convert character sequence to Unicode. */
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      BufferSize = MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0);
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (!BufferSize) { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      wbuffer = (wchar_t*)malloc(BufferSize * sizeof(wchar_t));
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (!wbuffer) { free(ltype); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize);
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      GetStringTypeW(CT_CTYPE1, wbuffer, 256, ltype->ctable);
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      MapCtypeMasks(ltype->ctable, ltype->ctable + 256);
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      free(wbuffer);
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else {
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      unsigned short ctable[256];
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      unsigned char TargetBuffer[256];
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      GetStringTypeA(ltype->lc.id, CT_CTYPE1, (const char*)Buffer, 256, ctable);
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* Convert character sequence to target code page. */
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      BufferSize = MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0);
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (!BufferSize) { free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      wbuffer = (wchar_t*)malloc(BufferSize * sizeof(wchar_t));
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (!wbuffer) { free(ltype); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize);
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (!WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuffer, BufferSize, (char*)TargetBuffer, 256, NULL, FALSE))
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      { free(wbuffer); free(ltype); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      free(wbuffer);
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* Translate ctype table. */
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      for (i = 0; i < 256; ++i) {
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (!TargetBuffer[i]) continue;
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ltype->ctable[TargetBuffer[i]] = MapCtypeMask(ctable[i]);
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetStringTypeA(ltype->lc.id, CT_CTYPE1, (const char*)Buffer, 256, ltype->ctable);
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MapCtypeMasks(ltype->ctable, ltype->ctable + 256);
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ltype;
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_numeric_t* _Locale_numeric_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t wbuf[4];
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *GroupingBuffer;
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int BufferSize;
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_numeric_t *lnum = (_Locale_numeric_t*)malloc(sizeof(_Locale_numeric_t));
39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lnum) { *__err_code = _STLP_LOC_NO_MEMORY; return lnum; }
39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(lnum, 0, sizeof(_Locale_numeric_t));
39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(name, &lnum->lc.id, lnum->cp, lc_hint) == -1)
39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { free(lnum); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__)
40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lnum->lc.id != INVARIANT_LCID) {
40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_SDECIMAL, lnum->decimal_point, 4, wbuf, 4);
40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_STHOUSAND, lnum->thousands_sep, 4, wbuf, 4);
40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__)
40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lnum->decimal_point[0] = '.';
40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lnum->lc.id != INVARIANT_LCID) {
41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    BufferSize = GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, NULL, 0);
41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GroupingBuffer = (char*)malloc(BufferSize);
41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!GroupingBuffer) { free(lnum); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __FixGrouping(GroupingBuffer);
41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lnum->grouping = GroupingBuffer;
41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lnum->grouping = (char*)malloc(1);
42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!lnum->grouping) { free(lnum); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lnum->grouping[0] = 0;
42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return lnum;
42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __ConvertDate(const char *NTDate, char *buffer, int buf_size) {
42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* This function will return an incomplete buffer if buffer is not long enough */
42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char *cur_char;
43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *cur_output, *end_output;
43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* Correct time format. */
43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  cur_char = NTDate;
43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  cur_output = buffer;
43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  end_output = cur_output + buf_size;
43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buf_size = 0;
43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (*cur_char) {
43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (cur_output && (cur_output == end_output)) break;
43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    switch (*cur_char) {
44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'd':
44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'd') {
44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (*(cur_char + 2) == 'd') {
44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (*(cur_char + 3) == 'd') {
44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'A'; }
45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            buf_size += 2;
45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            cur_char += 3;
45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          }
45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          else {
45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'a'; }
45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            buf_size += 2;
45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            cur_char += 2;
45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          }
45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        else {
46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'd'; }
46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          buf_size += 2;
46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          cur_char++;
46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'd'; }
47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'M':
47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'M') {
47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (*(cur_char + 2) == 'M') {
48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (*(cur_char + 3) == 'M') {
48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'B'; }
48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            buf_size += 2;
48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            cur_char += 3;
48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          }
48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          else {
48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'b'; }
49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            buf_size += 2;
49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            cur_char += 2;
49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          }
49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        else {
49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'm'; }
49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          buf_size += 2;
49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          cur_char++;
49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'm'; }
50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'y':
51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'y') {
51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (*(cur_char + 2) == 'y' && *(cur_char + 3) == 'y') {
51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'Y'; }
51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          buf_size += 2;
52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          cur_char += 3;
52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        else {
52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'y'; }
52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          buf_size += 2;
52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          cur_char++;
52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'y'; }
53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case '%':
53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output && (cur_output + 2 > end_output)) {
54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        *cur_output = 0;
54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        return ++buf_size;
54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '%'; }
54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      buf_size += 2;
54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case '\'':
54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      ++cur_char;
55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      while (*cur_char != '\'' && *cur_char != 0 && (cur_output == NULL || cur_output != end_output)) {
55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *cur_output++ = *cur_char; }
55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 1;
55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default:
55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output) { *(cur_output++) = *cur_char; }
56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      buf_size += 1;
56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (*cur_char == 0) break;
56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++cur_char;
56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!cur_output || cur_output != end_output) {
57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (cur_output) *cur_output = 0;
57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buf_size += 1;
57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* We trunc result */
57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *(--cur_output) = 0;
57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return buf_size;
57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __ConvertTime(const char *NTTime, char *buffer, int buf_size) {
58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char *cur_char;
58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *cur_output, *end_output;
58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  cur_char = NTTime;
58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  cur_output = buffer;
58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  end_output = cur_output + buf_size;
58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buf_size = 0;
58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (*cur_char) {
58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    switch(*cur_char) {
59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'h':
59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'h') {
59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'I'; }
59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 2;
59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'I'; }
60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'H':
61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'H') {
61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'H'; }
61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 2;
61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'H'; }
62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
62777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
62877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 'm':
62977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 'm') {
63077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
63177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
63277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
63377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
63477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'M'; }
63577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 2;
63677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        cur_char++;
63777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
63877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
63977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
64077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
64177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
64277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
64377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'M'; }
64477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
64577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
64677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
64777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 's':
64877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 's') {
64977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 2 > end_output)) {
65077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
65177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
65277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
65377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'S'; }
65477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 2;
65577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
65677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
65777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
65877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output && (cur_output + 3 > end_output)) {
65977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *cur_output = 0;
66077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          return ++buf_size;
66177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
66277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'S'; }
66377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 3;
66477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
66577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
66677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 't':
66777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*(cur_char + 1) == 't')
66877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
66977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output && (cur_output + 2 > end_output)) {
67077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        *cur_output = 0;
67177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        return ++buf_size;
67277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
67377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'p'; }
67477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      buf_size += 2;
67577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
67677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case '%':
67777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output && (cur_output + 2 > end_output)) {
67877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        *cur_output = 0;
67977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        return ++buf_size;
68077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
68177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output) { *(cur_output++)='%'; *(cur_output++)='%'; }
68277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      buf_size += 2;
68377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
68477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case '\'':
68577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      ++cur_char;
68677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      while (*cur_char != '\'' && *cur_char != 0 && (!cur_output || (cur_output != end_output))) {
68777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (cur_output) *cur_output++ = *cur_char;
68877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++cur_char;
68977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        buf_size += 1;
69077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
69177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
69277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default:
69377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (cur_output) { *(cur_output++) = *cur_char; }
69477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      buf_size += 1;
69577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
69677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
69777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (*cur_char == 0) break;
69877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++cur_char;
69977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
70077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
70177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!cur_output || cur_output != end_output) {
70277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (cur_output) *cur_output = 0;
70377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buf_size += 1;
70477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
70577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
70677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* We trunc result */
70777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *(--cur_output) = 0;
70877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
70977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
71077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return buf_size;
71177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
71277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
71377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_time_t* _Locale_time_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
71477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int size, month, dayofweek;
71577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t length;
71677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char fmt80[80];
71777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t wbuf80[80];
71877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
71977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_time_t *ltime = (_Locale_time_t*)malloc(sizeof(_Locale_time_t));
72077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
72177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime) { *__err_code = _STLP_LOC_NO_MEMORY; return ltime; }
72277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(ltime, 0, sizeof(_Locale_time_t));
72377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
72477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(name, &ltime->lc.id, ltime->cp, lc_hint) == -1)
72577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { free(ltime); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
72677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
72777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__)
72877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ( ltime->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
72977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { ltime->lc.id = 0x409; }
73077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
73177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
73277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (month = LOCALE_SMONTHNAME1; month <= LOCALE_SMONTHNAME12; ++month) { /* Small hack :-) */
73377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
73477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ltime->month[month - LOCALE_SMONTHNAME1] = (char*)malloc(size);
73577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!ltime->month[month - LOCALE_SMONTHNAME1])
73677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
73777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->month[month - LOCALE_SMONTHNAME1], size, wbuf80, 80);
73877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
73977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
74077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (month = LOCALE_SABBREVMONTHNAME1; month <= LOCALE_SABBREVMONTHNAME12; ++month) {
74177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
74277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1] = (char*)malloc(size);
74377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1])
74477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
74577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1], size, wbuf80, 80);
74677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
74777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
74877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (dayofweek = LOCALE_SDAYNAME1; dayofweek <= LOCALE_SDAYNAME7; ++dayofweek) {
74977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int dayindex = ( dayofweek != LOCALE_SDAYNAME7 ) ? dayofweek - LOCALE_SDAYNAME1 + 1 : 0;
75077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
75177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ltime->dayofweek[dayindex] = (char*)malloc(size);
75277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!ltime->dayofweek[dayindex])
75377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
75477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->dayofweek[dayindex], size, wbuf80, 80);
75577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
75677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
75777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (dayofweek = LOCALE_SABBREVDAYNAME1; dayofweek <= LOCALE_SABBREVDAYNAME7; ++dayofweek) {
75877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int dayindex = ( dayofweek != LOCALE_SABBREVDAYNAME7 ) ? dayofweek - LOCALE_SABBREVDAYNAME1 + 1 : 0;
75977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
76077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ltime->abbrev_dayofweek[dayindex] = (char*)malloc(size);
76177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!ltime->abbrev_dayofweek[dayindex])
76277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
76377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->abbrev_dayofweek[dayindex], size, wbuf80, 80);
76477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
76577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
76677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SSHORTDATE, fmt80, 80, wbuf80, 80);
76777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = __ConvertDate(fmt80, NULL, 0);
76877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltime->date_format = (char*)malloc(size);
76977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime->date_format)
77077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
77177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __ConvertDate(fmt80, ltime->date_format, size);
77277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
77377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SLONGDATE, fmt80, 80, wbuf80, 80);
77477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = __ConvertDate(fmt80, NULL, 0);
77577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltime->long_date_format = (char*)malloc(size);
77677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime->long_date_format)
77777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { _Locale_time_destroy(ltime);*__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
77877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __ConvertDate(fmt80, ltime->long_date_format, size);
77977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_STIMEFORMAT, fmt80, 80, wbuf80, 80);
78177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = __ConvertTime(fmt80, NULL, 0);
78277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltime->time_format = (char*)malloc(size);
78377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime->time_format)
78477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
78577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __ConvertTime(fmt80, ltime->time_format, size);
78677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* NT doesn't provide this information, we must simulate. */
78877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  length = strlen(ltime->date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
78977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltime->date_time_format = (char*)malloc(length);
79077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime->date_time_format)
79177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
79277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCPY(ltime->date_time_format, length, ltime->date_format);
79377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCAT(ltime->date_time_format, length, " ");
79477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCAT(ltime->date_time_format, length, ltime->time_format);
79577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
79677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* NT doesn't provide this information, we must simulate. */
79777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  length = strlen(ltime->long_date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
79877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ltime->long_date_time_format = (char*)malloc(length);
79977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime->long_date_time_format)
80077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { _Locale_time_destroy(ltime); *__err_code = _STLP_LOC_NO_MEMORY; return NULL; }
80177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCPY(ltime->long_date_time_format, length, ltime->long_date_format);
80277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCAT(ltime->long_date_time_format, length, " ");
80377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STRCAT(ltime->long_date_time_format, length, ltime->time_format);
80477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
80577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S1159, ltime->am, 9, wbuf80, 80);
80677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S2359, ltime->pm, 9, wbuf80, 80);
80777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
80877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ltime;
80977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
81077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_collate_t* _Locale_collate_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
81277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_collate_t *lcol = (_Locale_collate_t*)malloc(sizeof(_Locale_collate_t));
81377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lcol) { *__err_code = _STLP_LOC_NO_MEMORY; return lcol; }
81477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(lcol, 0, sizeof(_Locale_collate_t));
81577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(name, &lcol->lc.id, lcol->cp, lc_hint) == -1)
81777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { free(lcol); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
81877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__)
82077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ( lcol->lc.id == INVARIANT_LCID && name[0] == 'C' && name[1] == 0 )
82177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { lcol->lc.id = 0x409; }
82277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
82377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
82477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return lcol;
82577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
82677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
82777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Locale_monetary_t* _Locale_monetary_create(const char * name, _Locale_lcid_t* lc_hint, int *__err_code) {
82877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *GroupingBuffer;
82977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int BufferSize;
83077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char FracDigits[3];
83177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t wbuf[6];
83277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
83377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_monetary_t *lmon = (_Locale_monetary_t*)malloc(sizeof(_Locale_monetary_t));
83477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lmon) { *__err_code = _STLP_LOC_NO_MEMORY; return lmon; }
83577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(lmon, 0, sizeof(_Locale_monetary_t));
83677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
83777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(name, &lmon->lc.id, lmon->cp, lc_hint) == -1)
83877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { free(lmon); *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
83977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
84077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lmon->lc.id != INVARIANT_LCID) {
84177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* Extract information about monetary system */
84277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SDECIMAL, lmon->decimal_point, 4, wbuf, 6);
84377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_STHOUSAND, lmon->thousands_sep, 4, wbuf, 6);
84477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
84577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    BufferSize = GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, NULL, 0);
84677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GroupingBuffer = (char*)malloc(BufferSize);
84777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!GroupingBuffer)
84877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { lmon->grouping = NULL; *__err_code = _STLP_LOC_NO_MEMORY; return lmon; }
84977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
85077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __FixGrouping(GroupingBuffer);
85177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lmon->grouping = GroupingBuffer;
85277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SCURRENCY, lmon->curr_symbol, 6, wbuf, 6);
85477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SNEGATIVESIGN, lmon->negative_sign, 5, wbuf, 6);
85577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SPOSITIVESIGN, lmon->positive_sign, 5, wbuf, 6);
85677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lmon->lc.id, LOCALE_ICURRDIGITS, FracDigits, 3);
85877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lmon->frac_digits = atoi(FracDigits);
85977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lmon->lc.id, LOCALE_IINTLCURRDIGITS, FracDigits, 3);
86177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lmon->int_frac_digits = atoi(FracDigits);
86277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SINTLSYMBOL, lmon->int_curr_symbol, 5, wbuf, 6);
86477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* Even if Platform SDK documentation says that the returned symbol should
86577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     * be a 3 letters symbol followed by a seperation character, experimentation
86677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     * has shown that no seperation character is ever appended. We are adding it
86777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     * ourself to conform to the POSIX specification.
86877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     */
86977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lmon->int_curr_symbol[3] == 0) {
87077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      lmon->int_curr_symbol[3] = ' ';
87177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      lmon->int_curr_symbol[4] = 0;
87277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
87377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
87477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* else it is already ok */
87577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return lmon;
87777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
87877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Locale_messages* _Locale_messages_create(const char *name, _Locale_lcid_t* lc_hint, int *__err_code) {
88077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* The Win32 API has no support for messages facet */
88177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(name)
88277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lc_hint)
88377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  *__err_code = _STLP_LOC_UNSUPPORTED_FACET_CATEGORY;
88477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return NULL;
88577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
88677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
88777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* _Locale_common_default(char* buf) {
88877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
88977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int CodePage = __GetDefaultCP(LOCALE_USER_DEFAULT);
89077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  my_ltoa(CodePage, cp);
89177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __GetLocaleName(LOCALE_USER_DEFAULT, cp, buf);
89277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
89377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_ctype_default(char* buf)
89577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
89677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_numeric_default(char * buf)
89877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
89977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_time_default(char* buf)
90177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
90277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_collate_default(char* buf)
90477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
90577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_monetary_default(char* buf)
90777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
90877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_messages_default(char* buf)
91077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_common_default(buf); }
91177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
91277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_ctype_name(const _Locale_ctype_t* ltype, char* buf) {
91377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp_buf[MAX_CP_LEN + 1];
91477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  my_ltoa(ltype->cp, cp_buf);
91577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __GetLocaleName(ltype->lc.id, cp_buf, buf);
91677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
91777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
91877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_numeric_name(const _Locale_numeric_t* lnum, char* buf)
91977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __GetLocaleName(lnum->lc.id, lnum->cp, buf); }
92077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_time_name(const _Locale_time_t* ltime, char* buf)
92277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __GetLocaleName(ltime->lc.id, ltime->cp, buf); }
92377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_collate_name(const _Locale_collate_t* lcol, char* buf)
92577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __GetLocaleName(lcol->lc.id, lcol->cp, buf); }
92677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_monetary_name(const _Locale_monetary_t* lmon, char* buf)
92877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __GetLocaleName(lmon->lc.id, lmon->cp, buf); }
92977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_messages_name(const struct _Locale_messages* lmes, char* buf) {
93177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
93277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(buf)
93377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return NULL;
93477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
93577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_ctype_destroy(_Locale_ctype_t* ltype) {
93777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltype) return;
93877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(ltype);
94077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
94177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_numeric_destroy(_Locale_numeric_t* lnum) {
94377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lnum) return;
94477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lnum->grouping) free(lnum->grouping);
94677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(lnum);
94777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
94877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_time_destroy(_Locale_time_t* ltime) {
95077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int i;
95177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!ltime) return;
95277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
95377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (i = 0; i < 12; ++i) {
95477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (ltime->month[i]) free(ltime->month[i]);
95577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (ltime->abbrev_month[i]) free(ltime->abbrev_month[i]);
95677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
95777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
95877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (i = 0; i < 7; ++i) {
95977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (ltime->dayofweek[i]) free(ltime->dayofweek[i]);
96077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (ltime->abbrev_dayofweek[i]) free(ltime->abbrev_dayofweek[i]);
96177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
96277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
96377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (ltime->date_format) free(ltime->date_format);
96477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (ltime->long_date_format) free(ltime->long_date_format);
96577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (ltime->time_format) free(ltime->time_format);
96677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (ltime->date_time_format) free(ltime->date_time_format);
96777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (ltime->long_date_time_format) free(ltime->long_date_time_format);
96877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
96977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(ltime);
97077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
97177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
97277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_collate_destroy(_Locale_collate_t* lcol) {
97377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lcol) return;
97477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
97577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(lcol);
97677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
97777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
97877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_monetary_destroy(_Locale_monetary_t* lmon) {
97977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lmon) return;
98077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lmon->grouping) free(lmon->grouping);
98277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(lmon);
98377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
98477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_messages_destroy(struct _Locale_messages* lmes)
98677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_MARK_PARAMETER_AS_UNUSED(lmes) }
98777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic char const* _Locale_extract_category_name(const char* name, const char* category, char* buf,
98977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 _Locale_lcid_t* hint, int *__err_code) {
99077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char* cname = __Extract_locale_name(name, category, buf);
99177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (cname == 0 || (cname[0] == 'C' && cname[1] == 0)) {
99277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return cname;
99377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
99477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __TranslateToSystem(cname, buf, hint, __err_code);
99577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
99677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
99777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_ctype_name(const char* cname, char* buf,
99877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       _Locale_lcid_t* hint, int *__err_code)
99977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_extract_category_name(cname, "LC_CTYPE", buf, hint, __err_code); }
100077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_numeric_name(const char* cname, char* buf,
100277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                         _Locale_lcid_t* hint, int *__err_code)
100377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_extract_category_name(cname, "LC_NUMERIC", buf, hint, __err_code); }
100477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_time_name(const char* cname, char* buf,
100677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                      _Locale_lcid_t* hint, int *__err_code)
100777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_extract_category_name(cname, "LC_TIME", buf, hint, __err_code); }
100877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_collate_name(const char* cname, char* buf,
101077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                         _Locale_lcid_t* hint, int *__err_code)
101177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_extract_category_name(cname, "LC_COLLATE", buf, hint, __err_code); }
101277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_monetary_name(const char* cname, char* buf,
101477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                          _Locale_lcid_t* hint, int *__err_code)
101577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_extract_category_name(cname, "LC_MONETARY", buf, hint, __err_code); }
101677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* _Locale_extract_messages_name(const char* cname, char* buf,
101877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                          _Locale_lcid_t* hint, int *__err_code) {
101977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (cname[0] == 'L' && cname[1] == 'C' && cname[2] == '_') {
102077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return _C_name;
102177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
102277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (cname[0] == 'C' && cname[1] == 0) {
102377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return _C_name;
102477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
102577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __TranslateToSystem(cname, buf, hint, __err_code);
102677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
102777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
102877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* ctype */
102977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst _Locale_mask_t* _Locale_ctype_table(_Locale_ctype_t* ltype) {
103177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_STATIC_ASSERT(sizeof(_Locale_mask_t) == sizeof(ltype->ctable[0]))
103277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return (const _Locale_mask_t*)ltype->ctable;
103377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
103477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_toupper(_Locale_ctype_t* ltype, int c) {
103677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[2], out_buf[2];
103777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buf[0] = (char)c; buf[1] = 0;
103877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
103977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
104077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return out_buf[0];
104177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
104277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
104377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wchar_t wbuf[2];
104477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
104577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
104677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
104877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
105077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
105177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return out_buf[0];
105277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
105377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
105477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_tolower(_Locale_ctype_t* ltype, int c) {
105677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[2], out_buf[2];
105777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buf[0] = (char)c; buf[1] = 0;
105877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
105977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
106077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return out_buf[0];
106177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
106277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
106377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wchar_t wbuf[2];
106477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
106577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
106677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
106777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
106877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
106977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
107077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
107177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return out_buf[0];
107277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
107377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
107477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
107577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef CSTR_EQUAL /* VC5SP3*/
107677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define CSTR_EQUAL 2
107777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
107877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef CSTR_LESS_THAN /* VC5SP3 */
107977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define CSTR_LESS_THAN 1
108077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
108177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
108277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic DWORD max_DWORD = 0xffffffff;
108377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic DWORD trim_size_t_to_DWORD(size_t n) { return n < (size_t)max_DWORD ? (DWORD)n : max_DWORD; }
108477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
108577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Collate */
108677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* This function takes care of the potential size_t DWORD different size. */
108777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int _Locale_strcmp_auxA(_Locale_collate_t* lcol,
108877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                               const char* s1, size_t n1,
108977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                               const char* s2, size_t n2) {
109077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int result = CSTR_EQUAL;
109177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (n1 > 0 || n2 > 0) {
109277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    DWORD size1 = trim_size_t_to_DWORD(n1);
109377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    DWORD size2 = trim_size_t_to_DWORD(n2);
109477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = CompareStringA(lcol->lc.id, 0, s1, size1, s2, size2);
109577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (result != CSTR_EQUAL)
109677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
109777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    n1 -= size1;
109877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    n2 -= size2;
109977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
110077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return result;
110177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
110277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
110377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_strcmp(_Locale_collate_t* lcol,
110477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   const char* s1, size_t n1,
110577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   const char* s2, size_t n2) {
110677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int result;
110777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetDefaultCP(lcol->lc.id) == atoi(lcol->cp)) {
110877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = _Locale_strcmp_auxA(lcol, s1, n1, s2, n2);
110977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
111077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
111177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    char *buf1, *buf2;
111277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t size1, size2;
111377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buf1 = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), s1, n1, &size1);
111477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buf2 = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), s2, n2, &size2);
111577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
111677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = _Locale_strcmp_auxA(lcol, buf1, size1, buf2, size2);
111777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    free(buf1); free(buf2);
111877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
111977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return (result == CSTR_EQUAL) ? 0 : (result == CSTR_LESS_THAN) ? -1 : 1;
112077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
112177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
112277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnersize_t _Locale_strxfrm(_Locale_collate_t* lcol,
112377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       char* dst, size_t dst_size,
112477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       const char* src, size_t src_size) {
112577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int result;
112677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
112777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* The Windows API do not support transformation of very long strings (src_size > INT_MAX)
112877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * In this case the result will just be the input string:
112977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
113077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (src_size > INT_MAX) {
113177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (dst != 0) {
113277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(dst, dst_size, src, src_size);
113377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
113477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return src_size;
113577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
113677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (dst_size > INT_MAX) {
113777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* now that we know that src_size <= INT_MAX we can safely decrease dst_size to INT_MAX. */
113877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    dst_size = INT_MAX;
113977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
114077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
114177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetDefaultCP(lcol->lc.id) == atoi(lcol->cp))
114277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = LCMapStringA(lcol->lc.id, LCMAP_SORTKEY, src, (int)src_size, dst, (int)dst_size);
114377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
114477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    char *buf;
114577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t size;
114677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buf = __ConvertToCP(atoi(lcol->cp), __GetDefaultCP(lcol->lc.id), src, src_size, &size);
114777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
114877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = LCMapStringA(lcol->lc.id, LCMAP_SORTKEY, buf, (int)size, dst, (int)dst_size);
114977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    free(buf);
115077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
115177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return result != 0 ? result - 1 : 0;
115277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
115377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
115477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Numeric */
115577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* __true_name = "true";
115677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* __false_name = "false";
115777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
115877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_decimal_point(_Locale_numeric_t* lnum)
115977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lnum->decimal_point[0]; }
116077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
116177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_thousands_sep(_Locale_numeric_t* lnum)
116277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lnum->thousands_sep[0]; }
116377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
116477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_grouping(_Locale_numeric_t * lnum) {
116577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lnum->grouping) return "";
116677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return lnum->grouping;
116777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
116877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
116977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_true(_Locale_numeric_t * lnum) {
117077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lnum)
117177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __true_name; /* NT does't provide information about this */
117277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
117377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
117477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_false(_Locale_numeric_t * lnum) {
117577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lnum)
117677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __false_name; /* NT does't provide information about this */
117777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
117877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
117977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Monetary */
118077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_int_curr_symbol(_Locale_monetary_t * lmon)
118177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->int_curr_symbol; }
118277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
118377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_currency_symbol(_Locale_monetary_t * lmon)
118477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->curr_symbol; }
118577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
118677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_mon_decimal_point(_Locale_monetary_t * lmon)
118777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->decimal_point[0]; }
118877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
118977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_mon_thousands_sep(_Locale_monetary_t * lmon)
119077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->thousands_sep[0]; }
119177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
119277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_mon_grouping(_Locale_monetary_t * lmon) {
119377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!lmon->grouping) return "";
119477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return lmon->grouping;
119577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
119677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
119777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_positive_sign(_Locale_monetary_t * lmon)
119877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->positive_sign; }
119977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_negative_sign(_Locale_monetary_t * lmon)
120177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return lmon->negative_sign; }
120277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_int_frac_digits(_Locale_monetary_t * lmon)
120477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (char)lmon->int_frac_digits; }
120577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _Locale_frac_digits(_Locale_monetary_t * lmon)
120777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (char)lmon->frac_digits; }
120877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_p_cs_precedes(_Locale_monetary_t * lmon) {
121077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
121177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSYMPRECEDES, loc_data, 2);
121277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (loc_data[0] == '0') return 0;
121377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (loc_data[0] == '1') return 1;
121477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return -1;
121577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
121677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
121777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_p_sep_by_space(_Locale_monetary_t * lmon) {
121877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
121977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSEPBYSPACE, loc_data, 2);
122077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (loc_data[0] == '0') return 0;
122177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (loc_data[0] == '1') return 1;
122277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return -1;
122377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
122477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
122577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_p_sign_posn(_Locale_monetary_t * lmon) {
122677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
122777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lmon->lc.id != INVARIANT_LCID) {
122877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lmon->lc.id, LOCALE_IPOSSIGNPOSN, loc_data, 2);
122977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return atoi(loc_data);
123077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
123177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
123277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return CHAR_MAX;
123377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
123477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
123577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
123677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_n_cs_precedes(_Locale_monetary_t * lmon) {
123777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
123877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSYMPRECEDES, loc_data, 2);
123977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (loc_data[0] == '0') return 0;
124077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (loc_data[0] == '1') return 1;
124177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return -1;
124277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
124377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
124477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_n_sep_by_space(_Locale_monetary_t * lmon) {
124577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
124677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSEPBYSPACE, loc_data, 2);
124777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (loc_data[0] == '0') return 0;
124877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (loc_data[0] == '1') return 1;
124977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return -1;
125077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
125177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
125277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint _Locale_n_sign_posn(_Locale_monetary_t * lmon) {
125377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char loc_data[2];
125477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lmon->lc.id != INVARIANT_LCID) {
125577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lmon->lc.id, LOCALE_INEGSIGNPOSN, loc_data, 2);
125677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return atoi(loc_data);
125777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
125877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
125977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return CHAR_MAX;
126077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
126177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
126277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
126377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Time */
126477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_full_monthname(_Locale_time_t * ltime, int month) {
126577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char **names = (const char**)ltime->month;
126677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return names[month];
126777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
126877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
126977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_abbrev_monthname(_Locale_time_t * ltime, int month) {
127077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char **names = (const char**)ltime->abbrev_month;
127177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return names[month];
127277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
127377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
127477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_full_dayofweek(_Locale_time_t * ltime, int day) {
127577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char **names = (const char**)ltime->dayofweek;
127677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return names[day];
127777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
127877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
127977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char * _Locale_abbrev_dayofweek(_Locale_time_t * ltime, int day) {
128077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char **names = (const char**)ltime->abbrev_dayofweek;
128177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return names[day];
128277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
128377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
128477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_d_t_fmt(_Locale_time_t* ltime)
128577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->date_time_format; }
128677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
128777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_long_d_t_fmt(_Locale_time_t* ltime)
128877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->long_date_time_format; }
128977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
129077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_d_fmt(_Locale_time_t* ltime)
129177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->date_format; }
129277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
129377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_long_d_fmt(_Locale_time_t* ltime)
129477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->long_date_format; }
129577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
129677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_t_fmt(_Locale_time_t* ltime)
129777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->time_format; }
129877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
129977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_am_str(_Locale_time_t* ltime)
130077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->am; }
130177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
130277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_pm_str(_Locale_time_t* ltime)
130377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return ltime->pm; }
130477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
130577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Messages */
130677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernl_catd_type _Locale_catopen(struct _Locale_messages* lmes, const char* cat_name) {
130777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
130877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(cat_name)
130977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return -1;
131077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
131177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_catclose(struct _Locale_messages* lmes, nl_catd_type cat) {
131277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
131377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(&cat)
131477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
131577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* _Locale_catgets(struct _Locale_messages* lmes, nl_catd_type cat,
131677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                            int setid, int msgid, const char *dfault) {
131777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(lmes)
131877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(&cat)
131977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(&setid)
132077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_MARK_PARAMETER_AS_UNUSED(&msgid)
132177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return dfault;
132277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
132377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
132477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef __cplusplus
132577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} /* extern C */
132677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
132777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
132877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
132977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid __FixGrouping(char *grouping) {
133077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* This converts NT version which uses '0' instead of 0, etc ; to ANSI */
133177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *g = grouping;
133277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char building_group = 0;
133377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char repeat_last = 0;
133477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* Check there is a grouping info otherwise we would add a useless CHAR_MAX */
133577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (*g) {
133677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (; *g; ++g) {
133777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (*g > '0' && *g <= '9') {
133877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (!building_group) {
133977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *grouping = *g - '0';
134077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          building_group = 1;
134177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
134277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        else {
134377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          /* Known issue: grouping might roll. */
134477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *grouping = *grouping * 10 + *g - '0';
134577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
134677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
134777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else if (*g == '0') {
134877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (!building_group) {
134977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          repeat_last = 1;
135077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
135177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        else
135277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          /* Known issue: grouping might roll. */
135377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          *grouping *= 10;
135477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
135577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else if (*g == ';') {
135677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        /* Stop adding to the current group */
135777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        building_group = 0;
135877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++grouping;
135977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
136077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* else we ignore the character */
136177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
136277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
136377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (!repeat_last)
136477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      *grouping++ = CHAR_MAX;
136577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *grouping = 0;
136677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
136777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
136877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
136977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char* __ConvertName(const char* lname, LOCALECONV* ConvTable, int TableSize) {
137077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int i;
137177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int cmp;
137277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int low = 0;
137377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int high = TableSize - 1;
137477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
137577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*  typical binary search - do until no more to search or match */
137677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (low <= high) {
137777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    i = (low + high) / 2;
137877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
137977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if ((cmp = lstrcmpiA(lname, (*(ConvTable + i)).name)) == 0)
138077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return (*(ConvTable + i)).abbrev;
138177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (cmp < 0)
138277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      high = i - 1;
138377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
138477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      low = i + 1;
138577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
138677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return lname;
138777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
138877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
138977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __ParseLocaleString(const char* lname,
139077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                        char* lang, char* ctry, char* page) {
139177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int param = 0;
139277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t len;
139377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t tmpLen;
139477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
139577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lname[0] == 0)
139677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
139777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
139877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* We look for the first country separator '_' */
139977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  len = strcspn(lname, "_");
140077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lname[len] == '_') {
140177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (len == 0 || len > MAX_LANG_LEN) return -1; /* empty lang is invalid*/
140277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len);
140377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lname += len + 1;
140477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++param;
140577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
140677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
140777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* We look for the last code page separator '.' */
140877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  len = -1;
140977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  tmpLen = strcspn(lname, ".");
141077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (lname[tmpLen] == '.') {
141177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    len = tmpLen; ++tmpLen;
141277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    tmpLen += strcspn(lname + tmpLen, ".");
141377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
141477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (len != -1) { /* Means that we found a '.' */
141577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (param == 0) {
141677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* We have no lang yet so we have to fill it first, no country */
141777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len > MAX_LANG_LEN) return -1;
141877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len == 0) {
141977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        /* No language nor country, only code page */
142077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        ++param;
142177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
142277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else
142377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      { _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len); }
142477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      ++param;
142577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
142677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else {
142777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* We already have a lang so we are now looking for the country: */
142877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len == 0) return -1; /* We forbid locale name with the "_." motif in it */
142977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len > MAX_CTRY_LEN) return -1;
143077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(ctry, MAX_CTRY_LEN + 1, lname, len);
143177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
143277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++param;
143377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    lname += len + 1;
143477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
143577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
143677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* We look for ',' for compatibility with POSIX */
143777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  len = strcspn(lname, ",");
143877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (param) {
143977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 0:
144077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len > MAX_LANG_LEN) return -1;
144177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(lang, MAX_LANG_LEN + 1, lname, len);
144277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
144377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 1:
144477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len > MAX_CTRY_LEN) return -1;
144577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(ctry, MAX_CTRY_LEN + 1, lname, len);
144677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
144777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default:
144877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (len > MAX_CP_LEN) return -1;
144977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(page, MAX_CP_LEN + 1, lname, len);
145077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
145177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
145277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
145377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* ',' POSIX modifier is not used in NT */
145477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return 0;
145577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
145677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
145777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Data necessary for find LCID*/
145877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic CRITICAL_SECTION __criticalSection;
145977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int __FindFlag;
146077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic LCID __FndLCID;
146177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* __FndLang;
146277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic const char* __FndCtry;
146377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
146477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_init()
146577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ InitializeCriticalSection(&__criticalSection); }
146677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
146777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Locale_final()
146877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ DeleteCriticalSection(&__criticalSection); }
146977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
147077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic LCID LocaleFromHex(const char* locale) {
147177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned long result = 0;
147277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int digit;
147377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (*locale) {
147477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result <<= 4;
147577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    digit = (*locale >= '0' && *locale <= '9') ? *locale - '0':
147677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            (*locale >= 'A' && *locale <= 'F') ? (*locale - 'A') + 10
147777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                               : (*locale - 'a') + 10;
147877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result += digit;
147977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++locale;
148077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
148177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return (LCID)result;
148277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
148377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
148477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic BOOL CALLBACK EnumLocalesProcA(LPSTR locale) {
148577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  LCID lcid = LocaleFromHex(locale);
148677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int LangFlag = 0, CtryFlag = !__FndCtry;
148777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static char Lang[MAX_LANG_LEN], Ctry[MAX_CTRY_LEN];
148877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
148977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, Lang, MAX_LANG_LEN);
149077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lstrcmpiA(Lang, __FndLang) != 0) {
149177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lcid, LOCALE_SABBREVLANGNAME, Lang, MAX_LANG_LEN);
149277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lstrcmpiA(Lang, __FndLang) != 0) {
149377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, Lang, MAX_LANG_LEN);
149477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (lstrcmpiA(Lang, __FndLang) == 0) LangFlag = 1;
149577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
149677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else LangFlag = 1;
149777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
149877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else LangFlag = 1;
149977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
150077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__FndCtry) {
150177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY, Ctry, MAX_CTRY_LEN);
150277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lstrcmpiA(Ctry, __FndCtry) != 0) {
150377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      GetLocaleInfoA(lcid, LOCALE_SABBREVCTRYNAME, Ctry, MAX_CTRY_LEN);
150477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (lstrcmpiA(Ctry, __FndCtry) != 0) {
150577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, Ctry, MAX_CTRY_LEN);
150677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (lstrcmpiA(Ctry, __FndCtry) == 0) CtryFlag = 1;
150777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
150877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else CtryFlag = 1;
150977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
151077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
151177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CtryFlag = 1;
151277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
151377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
151477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (LangFlag && CtryFlag) {
151577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __FindFlag = 1;
151677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __FndLCID = lcid;
151777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return FALSE;
151877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
151977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
152077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return TRUE;
152177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
152277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
152377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __GetLCID(const char* lang, const char* ctry, LCID* lcid) {
152477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int ret;
152577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  EnterCriticalSection(&__criticalSection);
152677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
152777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __FindFlag = 0;
152877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __FndLang = lang;
152977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __FndCtry = ctry;
153077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  EnumSystemLocalesA(EnumLocalesProcA, LCID_INSTALLED);
153177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
153277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__FindFlag != 0) *lcid = __FndLCID;
153377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ret = __FindFlag != 0 ? 0 : -1;
153477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
153577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  LeaveCriticalSection(&__criticalSection);
153677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ret;
153777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
153877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
153977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __GetLCIDFromName(const char* lname, LCID* lcid, char* cp, _Locale_lcid_t *hint) {
154077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char lang[MAX_LANG_LEN + 1], ctry[MAX_CTRY_LEN + 1], page[MAX_CP_LEN + 1];
154177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int result = 0;
154277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lname == NULL || lname[0] == 0) {
154377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *lcid = LOCALE_USER_DEFAULT;
154477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
154577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
154677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
154777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(lang, 0, MAX_LANG_LEN + 1);
154877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(ctry, 0, MAX_CTRY_LEN + 1);
154977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset(page, 0, MAX_CP_LEN + 1);
155077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__ParseLocaleString(lname, lang, ctry, page) == -1) return -1;
155177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
155277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (hint != 0) {
155377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *lcid = hint->id;
155477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
155577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
155677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lang[0] == 0 && ctry[0] == 0)
155777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      *lcid = LOCALE_USER_DEFAULT; /* Only code page given. */
155877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else {
155977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (ctry[0] == 0) {
156077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        result = __GetLCID(__ConvertName(lang, __rg_language, sizeof(__rg_language) / sizeof(LOCALECONV)), NULL, lcid);
156177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (result != 0) {
156277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          /* Check 'C' special case. Check is done after call to __GetLCID because normal programs do not
156377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner           * generate facet from 'C' name, they use the locale::classic() facets. */
156477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          if (lang[0] == 'C' && lang[1] == 0) {
156577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            *lcid = INVARIANT_LCID;
156677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner            result = 0;
156777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          }
156877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
156977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
157077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else {
157177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        result = __GetLCID(__ConvertName(lang, __rg_language, sizeof(__rg_language) / sizeof(LOCALECONV)),
157277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                           __ConvertName(ctry, __rg_country, sizeof(__rg_country) / sizeof(LOCALECONV)),
157377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                           lcid);
157477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (result != 0) {
157577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          /* Non NLS mapping might introduce problem with some locales when only one entry is mapped,
157677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner           * the lang or the country (example: chinese locales like 'chinese_taiwan' gives 'CHS_taiwan'
157777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner           * that do not exists in system). This is why we are giving this locale an other chance by
157877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner           * calling __GetLCID without the mapping. */
157977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          result = __GetLCID(lang, ctry, lcid);
158077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
158177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
158277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
158377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
158477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
158577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (result == 0) {
158677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* Handling code page */
158777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lstrcmpiA(page, "ACP") == 0 || page[0] == 0)
158877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      my_ltoa(__intGetACP(*lcid), cp);
158977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (lstrcmpiA(page, "OCP") == 0)
159077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      my_ltoa(__intGetOCP(*lcid), cp);
159177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (lstrcmpiA(page, "UTF7") == 0)
159277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      my_ltoa(CP_UTF7, cp);
159377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (lstrcmpiA(page, "UTF8") == 0)
159477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      my_ltoa(CP_UTF8, cp);
159577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
159677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_STRNCPY(cp, MAX_CP_LEN + 1, page, 5);
159777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
159877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* Code page must be an integer value,
159977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     * 0 returned by __intGetACP and 1 returned by __intGetOCP are invalid
160077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     * values.
160177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     */
160277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (cp[1] == 0 && (cp[0] == '0' || cp[1] == '1'))
160377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return -1;
160477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (atoi(cp) == 0)
160577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return -1;
160677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
160777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
160877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return result;
160977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
161077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
161177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* __GetLocaleName(LCID lcid, const char* cp, char* buf) {
161277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (lcid == INVARIANT_LCID) {
161377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return _C_name;
161477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
161577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
161677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    char lang[MAX_LANG_LEN + 1], ctry[MAX_CTRY_LEN + 1];
161777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, lang, MAX_LANG_LEN);
161877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY, ctry, MAX_CTRY_LEN);
161977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRCPY(buf, _Locale_MAX_SIMPLE_NAME, lang);
162077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, "_");
162177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, ctry);
162277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, ".");
162377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRCAT(buf, _Locale_MAX_SIMPLE_NAME, cp);
162477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return buf;
162577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
162677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
162777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
162877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* __Extract_locale_name(const char* loc, const char* category, char* buf) {
162977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *expr;
163077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t len_name;
163177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
163277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (loc[0] == 'L' && loc[1] == 'C' && loc[2] == '_') {
163377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    expr = strstr((char*)loc, category);
163477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (expr == NULL) return NULL; /* Category not found. */
163577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    expr = strchr(expr, '=');
163677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (expr == NULL) return NULL;
163777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++expr;
163877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    len_name = strcspn(expr, ";");
163977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    len_name = len_name >= _Locale_MAX_SIMPLE_NAME ? _Locale_MAX_SIMPLE_NAME - 1
164077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                   : len_name;
164177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STRNCPY(buf, _Locale_MAX_SIMPLE_NAME, expr, len_name); buf[len_name] = 0;
164277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return buf;
164377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
164477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
164577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return loc;
164677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
164777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
164877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
164977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar const* __TranslateToSystem(const char* lname, char* buf, _Locale_lcid_t* hint,
165077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                int *__err_code) {
165177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  LCID lcid;
165277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[MAX_CP_LEN + 1];
165377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__GetLCIDFromName(lname, &lcid, cp, hint) != 0)
165477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { *__err_code = _STLP_LOC_UNKNOWN_NAME; return NULL; }
165577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
165677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __GetLocaleName(lcid, cp, buf);
165777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
165877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
165977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid __GetLocaleInfoUsingACP(LCID lcid, const char* cp, LCTYPE lctype, char* buf, int buf_size, wchar_t* wbuf, int wbuf_size) {
166077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t *Buffer;
166177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int BufferSize;
166277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int icp;
166377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
166477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  GetLocaleInfoA(lcid, lctype, buf, buf_size);
166577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
166677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  icp = atoi(cp);
166777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (icp != CP_ACP && buf[0] != 0) {
166877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    BufferSize = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
166977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (BufferSize > wbuf_size)
167077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
167177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      Buffer = (wchar_t*)malloc(sizeof(wchar_t) * BufferSize);
167277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
167377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
167477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
167577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      Buffer = wbuf;
167677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
167777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    MultiByteToWideChar(CP_ACP, 0, buf, -1, Buffer, BufferSize);
167877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    WideCharToMultiByte(icp, 0, Buffer, -1, buf, buf_size, NULL, NULL);
167977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (Buffer != wbuf)
168077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {
168177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      free(Buffer);
168277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
168377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
168477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
168577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
168677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Return 0 if ANSI code page not used */
168777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __intGetACP(LCID lcid) {
168877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[6];
168977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!GetLocaleInfoA(lcid, LOCALE_IDEFAULTANSICODEPAGE, cp, 6)) {
169077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_LANG_INVARIANT_DEFINED)
169177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (lcid == INVARIANT_LCID) {
169277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      /* We are using a limited PSDK, we rely on the most common code page */
169377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return 1252;
169477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
169577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
169677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
169777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
169877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return atoi(cp);
169977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
170077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
170177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* Return 1 if OEM code page not used */
170277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __intGetOCP(LCID lcid) {
170377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char cp[6];
170477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, cp, 6))
170577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
170677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return atoi(cp);
170777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
170877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
170977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint __GetDefaultCP(LCID lcid) {
171077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int cp = __intGetACP(lcid);
171177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (cp == 0) return __intGetOCP(lcid);
171277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else return cp;
171377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
171477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
171577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic int trim_size_t_to_int(size_t n) { return n < (size_t)INT_MAX ? (int)n : INT_MAX; }
171677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
171777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* __ConvertToCP(int from_cp, int to_cp, const char *from, size_t size, size_t *ret_buf_size) {
171877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t wbuffer_size, buffer_size, from_offset, wbuf_offset;
171977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int from_size, to_size, wbuf_size;
172077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t *wbuffer;
172177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* buffer;
172277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
172377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t orig_size = size;
172477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
172577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wbuffer_size = 0;
172677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  from_offset = 0;
172777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (size > 0) {
172877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from_size = trim_size_t_to_int(size);
172977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuffer_size += MultiByteToWideChar(from_cp, MB_PRECOMPOSED,
173077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        from + from_offset, from_size, NULL, 0);
173177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from_offset += from_size;
173277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size -= from_size;
173377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
173477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
173577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wbuffer = (wchar_t*)malloc(sizeof(wchar_t)*wbuffer_size);
173677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
173777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = orig_size;
173877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wbuf_offset = 0;
173977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  from_offset = 0;
174077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (size > 0) {
174177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from_size = trim_size_t_to_int(size);
174277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_size = trim_size_t_to_int(wbuffer_size - wbuf_offset);
174377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_offset += MultiByteToWideChar(from_cp, MB_PRECOMPOSED,
174477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       from + from_offset, from_size, wbuffer + wbuf_offset, wbuf_size);
174577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from_offset += from_size;
174677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size -= from_size;
174777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
174877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
174977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buffer_size = 0;
175077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wbuf_offset = 0;
175177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = wbuffer_size;
175277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (size > 0) {
175377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_size = trim_size_t_to_int(size);
175477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buffer_size += WideCharToMultiByte(to_cp, WC_COMPOSITECHECK | WC_SEPCHARS,
175577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       wbuffer + wbuf_offset, wbuf_size,
175677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       NULL, 0, NULL, FALSE);
175777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_offset += wbuf_size;
175877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size -= wbuf_size;
175977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
176077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
176177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  buffer = (char*)malloc(buffer_size);
176277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  *ret_buf_size = buffer_size;
176377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
176477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size = wbuffer_size;
176577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wbuf_offset = 0;
176677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (size > 0) {
176777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_size = trim_size_t_to_int(size);
176877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    to_size = trim_size_t_to_int(buffer_size);
176977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    buffer_size -= WideCharToMultiByte(to_cp, WC_COMPOSITECHECK | WC_SEPCHARS,
177077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       wbuffer + wbuf_offset, wbuf_size,
177177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       buffer, to_size, NULL, FALSE);
177277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wbuf_offset += wbuf_size;
177377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size -= wbuf_size;
177477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
177577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
177677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free(wbuffer);
177777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return buffer;
177877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
177977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
178077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef __cplusplus
178177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
178277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
178377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
178477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_NO_WCHAR_T
178577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include "c_wlocale_win32.c"
178677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
1787