📄 c_locale_win32.c
字号:
for (ptr = (unsigned char*)CPInfo.LeadByte; *ptr && *(ptr + 1); ptr+=2)
for (i = *ptr; i <= *(ptr + 1); ++i) ltype->ctable[i] = _LEADBYTE;
}
}
return ltype;
}
void* _Locale_numeric_create(const char * name, _Locale_lcid_t* lc_hint) {
char *GroupingBuffer;
char cname[_Locale_MAX_SIMPLE_NAME];
int BufferSize;
_Locale_numeric_t *lnum = (_Locale_numeric_t*)malloc(sizeof(_Locale_numeric_t));
if (!lnum) return lnum; /* MS normal behavior for 'new' */
__Extract_locale_name(name, LC_NUMERIC, cname);
if (__GetLCIDFromName(cname, &lnum->lc.id, lnum->cp, lc_hint) == -1)
{ free(lnum); return NULL; }
__GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_SDECIMAL, lnum->decimal_point, 4);
__GetLocaleInfoUsingACP(lnum->lc.id, lnum->cp, LOCALE_STHOUSAND, lnum->thousands_sep, 4);
BufferSize = GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, NULL, 0);
GroupingBuffer = (char*)malloc(BufferSize);
if (!GroupingBuffer) { lnum->grouping = NULL; return lnum; }
GetLocaleInfoA(lnum->lc.id, LOCALE_SGROUPING, GroupingBuffer, BufferSize);
__FixGrouping(GroupingBuffer);
lnum->grouping = GroupingBuffer;
return lnum;
}
static int __ConvertDate(const char *NTDate, char *buffer, int buf_size) {
/* This function will return an incomplete buffer if buffer is not long enough */
const char *cur_char;
char *cur_output, *end_output;
/* Correct time format. */
cur_char = NTDate;
cur_output = buffer;
end_output = cur_output + buf_size;
buf_size = 0;
while (*cur_char) {
if (cur_output && (cur_output == end_output)) break;
switch (*cur_char) {
case 'd':
{
if (*(cur_char + 1) == 'd') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (*(cur_char + 2) == 'd') {
if (*(cur_char + 3) == 'd') {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'A'; }
buf_size += 2;
cur_char += 3;
}
else {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'a'; }
buf_size += 2;
cur_char += 2;
}
}
else {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'd'; }
buf_size += 2;
cur_char++;
}
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'd'; }
buf_size += 3;
}
}
break;
case 'M':
{
if (*(cur_char + 1) == 'M') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (*(cur_char + 2) == 'M') {
if (*(cur_char + 3) == 'M') {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'B'; }
buf_size += 2;
cur_char += 3;
}
else {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'b'; }
buf_size += 2;
cur_char += 2;
}
}
else {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'm'; }
buf_size += 2;
cur_char++;
}
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'm'; }
buf_size += 3;
}
}
break;
case 'y':
{
if (*(cur_char + 1) == 'y') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (*(cur_char + 2) == 'y' && *(cur_char + 3) == 'y') {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'Y'; }
buf_size += 2;
cur_char += 3;
}
else {
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'y'; }
buf_size += 2;
cur_char++;
}
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'y'; }
buf_size += 3;
}
}
break;
case '%':
{
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '%'; }
buf_size += 2;
}
break;
case '\'':
{
++cur_char;
while (*cur_char != '\'' && *cur_char != 0 && (cur_output == NULL || cur_output != end_output)) {
if (cur_output) { *cur_output++ = *cur_char; }
++cur_char;
buf_size += 1;
}
}
break;
default:
{
if (cur_output) { *(cur_output++) = *cur_char; }
buf_size += 1;
}
break;
}
if (*cur_char == 0) break;
++cur_char;
}
if (!cur_output || cur_output != end_output) {
if (cur_output) *cur_output = 0;
buf_size += 1;
}
else {
/* We trunc result */
*(--cur_output) = 0;
}
return buf_size;
}
static int __ConvertTime(const char *NTTime, char *buffer, int buf_size) {
const char *cur_char;
char *cur_output, *end_output;
cur_char = NTTime;
cur_output = buffer;
end_output = cur_output + buf_size;
buf_size = 0;
while (*cur_char) {
switch(*cur_char) {
case 'h':
if (*(cur_char + 1) == 'h') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'I'; }
buf_size += 2;
++cur_char;
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'I'; }
buf_size += 3;
}
break;
case 'H':
if (*(cur_char + 1) == 'H') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'H'; }
buf_size += 2;
++cur_char;
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'H'; }
buf_size += 3;
}
break;
case 'm':
if (*(cur_char + 1) == 'm') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'M'; }
buf_size += 2;
cur_char++;
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'M'; }
buf_size += 3;
}
break;
case 's':
if (*(cur_char + 1) == 's') {
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'S'; }
buf_size += 2;
++cur_char;
}
else {
if (cur_output && (cur_output + 3 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = '#'; *(cur_output++) = 'S'; }
buf_size += 3;
}
break;
case 't':
if (*(cur_char + 1) == 't')
++cur_char;
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++) = '%'; *(cur_output++) = 'p'; }
buf_size += 2;
break;
case '%':
if (cur_output && (cur_output + 2 > end_output)) {
*cur_output = 0;
return ++buf_size;
}
if (cur_output) { *(cur_output++)='%'; *(cur_output++)='%'; }
buf_size += 2;
break;
case '\'':
++cur_char;
while (*cur_char != '\'' && *cur_char != 0 && (!cur_output || (cur_output != end_output))) {
if (cur_output) *cur_output++ = *cur_char;
++cur_char;
buf_size += 1;
}
break;
default:
if (cur_output) { *(cur_output++) = *cur_char; }
buf_size += 1;
break;
}
if (*cur_char == 0) break;
++cur_char;
}
if (!cur_output || cur_output != end_output) {
if (cur_output) *cur_output = 0;
buf_size += 1;
}
else {
/* We trunc result */
*(--cur_output) = 0;
}
return buf_size;
}
void* _Locale_time_create(const char * name, _Locale_lcid_t* lc_hint) {
int size, month, dayofweek;
size_t length;
char fmt80[80];
char cname[_Locale_MAX_SIMPLE_NAME];
_Locale_time_t *ltime=(_Locale_time_t*)malloc(sizeof(_Locale_time_t));
if (!ltime) return ltime;
memset(ltime, 0, sizeof(_Locale_time_t));
__Extract_locale_name(name, LC_TIME, cname);
if (__GetLCIDFromName(cname, <ime->lc.id, ltime->cp, lc_hint) == -1)
{ free(ltime); return NULL; }
for (month = LOCALE_SMONTHNAME1; month <= LOCALE_SMONTHNAME12; ++month) { /* Small hack :-) */
size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
ltime->month[month - LOCALE_SMONTHNAME1] = (char*)malloc(size);
if (!ltime->month[month - LOCALE_SMONTHNAME1]) { _Locale_time_destroy(ltime); return NULL; }
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->month[month - LOCALE_SMONTHNAME1], size);
}
for (month = LOCALE_SABBREVMONTHNAME1; month <= LOCALE_SABBREVMONTHNAME12; ++month) {
size = GetLocaleInfoA(ltime->lc.id, month, NULL, 0);
ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1] = (char*)malloc(size);
if (!ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1]) { _Locale_time_destroy(ltime); return NULL; }
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, month, ltime->abbrev_month[month - LOCALE_SABBREVMONTHNAME1], size);
}
for (dayofweek = LOCALE_SDAYNAME1; dayofweek <= LOCALE_SDAYNAME7; ++dayofweek) {
int dayindex = ( dayofweek != LOCALE_SDAYNAME7 ) ? dayofweek - LOCALE_SDAYNAME1 + 1 : 0;
size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
ltime->dayofweek[dayindex] = (char*)malloc(size);
if (!ltime->dayofweek[dayindex]) { _Locale_time_destroy(ltime); return NULL; }
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->dayofweek[dayindex], size);
}
for (dayofweek = LOCALE_SABBREVDAYNAME1; dayofweek <= LOCALE_SABBREVDAYNAME7; ++dayofweek) {
int dayindex = ( dayofweek != LOCALE_SABBREVDAYNAME7 ) ? dayofweek - LOCALE_SABBREVDAYNAME1 + 1 : 0;
size = GetLocaleInfoA(ltime->lc.id, dayofweek, NULL, 0);
ltime->abbrev_dayofweek[dayindex] = (char*)malloc(size);
if (!ltime->abbrev_dayofweek[dayindex]) { _Locale_time_destroy(ltime); return NULL; }
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, dayofweek, ltime->abbrev_dayofweek[dayindex], size);
}
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SSHORTDATE, fmt80, 80);
size = __ConvertDate(fmt80, NULL, 0);
ltime->date_format = (char*)malloc(size);
if (!ltime->date_format) { _Locale_time_destroy(ltime); return NULL; }
__ConvertDate(fmt80, ltime->date_format, size);
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_SLONGDATE, fmt80, 80);
size = __ConvertDate(fmt80, NULL, 0);
ltime->long_date_format = (char*)malloc(size);
if (!ltime->long_date_format) { _Locale_time_destroy(ltime); return NULL; }
__ConvertDate(fmt80, ltime->long_date_format, size);
__GetLocaleInfoUsingACP(ltime->lc.id, ltime->cp, LOCALE_STIMEFORMAT, fmt80, 80);
size = __ConvertTime(fmt80, NULL, 0);
ltime->time_format = (char*)malloc(size);
if (!ltime->time_format) { _Locale_time_destroy(ltime); return NULL; }
__ConvertTime(fmt80, ltime->time_format, size);
/* NT doesn't provide this information, we must simulate. */
length = strlen(ltime->date_format) + strlen(ltime->time_format) + 1 /* space */ + 1 /* trailing 0 */;
ltime->date_time_format = (char*)malloc(length);
if (!ltime->date_time_format) { _Locale_time_destroy(ltime); return NULL; }
_STLP_STRCPY2(ltime->date_time_format, length, ltime->date_format);
_STLP_STRCAT2(ltime->date_time_format, length, " ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -