示例#1
0
  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, &ltime->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;
  }
示例#2
0
  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;
  }
示例#3
0
  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;
  }
示例#4
0
char const*_Locale_extract_collate_name( const char *loc, char *buf, struct _Locale_name_hint* hint )
{ return __Extract_locale_name( loc, "LC_COLLATE=", buf ); }
示例#5
0
char const*_Locale_extract_time_name( const char *loc, char *buf, struct _Locale_name_hint* hint )
{ return __Extract_locale_name( loc, "LC_TIME=", buf ); }
示例#6
0
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 );
}
示例#12
0
 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);
 }
示例#13
0
 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);
 }
示例#14
0
  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, &ltype->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;
  }
示例#15
0
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 ); }
示例#16
0
char const*_Locale_extract_monetary_name( const char *loc, char *buf, struct _Locale_name_hint* hint )
{ return __Extract_locale_name( loc, "LC_MONETARY=", buf ); }
示例#17
0
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 );
}