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