void* _Locale_time_create(const char * name) { int size, month, dayofweek; 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->lcid, ltime->cp)==-1) { free(ltime); return NULL; } for(month=LOCALE_SMONTHNAME1; month<=LOCALE_SMONTHNAME12; month++) // Small hack :-) { size=GetLocaleInfoA(ltime->lcid, month, NULL, 0); ltime->month[month-LOCALE_SMONTHNAME1]=(char*)malloc(size); if(!ltime->month[month-LOCALE_SMONTHNAME1]) { _Locale_time_destroy(ltime); return NULL; } GetLocaleInfoA(ltime->lcid, month, ltime->month[month-LOCALE_SMONTHNAME1], size); __ConvertFromACP(ltime->month[month-LOCALE_SMONTHNAME1], size, ltime->cp); } for(month=LOCALE_SABBREVMONTHNAME1; month<=LOCALE_SABBREVMONTHNAME12; month++) { size=GetLocaleInfoA(ltime->lcid, 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; } GetLocaleInfoA(ltime->lcid, month, ltime->abbrev_month[month-LOCALE_SABBREVMONTHNAME1], size); __ConvertFromACP(ltime->abbrev_month[month-LOCALE_SABBREVMONTHNAME1], size, ltime->cp); } for(dayofweek=LOCALE_SDAYNAME1; dayofweek<=LOCALE_SDAYNAME7; dayofweek++) { int dayindex= ( dayofweek != LOCALE_SDAYNAME7 ) ? dayofweek-LOCALE_SDAYNAME1+1 : 0; size=GetLocaleInfoA(ltime->lcid, dayofweek, NULL, 0); ltime->dayofweek[dayindex]=(char*)malloc(size); if(!ltime->dayofweek[dayindex] ) { _Locale_time_destroy(ltime); return NULL; } GetLocaleInfoA(ltime->lcid, dayofweek, ltime->dayofweek[dayindex], size); __ConvertFromACP(ltime->dayofweek[dayindex], size, ltime->cp); } for(dayofweek=LOCALE_SABBREVDAYNAME1; dayofweek<=LOCALE_SABBREVDAYNAME7; dayofweek++) { int dayindex= ( dayofweek != LOCALE_SABBREVDAYNAME7 ) ? dayofweek-LOCALE_SABBREVDAYNAME1+1 : 0; size=GetLocaleInfoA(ltime->lcid, dayofweek, NULL, 0); ltime->abbrev_dayofweek[dayindex]=(char*)malloc(size); if(!ltime->abbrev_dayofweek[dayindex]) { _Locale_time_destroy(ltime); return NULL; } GetLocaleInfoA(ltime->lcid, dayofweek, ltime->abbrev_dayofweek[dayindex], size); __ConvertFromACP(ltime->abbrev_dayofweek[dayindex], size, ltime->cp); } return ltime; }
void* _Locale_collate_create(const char * name) { 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->lcid, lcol->cp)==-1) { free(lcol); return NULL; } return lcol; }
void* _Locale_monetary_create(const char * name) { 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->lcid, lmon->cp)==-1) { free(lmon); return NULL; } // Extract information about monetary system GetLocaleInfoA(lmon->lcid, LOCALE_SDECIMAL, lmon->decimal_point, 4); __ConvertFromACP(lmon->decimal_point, 4, lmon->cp); GetLocaleInfoA(lmon->lcid, LOCALE_STHOUSAND, lmon->thousands_sep, 4); __ConvertFromACP(lmon->thousands_sep, 4, lmon->cp); BufferSize=GetLocaleInfoA(lmon->lcid, LOCALE_SGROUPING, NULL, 0); GroupingBuffer=(char*)malloc(BufferSize); if(!GroupingBuffer) { lmon->grouping=NULL; return lmon; } GetLocaleInfoA(lmon->lcid, LOCALE_SGROUPING, GroupingBuffer, BufferSize); __FixGrouping(GroupingBuffer); lmon->grouping=GroupingBuffer; GetLocaleInfoA(lmon->lcid, LOCALE_SCURRENCY, lmon->curr_symbol, 6); __ConvertFromACP(lmon->curr_symbol, 6, lmon->cp); GetLocaleInfoA(lmon->lcid, LOCALE_SNEGATIVESIGN, lmon->negative_sign, 5); __ConvertFromACP(lmon->negative_sign, 5, lmon->cp); GetLocaleInfoA(lmon->lcid, LOCALE_SPOSITIVESIGN, lmon->positive_sign, 5); __ConvertFromACP(lmon->positive_sign, 5, lmon->cp); GetLocaleInfoA(lmon->lcid, LOCALE_ICURRDIGITS, FracDigits, 3); lmon->frac_digits=atoi(FracDigits); GetLocaleInfoA(lmon->lcid, LOCALE_IINTLCURRDIGITS, FracDigits, 3); lmon->int_frac_digits=atoi(FracDigits); GetLocaleInfoA(lmon->lcid, LOCALE_SINTLSYMBOL, lmon->int_curr_symbol, 5); return lmon; }
char const*_Locale_extract_collate_name( const char *loc, char *buf, struct _Locale_name_hint* hint ) { return __Extract_locale_name( loc, "LC_COLLATE=", buf ); }
char const*_Locale_extract_time_name( const char *loc, char *buf, struct _Locale_name_hint* hint ) { return __Extract_locale_name( loc, "LC_TIME=", buf ); }
char const*_Locale_extract_numeric_name( const char *loc, char *buf, struct _Locale_name_hint* hint ) { return __Extract_locale_name( loc, "LC_NUMERIC=", buf ); }
char *_Locale_extract_messages_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_MESSAGES=", buf ); }
char *_Locale_extract_monetary_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_MONETARY=", buf ); }
char *_Locale_extract_collate_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_COLLATE=", buf ); }
char *_Locale_extract_numeric_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_NUMERIC=", buf ); }
char *_Locale_extract_ctype_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_CTYPE=", buf ); }
char* _Locale_extract_monetary_name(const char* cname, char* buf) { char lname[_Locale_MAX_SIMPLE_NAME]; __Extract_locale_name(cname, LC_MONETARY, lname); if(lname[0] == 'C' && lname[1] == 0) return strcpy(buf, lname); return __TranslateToSystem(lname, buf); }
char* _Locale_extract_numeric_name(const char* cname, char* buf) { char lname[_Locale_MAX_SIMPLE_NAME]; __Extract_locale_name(cname, LC_NUMERIC, lname); if(lname[0] == 'C' && lname[1] == 0) return strcpy(buf, lname); return __TranslateToSystem(lname, buf); }
void* _Locale_ctype_create(const char * name) { char cname[_Locale_MAX_SIMPLE_NAME]; char cp_name[MAX_CP_LEN+1]; int NativeCP; unsigned char Buffer[256]; unsigned char *ptr; unsigned short ctable[256]; CPINFO CPInfo; int i; wchar_t *wbuffer; int BufferSize; _Locale_ctype_t *ltype=(_Locale_ctype_t*)malloc(sizeof(_Locale_ctype_t)); if(!ltype) return ltype; memset(ltype, 0, sizeof(_Locale_ctype_t)); __Extract_locale_name(name, LC_CTYPE, cname); if(__GetLCIDFromName(cname, <ype->lcid, cp_name)==-1) { free(ltype); return NULL; } ltype->cp = atoi(cp_name); NativeCP=__intGetACP(ltype->lcid); if(NativeCP == 0) NativeCP=__intGetOCP(ltype->lcid); /* Make table with all characters. */ for(i = 0; i < 256; ++i) Buffer[i] = i; if(!GetCPInfo(NativeCP, &CPInfo)) { free(ltype); return NULL; } if(CPInfo.MaxCharSize > 1) { for(ptr=(unsigned char*)CPInfo.LeadByte; *ptr && *(ptr+1); ptr+=2) for(i=*ptr; i <= *(ptr+1); ++i) Buffer[i] = 0; } if(NativeCP != ltype->cp) { OSVERSIONINFO ver_info; ver_info.dwOSVersionInfoSize = sizeof(ver_info); GetVersionEx(&ver_info); if(ver_info.dwPlatformId == VER_PLATFORM_WIN32_NT) { // Convert character sequence to Unicode. BufferSize = MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0); wbuffer = (wchar_t*)malloc(BufferSize*sizeof(wchar_t)); if(!MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize)) { free(wbuffer); free(ltype); return NULL; } GetStringTypeW(CT_CTYPE1, wbuffer, 256, ctable); for(i = 0; i < 256; ++i) ltype->ctable[i]=(unsigned int)ctable[i]; if(CPInfo.MaxCharSize > 1) { for(ptr=(unsigned char*)CPInfo.LeadByte; *ptr && *(ptr+1); ptr+=2) for(i=*ptr; i <= *(ptr+1); i++) ltype->ctable[i] = _LEADBYTE; } free(wbuffer); } else { unsigned char TargetBuffer[256]; GetStringTypeA(ltype->lcid, CT_CTYPE1, (const char*)Buffer, 256, ctable); // Convert character sequence to target code page. BufferSize = MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, NULL, 0); wbuffer = (wchar_t*)malloc(BufferSize*sizeof(wchar_t)); if(!MultiByteToWideChar(NativeCP, MB_PRECOMPOSED, (const char*)Buffer, 256, wbuffer, BufferSize)) { free(wbuffer); free(ltype); return NULL; } if(!WideCharToMultiByte(ltype->cp, WC_COMPOSITECHECK | WC_SEPCHARS, wbuffer, BufferSize, (char*)TargetBuffer, 256, NULL, FALSE)) { free(wbuffer); free(ltype); return NULL; } free(wbuffer); // Translate ctype table. for(i = 0; i < 256; ++i) { if(!TargetBuffer[i]) continue; ltype->ctable[TargetBuffer[i]] = ctable[i]; } // Mark lead byte. if(!GetCPInfo(ltype->cp, &CPInfo)) { free(ltype); return NULL; } if(CPInfo.MaxCharSize > 1) { for(ptr=(unsigned char*)CPInfo.LeadByte; *ptr && *(ptr+1); ptr+=2) for(i=*ptr; i <= *(ptr+1); ++i) ltype->ctable[i] = _LEADBYTE; } } } else { GetStringTypeA(ltype->lcid, CT_CTYPE1, (const char*)Buffer, 256, ctable); for(i = 0; i < 256; ++i) ltype->ctable[i]=(unsigned int)ctable[i]; if(CPInfo.MaxCharSize > 1) { for(ptr=(unsigned char*)CPInfo.LeadByte; *ptr && *(ptr+1); ptr+=2) for(i=*ptr; i <= *(ptr+1); ++i) ltype->ctable[i] = _LEADBYTE; } } return ltype; }
char const*_Locale_extract_ctype_name(const char *loc, char *buf, struct _Locale_name_hint* hint, int *__err_code) { return __Extract_locale_name( loc, "LC_CTYPE=", buf ); }
char const*_Locale_extract_monetary_name( const char *loc, char *buf, struct _Locale_name_hint* hint ) { return __Extract_locale_name( loc, "LC_MONETARY=", buf ); }
char const*_Locale_extract_messages_name( const char *loc, char *buf, struct _Locale_name_hint* hint ) { return __Extract_locale_name( loc, "LC_MESSAGES=", buf ); }
char *_Locale_extract_time_name( const char *loc, char *buf ) { return __Extract_locale_name( loc, "LC_TIME=", buf ); }