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