📄 c_locale_win32.c
字号:
_STLP_STRCAT2(ltime->date_time_format, length, ltime->time_format);
/* NT doesn't provide this information, we must simulate. */
length = strlen(ltime->long_date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
ltime->long_date_time_format = (char*)malloc(length);
if (!ltime->long_date_time_format) { _Locale_time_destroy(ltime); return NULL; }
_STLP_STRCPY2(ltime->long_date_time_format, length, ltime->long_date_format);
_STLP_STRCAT2(ltime->long_date_time_format, length, " ");
_STLP_STRCAT2(ltime->long_date_time_format, length, ltime->time_format);
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S1159, ltime->am, 9);
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_S2359, ltime->pm, 9);
return ltime;
}
void* _Locale_collate_create(const char * name, _Locale_lcid_t* lc_hint) {
char cname[_Locale_MAX_SIMPLE_NAME];
_Locale_collate_t *lcol=(_Locale_collate_t*)malloc(sizeof(_Locale_collate_t));
if (!lcol) return lcol;
memset(lcol, 0, sizeof(_Locale_collate_t));
__Extract_locale_name(name, LC_COLLATE, cname);
if (__GetLCIDFromName(cname, &lcol->lc.id, lcol->cp, lc_hint) == -1)
{ free(lcol); return NULL; }
return lcol;
}
void* _Locale_monetary_create(const char * name, _Locale_lcid_t* lc_hint) {
char cname[_Locale_MAX_SIMPLE_NAME];
char *GroupingBuffer;
int BufferSize;
char FracDigits[3];
_Locale_monetary_t *lmon = (_Locale_monetary_t*)malloc(sizeof(_Locale_monetary_t));
if (!lmon) return lmon;
memset(lmon, 0, sizeof(_Locale_monetary_t));
__Extract_locale_name(name, LC_MONETARY, cname);
if (__GetLCIDFromName(cname, &lmon->lc.id, lmon->cp, lc_hint) == -1)
{ free(lmon); return NULL; }
/* Extract information about monetary system */
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SDECIMAL, lmon->decimal_point, 4);
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_STHOUSAND, lmon->thousands_sep, 4);
BufferSize = GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, NULL, 0);
GroupingBuffer = (char*)malloc(BufferSize);
if (!GroupingBuffer) { lmon->grouping = NULL; return lmon; }
GetLocaleInfoA(lmon->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
__FixGrouping(GroupingBuffer);
lmon->grouping=GroupingBuffer;
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SCURRENCY, lmon->curr_symbol, 6);
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SNEGATIVESIGN, lmon->negative_sign, 5);
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SPOSITIVESIGN, lmon->positive_sign, 5);
GetLocaleInfoA(lmon->lc.id, LOCALE_ICURRDIGITS, FracDigits, 3);
lmon->frac_digits = atoi(FracDigits);
GetLocaleInfoA(lmon->lc.id, LOCALE_IINTLCURRDIGITS, FracDigits, 3);
lmon->int_frac_digits = atoi(FracDigits);
__GetLocaleInfoUsingACP(lmon->lc.id, lmon->cp, LOCALE_SINTLSYMBOL, lmon->int_curr_symbol, 5);
/* Even if Platform SDK documentation says that the returned symbol should
* be a 3 letters symbol followed by a seperation character, experimentation
* has shown that no seperation character is ever appended. We are adding it
* ourself to conform to the POSIX specification.
*/
if (lmon->int_curr_symbol[3] == 0) {
lmon->int_curr_symbol[3] = ' ';
lmon->int_curr_symbol[4] = 0;
}
return lmon;
}
void* _Locale_messages_create(const char *name, _Locale_lcid_t* lc_hint) {
char cname[_Locale_MAX_SIMPLE_NAME];
_Locale_messages_t *lmes=(_Locale_messages_t*)malloc(sizeof(_Locale_messages_t));
if (!lmes) return lmes;
memset(lmes, 0, sizeof(_Locale_messages_t));
_Locale_extract_messages_name(name, cname, lc_hint);
if (__GetLCIDFromName(cname, &lmes->lc.id, lmes->cp, lc_hint) == -1)
{ free(lmes); return NULL; }
return lmes;
}
static const char* _Locale_common_default(char* buf) {
char cp[MAX_CP_LEN + 1];
int CodePage = __GetDefaultCP(LOCALE_USER_DEFAULT);
my_ltoa(CodePage, cp);
return __GetLocaleName(LOCALE_USER_DEFAULT, cp, buf);
}
const char* _Locale_ctype_default(char* buf)
{ return _Locale_common_default(buf); }
const char* _Locale_numeric_default(char * buf)
{ return _Locale_common_default(buf); }
const char* _Locale_time_default(char* buf)
{ return _Locale_common_default(buf); }
const char* _Locale_collate_default(char* buf)
{ return _Locale_common_default(buf); }
const char* _Locale_monetary_default(char* buf)
{ return _Locale_common_default(buf); }
const char* _Locale_messages_default(char* buf)
{ return _Locale_common_default(buf); }
char const* _Locale_ctype_name(const void* loc, char* buf) {
char cp_buf[MAX_CP_LEN + 1];
_Locale_ctype_t* ltype = (_Locale_ctype_t*)loc;
my_ltoa(ltype->cp, cp_buf);
return __GetLocaleName(ltype->lc.id, cp_buf, buf);
}
char const* _Locale_numeric_name(const void* loc, char* buf) {
_Locale_numeric_t* lnum = (_Locale_numeric_t*)loc;
return __GetLocaleName(lnum->lc.id, lnum->cp, buf);
}
char const* _Locale_time_name(const void* loc, char* buf) {
_Locale_time_t* ltime = (_Locale_time_t*)loc;
return __GetLocaleName(ltime->lc.id, ltime->cp, buf);
}
char const* _Locale_collate_name(const void* loc, char* buf) {
_Locale_collate_t* lcol = (_Locale_collate_t*)loc;
return __GetLocaleName(lcol->lc.id, lcol->cp, buf);
}
char const* _Locale_monetary_name(const void* loc, char* buf) {
_Locale_monetary_t* lmon = (_Locale_monetary_t*)loc;
return __GetLocaleName(lmon->lc.id, lmon->cp, buf);
}
char const* _Locale_messages_name(const void* loc, char* buf) {
_Locale_messages_t* lmes = (_Locale_messages_t*)loc;
return __GetLocaleName(lmes->lc.id, lmes->cp, buf);
}
void _Locale_ctype_destroy(void* loc) {
_Locale_ctype_t *ltype = (_Locale_ctype_t*)loc;
if (!ltype) return;
free(ltype);
}
void _Locale_numeric_destroy(void* loc) {
_Locale_numeric_t *lnum = (_Locale_numeric_t *)loc;
if (!lnum) return;
if (lnum->grouping) free(lnum->grouping);
free(lnum);
}
void _Locale_time_destroy(void* loc) {
int i;
_Locale_time_t* ltime = (_Locale_time_t*)loc;
if (!ltime) return;
for (i = 0; i < 12; ++i) {
if (ltime->month[i]) free(ltime->month[i]);
if (ltime->abbrev_month[i]) free(ltime->abbrev_month[i]);
}
for (i = 0; i < 7; ++i) {
if (ltime->dayofweek[i]) free(ltime->dayofweek[i]);
if (ltime->abbrev_dayofweek[i]) free(ltime->abbrev_dayofweek[i]);
}
if (ltime->date_format) free(ltime->date_format);
if (ltime->long_date_format) free(ltime->long_date_format);
if (ltime->time_format) free(ltime->time_format);
if (ltime->date_time_format) free(ltime->date_time_format);
if (ltime->long_date_time_format) free(ltime->long_date_time_format);
free(ltime);
}
void _Locale_collate_destroy(void* loc) {
_Locale_collate_t* lcol=(_Locale_collate_t*)loc;
if (!lcol) return;
free(lcol);
}
void _Locale_monetary_destroy(void* loc) {
_Locale_monetary_t *lmon = (_Locale_monetary_t*)loc;
if (!lmon) return;
if (lmon->grouping) free(lmon->grouping);
free(lmon);
}
void _Locale_messages_destroy(void* loc) {
_Locale_messages_t* lmes = (_Locale_messages_t*)loc;
if (!lmes) return;
free(lmes);
}
static char const* _Locale_extract_category_name(const char* cname, int category, char* buf, _Locale_lcid_t* hint) {
char lname[_Locale_MAX_SIMPLE_NAME];
__Extract_locale_name(cname, category, lname);
if (lname[0] == 'C' && lname[1] == 0) {
_STLP_RETURN_STRCPY2(buf, _Locale_MAX_SIMPLE_NAME, lname);
}
return __TranslateToSystem(lname, buf, hint);
}
char const* _Locale_extract_ctype_name(const char* cname, char* buf, _Locale_lcid_t* hint)
{ return _Locale_extract_category_name(cname, LC_CTYPE, buf, hint); }
char const* _Locale_extract_numeric_name(const char* cname, char* buf, _Locale_lcid_t* hint)
{ return _Locale_extract_category_name(cname, LC_NUMERIC, buf, hint); }
char const* _Locale_extract_time_name(const char* cname, char* buf, _Locale_lcid_t* hint)
{ return _Locale_extract_category_name(cname, LC_TIME, buf, hint); }
char const* _Locale_extract_collate_name(const char* cname, char* buf, _Locale_lcid_t* hint)
{ return _Locale_extract_category_name(cname, LC_COLLATE, buf, hint); }
char const* _Locale_extract_monetary_name(const char* cname, char* buf, _Locale_lcid_t* hint)
{ return _Locale_extract_category_name(cname, LC_MONETARY, buf, hint); }
char const* _Locale_extract_messages_name(const char* cname, char* buf, _Locale_lcid_t* hint) {
if (cname[0] == 'L' && cname[1] == 'C' && cname[2] == '_') {
_STLP_RETURN_STRCPY2(buf, _Locale_MAX_SIMPLE_NAME, "C");
}
if (cname[0] == 'C' && cname[1] == 0) {
_STLP_RETURN_STRCPY2(buf, _Locale_MAX_SIMPLE_NAME, cname);
}
return __TranslateToSystem(cname, buf, hint);
}
char const* _Locale_compose_name(char* buf,
const char* _ctype, const char* numeric,
const char* time, const char* _collate,
const char* monetary, const char* messages,
const char* default_name) {
(void) default_name;
if (!strcmp(_ctype, numeric) &&
!strcmp(_ctype, time) &&
!strcmp(_ctype, _collate) &&
!strcmp(_ctype, monetary) &&
!strcmp(_ctype, messages)) {
_STLP_RETURN_STRCPY2(buf, _Locale_MAX_COMPOSITE_NAME, _ctype);
}
_STLP_STRCPY2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_CTYPE=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, _ctype);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_TIME=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, time);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_NUMERIC=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, numeric);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_COLLATE=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, _collate);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_MONETARY=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, monetary);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, "LC_MESSAGES=");
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, messages);
_STLP_STRCAT2(buf, _Locale_MAX_COMPOSITE_NAME, ";");
return buf;
}
/* ctype */
const _Locale_mask_t* _Locale_ctype_table(_Locale_ctype_t* ltype) {
_STLP_STATIC_ASSERT(sizeof(_Locale_mask_t) == sizeof(unsigned int))
return (const _Locale_mask_t*)ltype->ctable;
}
int _Locale_toupper(_Locale_ctype_t* ltype, int c) {
char buf[2], out_buf[2];
buf[0] = (char)c; buf[1] = 0;
if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
return out_buf[0];
}
else {
wchar_t wbuf[2];
MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_UPPERCASE, buf, 2, out_buf, 2);
MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
return out_buf[0];
}
}
int _Locale_tolower(_Locale_ctype_t* ltype, int c) {
char buf[2], out_buf[2];
buf[0] = (char)c; buf[1] = 0;
if ((UINT)__GetDefaultCP(ltype->lc.id) == ltype->cp) {
LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
return out_buf[0];
}
else {
wchar_t wbuf[2];
MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, buf, 2, wbuf, 2);
WideCharToMultiByte(__GetDefaultCP(ltype->lc.id), WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, buf, 2, NULL, FALSE);
LCMapStringA(ltype->lc.id, LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE, buf, 2, out_buf, 2);
MultiByteToWideChar(__GetDefaultCP(ltype->lc.id), MB_PRECOMPOSED, out_buf, 2, wbuf, 2);
WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuf, 2, out_buf, 2, NULL, FALSE);
return out_buf[0];
}
}
#if !defined (_STLP_NO_WCHAR_T)
_Locale_mask_t _Locale_wchar_ctype(_Locale_ctype_t* ltype, wint_t c,
_Locale_mask_t which_bits) {
wchar_t buf[2];
WORD out[2];
buf[0] = c; buf[1] = 0;
GetStringTypeW(CT_CTYPE1, buf, -1, out);
(void*)ltype;
return (_Locale_mask_t)out[0] & which_bits;
}
wint_t _Locale_wchar_tolower(_Locale_ctype_t* ltype, wint_t c) {
wchar_t in_c = c;
wchar_t res;
LCMapStringW(ltype->lc.id, LCMAP_LOWERCASE, &in_c, 1, &res, 1);
return res;
}
wint_t _Locale_wchar_toupper(_Locale_ctype_t* ltype, wint_t c) {
wchar_t in_c = c;
wchar_t res;
LCMapStringW(ltype->lc.id, LCMAP_UPPERCASE, &in_c, 1, &res, 1);
return res;
}
#endif
#if !defined (_STLP_NO_MBSTATE_T)
int _Locale_mb_cur_max (_Locale_ctype_t * ltype) {
CPINFO CPInfo;
if (!GetCPInfo(ltype->cp, &CPInfo)) return 0;
return CPInfo.MaxCharSize;
}
int _Locale_mb_cur_min (_Locale_ctype_t *dummy) {
(void*)dummy;
return 1;
}
int _Locale_is_stateless (_Locale_ctype_t * ltype) {
CPINFO CPInfo;
GetCPInfo(ltype->cp, &CPInfo);
return (CPInfo.MaxCharSize == 1) ? 1 : 0;
}
#if defined (__BORLANDC__) && defined (__cplusplus)
/* Weird Borland compiler behavior, even if native wint_t is imported to
* STLport namespace in _cwchar.h, wint_t is still usable when scoped with
* the Standard namespace (std::wint_t). As following WEOF macro is expended
* to (std::wint_t)(0xFFFF) compilation failed. Repeating import avoid this
* problem.*/
using __std_alias::wint_t;
#endif
wint_t _Locale_btowc(_Locale_ctype_t * ltype, int c) {
wchar_t wc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -