ReactOS 0.4.16-dev-188-g678aa63
locale.c File Reference
#include <precomp.h>
#include <locale.h>
#include "mbctype.h"
#include <internal/wine/msvcrt.h>
Include dependency graph for locale.c:

Go to the source code of this file.

Classes

struct  locale_search_t
 

Macros

#define MAX_ELEM_LEN   64 /* Max length of country/language/CP string */
 
#define MAX_LOCALE_LENGTH   256
 
#define strcasecmp   _stricmp
 
#define strncasecmp   _strnicmp
 
#define LOCK_LOCALE   _mlock(_SETLOCALE_LOCK);
 
#define UNLOCK_LOCALE   _munlock(_SETLOCALE_LOCK);
 
#define MSVCRT_LEADBYTE   0x8000
 
#define MSVCRT_C1_DEFINED   0x200
 
#define FOUND_LANGUAGE   0x4
 
#define FOUND_COUNTRY   0x2
 
#define FOUND_CODEPAGE   0x1
 
#define CONTINUE_LOOKING   TRUE
 
#define STOP_LOOKING   FALSE
 

Functions

static void remap_synonym (char *name)
 
static int compare_info (LCID lcid, DWORD flags, char *buff, const char *cmp, BOOL exact)
 
static BOOL CALLBACK find_best_locale_proc (HMODULE hModule, LPCSTR type, LPCSTR name, WORD LangID, LONG_PTR lParam)
 
int atoi (const char *)
 
LCID MSVCRT_locale_to_LCID (const char *locale, unsigned short *codepage)
 
static BOOL update_threadlocinfo_category (LCID lcid, unsigned short cp, MSVCRT__locale_t loc, int category)
 
static void swap_pointers (void **p1, void **p2)
 
MSVCRT_pthreadlocinfo get_locinfo (void)
 
MSVCRT_pthreadmbcinfo get_mbcinfo (void)
 
static charconstruct_lc_all (MSVCRT_pthreadlocinfo locinfo)
 
wchar_t *CDECL _wsetlocale (int category, const wchar_t *locale)
 
char *CDECL _Getdays (void)
 
char *CDECL _Getmonths (void)
 
void *CDECL _Gettnames (void)
 
int CDECL __crtLCMapStringA (LCID lcid, DWORD mapflags, const char *src, int srclen, char *dst, int dstlen, unsigned int codepage, int xflag)
 
int CDECL __crtLCMapStringW (LCID lcid, DWORD mapflags, const wchar_t *src, int srclen, wchar_t *dst, int dstlen, unsigned int codepage, int xflag)
 
int CDECL __crtCompareStringA (LCID lcid, DWORD flags, const char *src1, int len1, const char *src2, int len2)
 
int CDECL __crtCompareStringW (LCID lcid, DWORD flags, const wchar_t *src1, int len1, const wchar_t *src2, int len2)
 
int CDECL __crtGetLocaleInfoW (LCID lcid, LCTYPE type, wchar_t *buffer, int len)
 
wint_t CDECL MSVCRT_btowc (int c)
 
BOOL CDECL __crtGetStringTypeW (DWORD unk, DWORD type, wchar_t *buffer, int len, WORD *out)
 
struct lconv *CDECL localeconv (void)
 
int CDECL __lconv_init (void)
 
LCID *CDECL ___lc_handle_func (void)
 
unsigned int CDECL ___lc_codepage_func (void)
 
unsigned int CDECL ___lc_collate_cp_func (void)
 
void free_locinfo (MSVCRT_pthreadlocinfo locinfo)
 
void free_mbcinfo (MSVCRT_pthreadmbcinfo mbcinfo)
 
MSVCRT__locale_t CDECL MSVCRT__get_current_locale (void)
 
void CDECL MSVCRT__free_locale (MSVCRT__locale_t locale)
 
MSVCRT__locale_t CDECL MSVCRT__create_locale (int category, const char *locale)
 
char *CDECL setlocale (int category, const char *locale)
 
int CDECL _configthreadlocale (int type)
 
int CDECL _getmbcp (void)
 
unsigned int CDECL ___setlc_active_func (void)
 
unsigned int *CDECL ___unguarded_readlc_active_add_func (void)
 
void __init_global_locale ()
 
const unsigned short ** __p__pctype (void)
 
const unsigned short *__cdecl __pctype_func (void)
 

Variables

unsigned int __lc_codepage = 0
 
int MSVCRT___lc_collate_cp = 0
 
LCID MSVCRT___lc_handle [LC_MAX - LC_MIN+1] = { 0 }
 
int __mb_cur_max = 1
 
static unsigned char charmax = CHAR_MAX
 
unsigned char _mbctype [257] = { 0 }
 
static const char *const _country_synonyms []
 
unsigned int __setlc_active
 
unsigned int __unguarded_readlc_active
 
MSVCRT__locale_t global_locale = NULL
 

Macro Definition Documentation

◆ CONTINUE_LOOKING

#define CONTINUE_LOOKING   TRUE

Definition at line 118 of file locale.c.

◆ FOUND_CODEPAGE

#define FOUND_CODEPAGE   0x1

Definition at line 107 of file locale.c.

◆ FOUND_COUNTRY

#define FOUND_COUNTRY   0x2

Definition at line 106 of file locale.c.

◆ FOUND_LANGUAGE

#define FOUND_LANGUAGE   0x4

Definition at line 105 of file locale.c.

◆ LOCK_LOCALE

#define LOCK_LOCALE   _mlock(_SETLOCALE_LOCK);

Definition at line 45 of file locale.c.

◆ MAX_ELEM_LEN

#define MAX_ELEM_LEN   64 /* Max length of country/language/CP string */

Definition at line 27 of file locale.c.

◆ MAX_LOCALE_LENGTH

#define MAX_LOCALE_LENGTH   256

Definition at line 28 of file locale.c.

◆ MSVCRT_C1_DEFINED

#define MSVCRT_C1_DEFINED   0x200

Definition at line 49 of file locale.c.

◆ MSVCRT_LEADBYTE

#define MSVCRT_LEADBYTE   0x8000

Definition at line 48 of file locale.c.

◆ STOP_LOOKING

#define STOP_LOOKING   FALSE

Definition at line 119 of file locale.c.

◆ strcasecmp

#define strcasecmp   _stricmp

Definition at line 34 of file locale.c.

◆ strncasecmp

#define strncasecmp   _strnicmp

Definition at line 35 of file locale.c.

◆ UNLOCK_LOCALE

#define UNLOCK_LOCALE   _munlock(_SETLOCALE_LOCK);

Definition at line 46 of file locale.c.

Function Documentation

◆ ___lc_codepage_func()

unsigned int CDECL ___lc_codepage_func ( void  )

Definition at line 629 of file locale.c.

630{
631 return __lc_codepage;
632}
unsigned int __lc_codepage
Definition: locale.c:36

Referenced by mbrtowc(), START_TEST(), and Test___lc_codepage().

◆ ___lc_collate_cp_func()

unsigned int CDECL ___lc_collate_cp_func ( void  )

Definition at line 637 of file locale.c.

638{
639 return get_locinfo()->lc_collate_cp;
640}
MSVCRT_pthreadlocinfo get_locinfo(void)
Definition: locale.c:356
unsigned int lc_collate_cp
Definition: msvcrt.h:114

Referenced by Test___lc_collate_cp().

◆ ___lc_handle_func()

LCID *CDECL ___lc_handle_func ( void  )

Definition at line 621 of file locale.c.

622{
623 return MSVCRT___lc_handle;
624}
LCID MSVCRT___lc_handle[LC_MAX - LC_MIN+1]
Definition: locale.c:38

Referenced by Test___lc_handle().

◆ ___setlc_active_func()

unsigned int CDECL ___setlc_active_func ( void  )

Definition at line 1483 of file locale.c.

1484{
1485 return __setlc_active;
1486}
unsigned int __setlc_active
Definition: environ.c:16

Referenced by Test___setlc_active().

◆ ___unguarded_readlc_active_add_func()

unsigned int *CDECL ___unguarded_readlc_active_add_func ( void  )

Definition at line 1492 of file locale.c.

1493{
1495}
unsigned int __unguarded_readlc_active
Definition: environ.c:17

Referenced by Test___unguarded_readlc_active().

◆ __crtCompareStringA()

int CDECL __crtCompareStringA ( LCID  lcid,
DWORD  flags,
const char src1,
int  len1,
const char src2,
int  len2 
)

Definition at line 539 of file locale.c.

541{
542 FIXME("(lcid %x, flags %x, %s(%d), %s(%d), partial stub\n",
543 lcid, flags, debugstr_a(src1), len1, debugstr_a(src2), len2 );
544 /* FIXME: probably not entirely right */
545 return CompareStringA( lcid, flags, src1, len1, src2, len2 );
546}
#define FIXME(fmt,...)
Definition: precomp.h:53
INT WINAPI CompareStringA(LCID lcid, DWORD flags, LPCSTR str1, INT len1, LPCSTR str2, INT len2)
Definition: locale.c:4083
GLbitfield flags
Definition: glext.h:7161
#define debugstr_a
Definition: kernel32.h:31

◆ __crtCompareStringW()

int CDECL __crtCompareStringW ( LCID  lcid,
DWORD  flags,
const wchar_t src1,
int  len1,
const wchar_t src2,
int  len2 
)

Definition at line 551 of file locale.c.

553{
554 FIXME("(lcid %x, flags %x, %s(%d), %s(%d), partial stub\n",
555 lcid, flags, debugstr_w(src1), len1, debugstr_w(src2), len2 );
556 /* FIXME: probably not entirely right */
557 return CompareStringW( lcid, flags, src1, len1, src2, len2 );
558}
INT WINAPI CompareStringW(LCID lcid, DWORD flags, LPCWSTR str1, INT len1, LPCWSTR str2, INT len2)
Definition: locale.c:4014
#define debugstr_w
Definition: kernel32.h:32

◆ __crtGetLocaleInfoW()

int CDECL __crtGetLocaleInfoW ( LCID  lcid,
LCTYPE  type,
wchar_t buffer,
int  len 
)

Definition at line 563 of file locale.c.

564{
565 FIXME("(lcid %x, type %x, %p(%d), partial stub\n", lcid, type, buffer, len );
566 /* FIXME: probably not entirely right */
567 return GetLocaleInfoW( lcid, type, buffer, len );
568}
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint buffer
Definition: glext.h:5915
GLenum GLsizei len
Definition: glext.h:6722

◆ __crtGetStringTypeW()

BOOL CDECL __crtGetStringTypeW ( DWORD  unk,
DWORD  type,
wchar_t buffer,
int  len,
WORD out 
)

Definition at line 591 of file locale.c.

593{
594 FIXME("(unk %x, type %x, wstr %p(%d), %p) partial stub\n",
595 unk, type, buffer, len, out);
596
597 return GetStringTypeW(type, buffer, len, out);
598}
BOOL WINAPI GetStringTypeW(DWORD type, LPCWSTR src, INT count, LPWORD chartype)
Definition: locale.c:3095
static FILE * out
Definition: regtests2xml.c:44

◆ __crtLCMapStringA()

int CDECL __crtLCMapStringA ( LCID  lcid,
DWORD  mapflags,
const char src,
int  srclen,
char dst,
int  dstlen,
unsigned int  codepage,
int  xflag 
)

Definition at line 512 of file locale.c.

515 {
516 FIXME("(lcid %x, flags %x, %s(%d), %p(%d), %x, %d), partial stub!\n",
517 lcid,mapflags,src,srclen,dst,dstlen,codepage,xflag);
518 /* FIXME: A bit incorrect. But msvcrt itself just converts its
519 * arguments to wide strings and then calls LCMapStringW
520 */
521 return LCMapStringA(lcid,mapflags,src,srclen,dst,dstlen);
522}
INT WINAPI LCMapStringA(LCID lcid, DWORD flags, LPCSTR src, INT srclen, LPSTR dst, INT dstlen)
Definition: locale.c:3831
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
static DWORD LPDWORD LPCSTR DWORD srclen
Definition: directory.c:52
static DWORD dstlen
Definition: directory.c:51
int codepage
Definition: win_iconv.c:156

◆ __crtLCMapStringW()

int CDECL __crtLCMapStringW ( LCID  lcid,
DWORD  mapflags,
const wchar_t src,
int  srclen,
wchar_t dst,
int  dstlen,
unsigned int  codepage,
int  xflag 
)

Definition at line 527 of file locale.c.

529{
530 FIXME("(lcid %x, flags %x, %s(%d), %p(%d), %x, %d), partial stub!\n",
531 lcid, mapflags, debugstr_w(src), srclen, dst, dstlen, codepage, xflag);
532
533 return LCMapStringW(lcid, mapflags, src, srclen, dst, dstlen);
534}
INT WINAPI LCMapStringW(LCID lcid, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
Definition: locale.c:3805

◆ __init_global_locale()

void __init_global_locale ( )

Definition at line 1498 of file locale.c.

1499{
1500 unsigned i;
1501
1503 /* Someone created it before us */
1504 if(global_locale)
1505 return;
1507
1508 __lc_codepage = MSVCRT_locale->locinfo->lc_codepage;
1509 MSVCRT___lc_collate_cp = MSVCRT_locale->locinfo->lc_collate_cp;
1510 __mb_cur_max = MSVCRT_locale->locinfo->mb_cur_max;
1511 for(i=LC_MIN; i<=LC_MAX; i++)
1512 MSVCRT___lc_handle[i] = MSVCRT_locale->locinfo->lc_handle[i];
1515}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define LC_MAX
Definition: locale.h:25
#define LC_MIN
Definition: locale.h:24
#define MSVCRT_locale
Definition: locale.h:80
int __cdecl _setmbcp(int)
Definition: _setmbcp.c:218
#define _MB_CP_ANSI
Definition: msvcrt.h:830
int MSVCRT___lc_collate_cp
Definition: locale.c:37
#define LOCK_LOCALE
Definition: locale.c:45
MSVCRT__locale_t global_locale
Definition: locale.c:1497
int __mb_cur_max
Definition: locale.c:39
#define UNLOCK_LOCALE
Definition: locale.c:46
MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale)
Definition: locale.c:724

Referenced by __get_MSVCRT_locale().

◆ __lconv_init()

int CDECL __lconv_init ( void  )

This file has no copyright assigned and is placed in the Public Domain. This file is part of the w64 mingw-runtime package. No warranty is given; refer to the file DISCLAIMER.PD within this package.

Definition at line 611 of file locale.c.

612{
613 /* this is used to make chars unsigned */
614 charmax = 255;
615 return 0;
616}
static unsigned char charmax
Definition: locale.c:40

Referenced by my_lconv_init().

◆ __p__pctype()

const unsigned short ** __p__pctype ( void  )

Definition at line 1520 of file locale.c.

1521{
1522 return &get_locinfo()->pctype;
1523}
unsigned short * pctype
Definition: msvcrt.h:131

Referenced by Test__ctype().

◆ __pctype_func()

const unsigned short *__cdecl __pctype_func ( void  )

Definition at line 1525 of file locale.c.

1526{
1527 return get_locinfo()->pctype;
1528}

◆ _configthreadlocale()

int CDECL _configthreadlocale ( int  type)

Definition at line 1426 of file locale.c.

1427{
1430 int ret;
1431
1432 if(!data)
1433 return -1;
1434
1436
1438 if(!data->have_locale) {
1439 /* Copy current global locale */
1441 if(!locale)
1442 return -1;
1443
1444 data->locinfo = locale->locinfo;
1445 data->mbcinfo = locale->mbcinfo;
1446 data->have_locale = TRUE;
1448 }
1449
1450 return ret;
1451 }
1452
1454 if(data->have_locale) {
1455 free_locinfo(data->locinfo);
1456 free_mbcinfo(data->mbcinfo);
1457 data->locinfo = MSVCRT_locale->locinfo;
1458 data->mbcinfo = MSVCRT_locale->mbcinfo;
1459 data->have_locale = FALSE;
1460 }
1461
1462 return ret;
1463 }
1464
1465 if(!type)
1466 return ret;
1467
1468 return -1;
1469}
Definition: _locale.h:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define LC_ALL
Definition: locale.h:17
#define _DISABLE_PER_THREAD_LOCALE
Definition: locale.h:55
#define _ENABLE_PER_THREAD_LOCALE
Definition: locale.h:54
thread_data_t * msvcrt_get_thread_data(void)
Definition: tls.c:31
#define MSVCRT_free
Definition: msvcrt.h:152
void free_locinfo(MSVCRT_pthreadlocinfo locinfo)
Definition: locale.c:643
void free_mbcinfo(MSVCRT_pthreadmbcinfo mbcinfo)
Definition: locale.c:687
#define setlocale(n, s)
Definition: locale.h:46
int ret

◆ _Getdays()

char *CDECL _Getdays ( void  )

Definition at line 419 of file locale.c.

420{
422 int i, len, size;
423 char *out;
424
425 TRACE("\n");
426
427 size = cur->str.names.short_mon[0]-cur->str.names.short_wday[0];
429 if(!out)
430 return NULL;
431
432 size = 0;
433 for(i=0; i<7; i++) {
434 out[size++] = ':';
435 len = strlen(cur->str.names.short_wday[i]);
436 memcpy(&out[size], cur->str.names.short_wday[i], len);
437 size += len;
438
439 out[size++] = ':';
440 len = strlen(cur->str.names.wday[i]);
441 memcpy(&out[size], cur->str.names.wday[i], len);
442 size += len;
443 }
444 out[size] = '\0';
445
446 return out;
447}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
FxCollectionEntry * cur
GLsizeiptr size
Definition: glext.h:5919
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define MSVCRT_malloc
Definition: msvcrt.h:151
#define TRACE(s)
Definition: solgame.cpp:4
struct MSVCRT___lc_time_data * lc_time_curr
Definition: msvcrt.h:134

◆ _getmbcp()

◆ _Getmonths()

char *CDECL _Getmonths ( void  )

Definition at line 452 of file locale.c.

453{
455 int i, len, size;
456 char *out;
457
458 TRACE("\n");
459
460 size = cur->str.names.am-cur->str.names.short_mon[0];
462 if(!out)
463 return NULL;
464
465 size = 0;
466 for(i=0; i<12; i++) {
467 out[size++] = ':';
468 len = strlen(cur->str.names.short_mon[i]);
469 memcpy(&out[size], cur->str.names.short_mon[i], len);
470 size += len;
471
472 out[size++] = ':';
473 len = strlen(cur->str.names.mon[i]);
474 memcpy(&out[size], cur->str.names.mon[i], len);
475 size += len;
476 }
477 out[size] = '\0';
478
479 return out;
480}

◆ _Gettnames()

void *CDECL _Gettnames ( void  )

Definition at line 485 of file locale.c.

486{
488 unsigned int i, size = sizeof(MSVCRT___lc_time_data);
489
490 TRACE("\n");
491
492 for(i=0; i<sizeof(cur->str.str)/sizeof(cur->str.str[0]); i++)
493 size += strlen(cur->str.str[i])+1;
494
496 if(!ret)
497 return NULL;
498 memcpy(ret, cur, size);
499
500 size = 0;
501 for(i=0; i<sizeof(cur->str.str)/sizeof(cur->str.str[0]); i++) {
502 ret->str.str[i] = &ret->data[size];
503 size += strlen(&ret->data[size])+1;
504 }
505
506 return ret;
507}

Referenced by test__Gettnames().

◆ _wsetlocale()

wchar_t *CDECL _wsetlocale ( int  category,
const wchar_t locale 
)

Definition at line 405 of file locale.c.

406{
407 static wchar_t fake[] = {
408 'E','n','g','l','i','s','h','_','U','n','i','t','e','d',' ',
409 'S','t','a','t','e','s','.','1','2','5','2',0 };
410
411 FIXME("%d %s\n", category, debugstr_w(locale));
412
413 return fake;
414}

◆ atoi()

int atoi ( const char )

◆ compare_info()

static int compare_info ( LCID  lcid,
DWORD  flags,
char buff,
const char cmp,
BOOL  exact 
)
static

Definition at line 122 of file locale.c.

123{
124 int len;
125
126 if(!cmp[0])
127 return 0;
128
129 buff[0] = 0;
131 if (!buff[0])
132 return 0;
133
134 /* Partial matches are only allowed on language/country names */
135 len = strlen(cmp);
136 if(exact || len<=3)
137 return !strcasecmp(cmp, buff);
138 else
139 return !strncasecmp(cmp, buff, len);
140}
INT WINAPI GetLocaleInfoA(LCID lcid, LCTYPE lctype, LPSTR buffer, INT len)
Definition: locale.c:1600
static unsigned char buff[32768]
Definition: fatten.c:17
#define cmp(status, error)
Definition: error.c:114
#define strncasecmp
Definition: locale.c:35
#define strcasecmp
Definition: locale.c:34
#define MAX_ELEM_LEN
Definition: locale.c:27
#define LOCALE_NOUSEROVERRIDE
Definition: winnls.h:19

Referenced by ddraw_match_surface_desc(), and find_best_locale_proc().

◆ construct_lc_all()

static char * construct_lc_all ( MSVCRT_pthreadlocinfo  locinfo)
inlinestatic

Definition at line 376 of file locale.c.

376 {
377 static char current_lc_all[MAX_LOCALE_LENGTH];
378
379 int i;
380
381 for(i=MSVCRT_LC_MIN+1; i<MSVCRT_LC_MAX; i++) {
382 if(strcmp(locinfo->lc_category[i].locale,
383 locinfo->lc_category[i+1].locale))
384 break;
385 }
386
387 if(i==MSVCRT_LC_MAX)
388 return locinfo->lc_category[MSVCRT_LC_COLLATE].locale;
389
390 sprintf(current_lc_all,
391 "LC_COLLATE=%s;LC_CTYPE=%s;LC_MONETARY=%s;LC_NUMERIC=%s;LC_TIME=%s",
392 locinfo->lc_category[MSVCRT_LC_COLLATE].locale,
393 locinfo->lc_category[MSVCRT_LC_CTYPE].locale,
394 locinfo->lc_category[MSVCRT_LC_MONETARY].locale,
395 locinfo->lc_category[MSVCRT_LC_NUMERIC].locale,
396 locinfo->lc_category[MSVCRT_LC_TIME].locale);
397
398 return current_lc_all;
399}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define MSVCRT_LC_TIME
Definition: msvcrt.h:655
#define MSVCRT_LC_MAX
Definition: msvcrt.h:657
#define MSVCRT_LC_MONETARY
Definition: msvcrt.h:653
#define MSVCRT_LC_NUMERIC
Definition: msvcrt.h:654
#define MSVCRT_LC_COLLATE
Definition: msvcrt.h:651
#define MSVCRT_LC_MIN
Definition: msvcrt.h:656
#define MSVCRT_LC_CTYPE
Definition: msvcrt.h:652
else locinfo
Definition: scanf.h:159
#define MAX_LOCALE_LENGTH
Definition: locale.c:28

Referenced by setlocale().

◆ find_best_locale_proc()

static BOOL CALLBACK find_best_locale_proc ( HMODULE  hModule,
LPCSTR  type,
LPCSTR  name,
WORD  LangID,
LONG_PTR  lParam 
)
static

Definition at line 143 of file locale.c.

144{
146 const LCID lcid = MAKELCID(LangID, SORT_DEFAULT);
147 char buff[MAX_ELEM_LEN];
148 unsigned int flags = 0;
149
151 return CONTINUE_LOOKING;
152
153 /* Check Language */
154 if (compare_info(lcid,LOCALE_SISO639LANGNAME,buff,res->search_language, TRUE) ||
155 compare_info(lcid,LOCALE_SABBREVLANGNAME,buff,res->search_language, TRUE) ||
156 compare_info(lcid,LOCALE_SENGLANGUAGE,buff,res->search_language, FALSE))
157 {
158 TRACE(":Found language: %s->%s\n", res->search_language, buff);
160 }
161 else if (res->match_flags & FOUND_LANGUAGE)
162 {
163 return CONTINUE_LOOKING;
164 }
165
166 /* Check Country */
167 if (compare_info(lcid,LOCALE_SISO3166CTRYNAME,buff,res->search_country, TRUE) ||
168 compare_info(lcid,LOCALE_SABBREVCTRYNAME,buff,res->search_country, TRUE) ||
169 compare_info(lcid,LOCALE_SENGCOUNTRY,buff,res->search_country, FALSE))
170 {
171 TRACE("Found country:%s->%s\n", res->search_country, buff);
173 }
174 else if (!flags && (res->match_flags & FOUND_COUNTRY))
175 {
176 return CONTINUE_LOOKING;
177 }
178
179 /* Check codepage */
180 if (compare_info(lcid,LOCALE_IDEFAULTCODEPAGE,buff,res->search_codepage, TRUE) ||
181 (compare_info(lcid,LOCALE_IDEFAULTANSICODEPAGE,buff,res->search_codepage, TRUE)))
182 {
183 TRACE("Found codepage:%s->%s\n", res->search_codepage, buff);
185 memcpy(res->found_codepage,res->search_codepage,MAX_ELEM_LEN);
186 }
187 else if (!flags && (res->match_flags & FOUND_CODEPAGE))
188 {
189 return CONTINUE_LOOKING;
190 }
191
192 if (flags > res->match_flags)
193 {
194 /* Found a better match than previously */
195 res->match_flags = flags;
196 res->found_lang_id = LangID;
197 }
200 {
201 TRACE(":found exact locale match\n");
202 return STOP_LOOKING;
203 }
204 return CONTINUE_LOOKING;
205}
LPARAM lParam
Definition: combotst.c:139
GLuint res
Definition: glext.h:9613
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
#define LANG_NEUTRAL
Definition: nls.h:22
DWORD LCID
Definition: nls.h:13
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define FOUND_LANGUAGE
Definition: locale.c:105
#define FOUND_CODEPAGE
Definition: locale.c:107
static int compare_info(LCID lcid, DWORD flags, char *buff, const char *cmp, BOOL exact)
Definition: locale.c:122
#define STOP_LOOKING
Definition: locale.c:119
#define FOUND_COUNTRY
Definition: locale.c:106
#define CONTINUE_LOOKING
Definition: locale.c:118
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
Definition: wdfusb.h:1083
#define LOCALE_IDEFAULTCODEPAGE
Definition: winnls.h:37
#define LOCALE_SENGLANGUAGE
Definition: winnls.h:27
#define LOCALE_SISO639LANGNAME
Definition: winnls.h:126
#define LOCALE_IDEFAULTANSICODEPAGE
Definition: winnls.h:38
#define LOCALE_SISO3166CTRYNAME
Definition: winnls.h:127
#define LOCALE_SABBREVLANGNAME
Definition: winnls.h:28
#define LOCALE_SENGCOUNTRY
Definition: winnls.h:32
#define LOCALE_SABBREVCTRYNAME
Definition: winnls.h:33

Referenced by MSVCRT_locale_to_LCID().

◆ free_locinfo()

void free_locinfo ( MSVCRT_pthreadlocinfo  locinfo)

Definition at line 643 of file locale.c.

644{
645 int i;
646
647 if(!locinfo)
648 return;
649
650 if(InterlockedDecrement(&locinfo->refcount))
651 return;
652
653 for(i=MSVCRT_LC_MIN+1; i<=MSVCRT_LC_MAX; i++) {
654 MSVCRT_free(locinfo->lc_category[i].locale);
655 MSVCRT_free(locinfo->lc_category[i].refcount);
656 }
657
658 if(locinfo->lconv) {
659 MSVCRT_free(locinfo->lconv->decimal_point);
660 MSVCRT_free(locinfo->lconv->thousands_sep);
661 MSVCRT_free(locinfo->lconv->grouping);
662 MSVCRT_free(locinfo->lconv->int_curr_symbol);
663 MSVCRT_free(locinfo->lconv->currency_symbol);
664 MSVCRT_free(locinfo->lconv->mon_decimal_point);
665 MSVCRT_free(locinfo->lconv->mon_thousands_sep);
666 MSVCRT_free(locinfo->lconv->mon_grouping);
667 MSVCRT_free(locinfo->lconv->positive_sign);
668 MSVCRT_free(locinfo->lconv->negative_sign);
669 }
670 MSVCRT_free(locinfo->lconv_intl_refcount);
671 MSVCRT_free(locinfo->lconv_num_refcount);
672 MSVCRT_free(locinfo->lconv_mon_refcount);
673 MSVCRT_free(locinfo->lconv);
674
675 MSVCRT_free(locinfo->ctype1_refcount);
676 MSVCRT_free(locinfo->ctype1);
677
678 MSVCRT_free(locinfo->pclmap);
679 MSVCRT_free(locinfo->pcumap);
680
681 MSVCRT_free(locinfo->lc_time_curr);
682
684}
#define InterlockedDecrement
Definition: armddk.h:52

Referenced by _configthreadlocale(), and MSVCRT__free_locale().

◆ free_mbcinfo()

void free_mbcinfo ( MSVCRT_pthreadmbcinfo  mbcinfo)

Definition at line 687 of file locale.c.

688{
689 if(!mbcinfo)
690 return;
691
692 if(InterlockedDecrement(&mbcinfo->refcount))
693 return;
694
695 MSVCRT_free(mbcinfo);
696}

Referenced by _configthreadlocale(), and MSVCRT__free_locale().

◆ get_locinfo()

MSVCRT_pthreadlocinfo get_locinfo ( void  )

Definition at line 356 of file locale.c.

356 {
358
359 if(!data || !data->have_locale)
360 return MSVCRT_locale->locinfo;
361
362 return data->locinfo;
363}

Referenced by ___lc_collate_cp_func(), __p__pctype(), __pctype_func(), _Getdays(), _Getmonths(), _Gettnames(), localeconv(), MSVCRT__get_current_locale(), MSVCRT_btowc(), and setlocale().

◆ get_mbcinfo()

◆ localeconv()

struct lconv *CDECL localeconv ( void  )

Definition at line 603 of file locale.c.

604{
605 return (struct lconv*)get_locinfo()->lconv;
606}
struct MSVCRT_lconv * lconv
Definition: msvcrt.h:128
Definition: locale.h:29

Referenced by ftoes(), and ftofs().

◆ MSVCRT__create_locale()

MSVCRT__locale_t CDECL MSVCRT__create_locale ( int  category,
const char locale 
)

Definition at line 724 of file locale.c.

725{
726 static const DWORD time_data[] = {
742 };
743 static const char collate[] = "COLLATE=";
744 static const char ctype[] = "CTYPE=";
745 static const char monetary[] = "MONETARY=";
746 static const char numeric[] = "NUMERIC=";
747 static const char time[] = "TIME=";
748 static const char cloc_short_date[] = "MM/dd/yy";
749 static const wchar_t cloc_short_dateW[] = {'M','M','/','d','d','/','y','y',0};
750 static const char cloc_long_date[] = "dddd, MMMM dd, yyyy";
751 static const wchar_t cloc_long_dateW[] = {'d','d','d','d',',',' ','M','M','M','M',' ','d','d',',',' ','y','y','y','y',0};
752 static const char cloc_time[] = "HH:mm:ss";
753 static const wchar_t cloc_timeW[] = {'H','H',':','m','m',':','s','s',0};
754
756 LCID lcid[6] = { 0 }, lcid_tmp;
757 unsigned short cp[6] = { 0 };
758 char buf[256];
759 int i, ret, size;
760
761 TRACE("(%d %s)\n", category, locale);
762
764 return NULL;
765
766 if(locale[0]=='C' && !locale[1]) {
767 lcid[0] = 0;
768 cp[0] = CP_ACP;
769 } else if(!locale[0]) {
770 lcid[0] = GetSystemDefaultLCID();
772 |LOCALE_NOUSEROVERRIDE, buf, sizeof(buf));
773 cp[0] = atoi(buf);
774
775 for(i=1; i<6; i++) {
776 lcid[i] = lcid[0];
777 cp[i] = cp[0];
778 }
779 } else if (locale[0] == 'L' && locale[1] == 'C' && locale[2] == '_') {
780 const char *p;
781
782 while(1) {
783 locale += 3; /* LC_ */
784 if(!memcmp(locale, collate, sizeof(collate)-1)) {
786 locale += sizeof(collate)-1;
787 } else if(!memcmp(locale, ctype, sizeof(ctype)-1)) {
789 locale += sizeof(ctype)-1;
790 } else if(!memcmp(locale, monetary, sizeof(monetary)-1)) {
792 locale += sizeof(monetary)-1;
793 } else if(!memcmp(locale, numeric, sizeof(numeric)-1)) {
795 locale += sizeof(numeric)-1;
796 } else if(!memcmp(locale, time, sizeof(time)-1)) {
798 locale += sizeof(time)-1;
799 } else
800 return NULL;
801
802 p = strchr(locale, ';');
803 if(locale[0]=='C' && (locale[1]==';' || locale[1]=='\0')) {
804 lcid[i] = 0;
805 cp[i] = CP_ACP;
806 } else if(p) {
808 buf[p-locale] = '\0';
809 lcid[i] = MSVCRT_locale_to_LCID(buf, &cp[i]);
810 } else
811 lcid[i] = MSVCRT_locale_to_LCID(locale, &cp[i]);
812
813 if(lcid[i] == -1)
814 return NULL;
815
816 if(!p || *(p+1)!='L' || *(p+2)!='C' || *(p+3)!='_')
817 break;
818
819 locale = p+1;
820 }
821 } else {
822 lcid[0] = MSVCRT_locale_to_LCID(locale, &cp[0]);
823 if(lcid[0] == -1)
824 return NULL;
825
826 for(i=1; i<6; i++) {
827 lcid[i] = lcid[0];
828 cp[i] = cp[0];
829 }
830 }
831
833 if(!loc)
834 return NULL;
835
837 if(!loc->locinfo) {
838 MSVCRT_free(loc);
839 return NULL;
840 }
841
843 if(!loc->mbcinfo) {
844 MSVCRT_free(loc->locinfo);
845 MSVCRT_free(loc);
846 return NULL;
847 }
848
849 memset(loc->locinfo, 0, sizeof(MSVCRT_threadlocinfo));
850 loc->locinfo->refcount = 1;
851 loc->mbcinfo->refcount = 1;
852
853 loc->locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv));
854 if(!loc->locinfo->lconv) {
856 return NULL;
857 }
858 memset(loc->locinfo->lconv, 0, sizeof(struct MSVCRT_lconv));
859
860 loc->locinfo->pclmap = MSVCRT_malloc(sizeof(char[256]));
861 loc->locinfo->pcumap = MSVCRT_malloc(sizeof(char[256]));
862 if(!loc->locinfo->pclmap || !loc->locinfo->pcumap) {
864 return NULL;
865 }
866
870 return NULL;
871 }
872
874 } else
875 loc->locinfo->lc_category[LC_COLLATE].locale = _strdup("C");
876
879 int j;
880
883 return NULL;
884 }
885
887 loc->locinfo->lc_clike = 1;
888 if(!GetCPInfo(loc->locinfo->lc_codepage, &cp_info)) {
890 return NULL;
891 }
892 loc->locinfo->mb_cur_max = cp_info.MaxCharSize;
893
894 loc->locinfo->ctype1_refcount = MSVCRT_malloc(sizeof(int));
895 loc->locinfo->ctype1 = MSVCRT_malloc(sizeof(short[257]));
896 if(!loc->locinfo->ctype1_refcount || !loc->locinfo->ctype1) {
898 return NULL;
899 }
900
901 *loc->locinfo->ctype1_refcount = 1;
902 loc->locinfo->ctype1[0] = 0;
903 loc->locinfo->pctype = loc->locinfo->ctype1+1;
904
905 buf[1] = buf[2] = '\0';
906 for(i=1; i<257; i++) {
907 buf[0] = i-1;
908
909 /* builtin GetStringTypeA doesn't set output to 0 on invalid input */
910 loc->locinfo->ctype1[i] = 0;
911
913 1, loc->locinfo->ctype1+i);
914 }
915
916 for(i=0; cp_info.LeadByte[i+1]!=0; i+=2)
917 for(j=cp_info.LeadByte[i]; j<=cp_info.LeadByte[i+1]; j++)
918 loc->locinfo->ctype1[j+1] |= _LEADBYTE;
919 } else {
920 loc->locinfo->lc_clike = 1;
921 loc->locinfo->mb_cur_max = 1;
922 loc->locinfo->pctype = _ctype+1;
923 loc->locinfo->lc_category[LC_CTYPE].locale = _strdup("C");
924 }
925
926 for(i=0; i<256; i++) {
927 if(loc->locinfo->pctype[i] & _LEADBYTE)
928 buf[i] = ' ';
929 else
930 buf[i] = i;
931
932 }
933
934 if(lcid[MSVCRT_LC_CTYPE]) {
936 (char*)loc->locinfo->pclmap, 256);
938 (char*)loc->locinfo->pcumap, 256);
939 } else {
940 for(i=0; i<256; i++) {
941 loc->locinfo->pclmap[i] = (i>='A' && i<='Z' ? i-'A'+'a' : i);
942 loc->locinfo->pcumap[i] = (i>='a' && i<='z' ? i-'a'+'A' : i);
943 }
944 }
945
947
951 return NULL;
952 }
953
954 loc->locinfo->lconv_intl_refcount = MSVCRT_malloc(sizeof(int));
955 loc->locinfo->lconv_mon_refcount = MSVCRT_malloc(sizeof(int));
958 return NULL;
959 }
960
961 *loc->locinfo->lconv_intl_refcount = 1;
962 *loc->locinfo->lconv_mon_refcount = 1;
963
966 if(i && (loc->locinfo->lconv->int_curr_symbol = MSVCRT_malloc(i)))
967 memcpy(loc->locinfo->lconv->int_curr_symbol, buf, i);
968 else {
970 return NULL;
971 }
972
975 if(i && (loc->locinfo->lconv->currency_symbol = MSVCRT_malloc(i)))
976 memcpy(loc->locinfo->lconv->currency_symbol, buf, i);
977 else {
979 return NULL;
980 }
981
984 if(i && (loc->locinfo->lconv->mon_decimal_point = MSVCRT_malloc(i)))
985 memcpy(loc->locinfo->lconv->mon_decimal_point, buf, i);
986 else {
988 return NULL;
989 }
990
993 if(i && (loc->locinfo->lconv->mon_thousands_sep = MSVCRT_malloc(i)))
994 memcpy(loc->locinfo->lconv->mon_thousands_sep, buf, i);
995 else {
997 return NULL;
998 }
999
1001 |LOCALE_NOUSEROVERRIDE, buf, 256);
1002 if(i>1)
1003 i = i/2 + (buf[i-2]=='0'?0:1);
1004 if(i && (loc->locinfo->lconv->mon_grouping = MSVCRT_malloc(i))) {
1005 for(i=0; buf[i+1]==';'; i+=2)
1006 loc->locinfo->lconv->mon_grouping[i/2] = buf[i]-'0';
1007 loc->locinfo->lconv->mon_grouping[i/2] = buf[i]-'0';
1008 if(buf[i] != '0')
1009 loc->locinfo->lconv->mon_grouping[i/2+1] = 127;
1010 } else {
1012 return NULL;
1013 }
1014
1016 |LOCALE_NOUSEROVERRIDE, buf, 256);
1017 if(i && (loc->locinfo->lconv->positive_sign = MSVCRT_malloc(i)))
1018 memcpy(loc->locinfo->lconv->positive_sign, buf, i);
1019 else {
1021 return NULL;
1022 }
1023
1025 |LOCALE_NOUSEROVERRIDE, buf, 256);
1026 if(i && (loc->locinfo->lconv->negative_sign = MSVCRT_malloc(i)))
1027 memcpy(loc->locinfo->lconv->negative_sign, buf, i);
1028 else {
1030 return NULL;
1031 }
1032
1034 |LOCALE_NOUSEROVERRIDE, buf, 256))
1035 loc->locinfo->lconv->int_frac_digits = atoi(buf);
1036 else {
1038 return NULL;
1039 }
1040
1042 |LOCALE_NOUSEROVERRIDE, buf, 256))
1043 loc->locinfo->lconv->frac_digits = atoi(buf);
1044 else {
1046 return NULL;
1047 }
1048
1050 |LOCALE_NOUSEROVERRIDE, buf, 256))
1051 loc->locinfo->lconv->p_cs_precedes = atoi(buf);
1052 else {
1054 return NULL;
1055 }
1056
1058 |LOCALE_NOUSEROVERRIDE, buf, 256))
1059 loc->locinfo->lconv->p_sep_by_space = atoi(buf);
1060 else {
1062 return NULL;
1063 }
1064
1066 |LOCALE_NOUSEROVERRIDE, buf, 256))
1067 loc->locinfo->lconv->n_cs_precedes = atoi(buf);
1068 else {
1070 return NULL;
1071 }
1072
1074 |LOCALE_NOUSEROVERRIDE, buf, 256))
1075 loc->locinfo->lconv->n_sep_by_space = atoi(buf);
1076 else {
1078 return NULL;
1079 }
1080
1082 |LOCALE_NOUSEROVERRIDE, buf, 256))
1083 loc->locinfo->lconv->p_sign_posn = atoi(buf);
1084 else {
1086 return NULL;
1087 }
1088
1090 |LOCALE_NOUSEROVERRIDE, buf, 256))
1091 loc->locinfo->lconv->n_sign_posn = atoi(buf);
1092 else {
1094 return NULL;
1095 }
1096 } else {
1097 loc->locinfo->lconv->int_curr_symbol = MSVCRT_malloc(sizeof(char));
1098 loc->locinfo->lconv->currency_symbol = MSVCRT_malloc(sizeof(char));
1099 loc->locinfo->lconv->mon_decimal_point = MSVCRT_malloc(sizeof(char));
1100 loc->locinfo->lconv->mon_thousands_sep = MSVCRT_malloc(sizeof(char));
1101 loc->locinfo->lconv->mon_grouping = MSVCRT_malloc(sizeof(char));
1102 loc->locinfo->lconv->positive_sign = MSVCRT_malloc(sizeof(char));
1103 loc->locinfo->lconv->negative_sign = MSVCRT_malloc(sizeof(char));
1104
1105 if(!loc->locinfo->lconv->int_curr_symbol || !loc->locinfo->lconv->currency_symbol
1106 || !loc->locinfo->lconv->mon_decimal_point || !loc->locinfo->lconv->mon_thousands_sep
1107 || !loc->locinfo->lconv->mon_grouping || !loc->locinfo->lconv->positive_sign
1108 || !loc->locinfo->lconv->negative_sign) {
1110 return NULL;
1111 }
1112
1113 loc->locinfo->lconv->int_curr_symbol[0] = '\0';
1114 loc->locinfo->lconv->currency_symbol[0] = '\0';
1115 loc->locinfo->lconv->mon_decimal_point[0] = '\0';
1116 loc->locinfo->lconv->mon_thousands_sep[0] = '\0';
1117 loc->locinfo->lconv->mon_grouping[0] = '\0';
1118 loc->locinfo->lconv->positive_sign[0] = '\0';
1119 loc->locinfo->lconv->negative_sign[0] = '\0';
1120 loc->locinfo->lconv->int_frac_digits = 127;
1121 loc->locinfo->lconv->frac_digits = 127;
1122 loc->locinfo->lconv->p_cs_precedes = 127;
1123 loc->locinfo->lconv->p_sep_by_space = 127;
1124 loc->locinfo->lconv->n_cs_precedes = 127;
1125 loc->locinfo->lconv->n_sep_by_space = 127;
1126 loc->locinfo->lconv->p_sign_posn = 127;
1127 loc->locinfo->lconv->n_sign_posn = 127;
1128
1129 loc->locinfo->lc_category[LC_MONETARY].locale = _strdup("C");
1130 }
1131
1135 return NULL;
1136 }
1137
1138 if(!loc->locinfo->lconv_intl_refcount)
1139 loc->locinfo->lconv_intl_refcount = MSVCRT_malloc(sizeof(int));
1140 loc->locinfo->lconv_num_refcount = MSVCRT_malloc(sizeof(int));
1143 return NULL;
1144 }
1145
1146 *loc->locinfo->lconv_intl_refcount = 1;
1147 *loc->locinfo->lconv_num_refcount = 1;
1148
1150 |LOCALE_NOUSEROVERRIDE, buf, 256);
1151 if(i && (loc->locinfo->lconv->decimal_point = MSVCRT_malloc(i)))
1152 memcpy(loc->locinfo->lconv->decimal_point, buf, i);
1153 else {
1155 return NULL;
1156 }
1157
1159 |LOCALE_NOUSEROVERRIDE, buf, 256);
1160 if(i && (loc->locinfo->lconv->thousands_sep = MSVCRT_malloc(i)))
1161 memcpy(loc->locinfo->lconv->thousands_sep, buf, i);
1162 else {
1164 return NULL;
1165 }
1166
1168 |LOCALE_NOUSEROVERRIDE, buf, 256);
1169 if(i>1)
1170 i = i/2 + (buf[i-2]=='0'?0:1);
1171 if(i && (loc->locinfo->lconv->grouping = MSVCRT_malloc(i))) {
1172 for(i=0; buf[i+1]==';'; i+=2)
1173 loc->locinfo->lconv->grouping[i/2] = buf[i]-'0';
1174 loc->locinfo->lconv->grouping[i/2] = buf[i]-'0';
1175 if(buf[i] != '0')
1176 loc->locinfo->lconv->grouping[i/2+1] = 127;
1177 } else {
1179 return NULL;
1180 }
1181 } else {
1182 loc->locinfo->lconv->decimal_point = MSVCRT_malloc(sizeof(char[2]));
1183 loc->locinfo->lconv->thousands_sep = MSVCRT_malloc(sizeof(char));
1184 loc->locinfo->lconv->grouping = MSVCRT_malloc(sizeof(char));
1185 if(!loc->locinfo->lconv->decimal_point || !loc->locinfo->lconv->thousands_sep
1186 || !loc->locinfo->lconv->grouping) {
1188 return NULL;
1189 }
1190
1191 loc->locinfo->lconv->decimal_point[0] = '.';
1192 loc->locinfo->lconv->decimal_point[1] = '\0';
1193 loc->locinfo->lconv->thousands_sep[0] = '\0';
1194 loc->locinfo->lconv->grouping[0] = '\0';
1195
1196 loc->locinfo->lc_category[LC_NUMERIC].locale = _strdup("C");
1197 }
1198
1202 return NULL;
1203 }
1204 } else
1205 loc->locinfo->lc_category[LC_TIME].locale = _strdup("C");
1206
1207 size = sizeof(MSVCRT___lc_time_data);
1208 lcid_tmp = lcid[MSVCRT_LC_TIME] ? lcid[MSVCRT_LC_TIME] : MAKELCID(LANG_ENGLISH, SORT_DEFAULT);
1209 for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) {
1210 if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
1211 size += sizeof(cloc_short_date) + sizeof(cloc_short_dateW);
1212 }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
1213 size += sizeof(cloc_long_date) + sizeof(cloc_long_dateW);
1214 }else {
1215 ret = GetLocaleInfoA(lcid_tmp, time_data[i]
1217 if(!ret) {
1219 return NULL;
1220 }
1221 size += ret;
1222
1223 ret = GetLocaleInfoW(lcid_tmp, time_data[i]
1225 if(!ret) {
1227 return NULL;
1228 }
1229 size += ret*sizeof(wchar_t);
1230 }
1231 }
1232
1234 if(!loc->locinfo->lc_time_curr) {
1236 return NULL;
1237 }
1238
1239 ret = 0;
1240 for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) {
1241 loc->locinfo->lc_time_curr->str.str[i] = &loc->locinfo->lc_time_curr->data[ret];
1242 if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
1243 memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_short_date, sizeof(cloc_short_date));
1244 ret += sizeof(cloc_short_date);
1245 }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
1246 memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_long_date, sizeof(cloc_long_date));
1247 ret += sizeof(cloc_long_date);
1248 }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid[MSVCRT_LC_TIME]) {
1249 memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_time, sizeof(cloc_time));
1250 ret += sizeof(cloc_time);
1251 }else {
1252 ret += GetLocaleInfoA(lcid_tmp, time_data[i]|LOCALE_NOUSEROVERRIDE,
1253 &loc->locinfo->lc_time_curr->data[ret], size-ret);
1254 }
1255 }
1256 for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) {
1257 loc->locinfo->lc_time_curr->wstr[i] = (wchar_t*)&loc->locinfo->lc_time_curr->data[ret];
1258 if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
1259 memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_short_dateW, sizeof(cloc_short_dateW));
1260 ret += sizeof(cloc_short_dateW);
1261 }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
1262 memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_long_dateW, sizeof(cloc_long_dateW));
1263 ret += sizeof(cloc_long_dateW);
1264 }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid[MSVCRT_LC_TIME]) { memcpy(&loc->locinfo->lc_time_curr->data[ret], cloc_timeW, sizeof(cloc_timeW));
1265 ret += sizeof(cloc_timeW);
1266 }else {
1267 ret += GetLocaleInfoW(lcid_tmp, time_data[i]|LOCALE_NOUSEROVERRIDE,
1268 (wchar_t*)&loc->locinfo->lc_time_curr->data[ret], size-ret)*sizeof(wchar_t);
1269 }
1270 }
1271 loc->locinfo->lc_time_curr->lcid = lcid[MSVCRT_LC_TIME];
1272
1273 return loc;
1274}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
char * strchr(const char *String, int ch)
Definition: utclib.c:501
Definition: _ctype.h:58
#define _strdup
Definition: debug_ros.c:7
#define CP_ACP
Definition: compat.h:109
BOOL WINAPI GetStringTypeA(LCID locale, DWORD type, LPCSTR src, INT count, LPWORD chartype)
Definition: locale.c:3209
BOOL WINAPI GetCPInfo(UINT codepage, LPCPINFO cpinfo)
Definition: locale.c:2144
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1230
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define _LEADBYTE
Definition: ctype.h:75
#define LC_CTYPE
Definition: locale.h:19
#define LC_NUMERIC
Definition: locale.h:21
#define LC_MONETARY
Definition: locale.h:20
#define LC_TIME
Definition: locale.h:22
#define LC_COLLATE
Definition: locale.h:18
POINT cp
Definition: magnifier.c:59
__u16 time
Definition: mkdosfs.c:8
int _setmbcp_l(int, LCID, MSVCRT_pthreadmbcinfo)
Definition: _setmbcp.c:52
#define MSVCRT_LC_ALL
Definition: msvcrt.h:650
#define LANG_ENGLISH
Definition: nls.h:52
const unsigned short _ctype[257]
Definition: ctype.c:36
void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale)
Definition: locale.c:713
int atoi(const char *)
static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp, MSVCRT__locale_t loc, int category)
Definition: locale.c:291
LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
Definition: locale.c:210
#define memset(x, y, z)
Definition: compat.h:39
MSVCRT_pthreadmbcinfo mbcinfo
Definition: msvcrt.h:153
MSVCRT_pthreadlocinfo locinfo
Definition: msvcrt.h:152
unsigned short wCodePage
Definition: msvcrt.h:108
MSVCRT_LC_ID lc_id[6]
Definition: msvcrt.h:116
unsigned int lc_codepage
Definition: msvcrt.h:113
unsigned char * pclmap
Definition: msvcrt.h:132
struct MSVCRT_threadlocaleinfostruct::@1683 lc_category[6]
unsigned char * pcumap
Definition: msvcrt.h:133
unsigned short * ctype1
Definition: msvcrt.h:130
#define wchar_t
Definition: wchar.h:102
#define LOCALE_SABBREVMONTHNAME10
Definition: winnls.h:113
#define LOCALE_SMONTHNAME12
Definition: winnls.h:102
#define LOCALE_ICURRDIGITS
Definition: winnls.h:54
#define LOCALE_SMONTHNAME5
Definition: winnls.h:95
#define LOCALE_SDAYNAME5
Definition: winnls.h:81
#define LOCALE_SABBREVMONTHNAME9
Definition: winnls.h:112
#define LOCALE_SABBREVMONTHNAME11
Definition: winnls.h:114
#define LOCALE_SABBREVDAYNAME5
Definition: winnls.h:88
#define LOCALE_SABBREVDAYNAME2
Definition: winnls.h:85
#define LOCALE_INEGSEPBYSPACE
Definition: winnls.h:124
#define LOCALE_SABBREVMONTHNAME2
Definition: winnls.h:105
#define LOCALE_INEGSIGNPOSN
Definition: winnls.h:120
#define LOCALE_SGROUPING
Definition: winnls.h:44
#define LOCALE_SMONTHNAME3
Definition: winnls.h:93
#define LOCALE_SDECIMAL
Definition: winnls.h:42
#define LOCALE_SMONTHNAME11
Definition: winnls.h:101
#define LOCALE_SMONTHNAME8
Definition: winnls.h:98
#define CT_CTYPE1
Definition: winnls.h:237
#define LOCALE_SMONTHNAME4
Definition: winnls.h:94
#define LOCALE_SDAYNAME1
Definition: winnls.h:77
#define LCMAP_UPPERCASE
Definition: winnls.h:185
#define LOCALE_SLONGDATE
Definition: winnls.h:61
#define LOCALE_SMONTHNAME7
Definition: winnls.h:97
#define LOCALE_IINTLCURRDIGITS
Definition: winnls.h:55
#define LOCALE_S1159
Definition: winnls.h:71
#define LOCALE_SSHORTDATE
Definition: winnls.h:60
#define LOCALE_IPOSSYMPRECEDES
Definition: winnls.h:121
#define LOCALE_SABBREVMONTHNAME4
Definition: winnls.h:107
#define LOCALE_SPOSITIVESIGN
Definition: winnls.h:117
#define LOCALE_SABBREVDAYNAME4
Definition: winnls.h:87
#define LOCALE_SMONDECIMALSEP
Definition: winnls.h:51
#define LCMAP_LOWERCASE
Definition: winnls.h:184
#define LOCALE_SMONTHNAME1
Definition: winnls.h:91
#define LOCALE_SABBREVMONTHNAME3
Definition: winnls.h:106
#define LOCALE_INEGSYMPRECEDES
Definition: winnls.h:123
#define LOCALE_SMONTHOUSANDSEP
Definition: winnls.h:52
#define LOCALE_SDAYNAME7
Definition: winnls.h:83
#define LOCALE_IPOSSIGNPOSN
Definition: winnls.h:119
#define LOCALE_SDAYNAME2
Definition: winnls.h:78
#define LOCALE_SABBREVMONTHNAME1
Definition: winnls.h:104
#define LOCALE_STHOUSAND
Definition: winnls.h:43
#define LOCALE_SABBREVDAYNAME6
Definition: winnls.h:89
#define LOCALE_SMONTHNAME2
Definition: winnls.h:92
#define LOCALE_STIMEFORMAT
Definition: winnls.h:62
#define LOCALE_SABBREVDAYNAME1
Definition: winnls.h:84
#define LOCALE_SABBREVMONTHNAME6
Definition: winnls.h:109
#define LOCALE_SMONTHNAME6
Definition: winnls.h:96
#define LOCALE_SNEGATIVESIGN
Definition: winnls.h:118
#define LOCALE_SDAYNAME3
Definition: winnls.h:79
#define LOCALE_S2359
Definition: winnls.h:72
#define LOCALE_SABBREVDAYNAME3
Definition: winnls.h:86
#define LOCALE_SABBREVMONTHNAME5
Definition: winnls.h:108
#define LOCALE_SABBREVMONTHNAME7
Definition: winnls.h:110
#define LOCALE_SINTLSYMBOL
Definition: winnls.h:50
#define LOCALE_SABBREVMONTHNAME8
Definition: winnls.h:111
#define LOCALE_SMONGROUPING
Definition: winnls.h:53
#define LOCALE_SDAYNAME4
Definition: winnls.h:80
#define LOCALE_SCURRENCY
Definition: winnls.h:49
#define LOCALE_SMONTHNAME10
Definition: winnls.h:100
#define LOCALE_SMONTHNAME9
Definition: winnls.h:99
#define LOCALE_IPOSSEPBYSPACE
Definition: winnls.h:122
#define LOCALE_SABBREVMONTHNAME12
Definition: winnls.h:115
#define LOCALE_SDAYNAME6
Definition: winnls.h:82
#define LOCALE_SABBREVDAYNAME7
Definition: winnls.h:90

Referenced by __init_global_locale(), _configthreadlocale(), and setlocale().

◆ MSVCRT__free_locale()

void CDECL MSVCRT__free_locale ( MSVCRT__locale_t  locale)

Definition at line 713 of file locale.c.

714{
715 if (!locale)
716 return;
717
718 free_locinfo(locale->locinfo);
719 free_mbcinfo(locale->mbcinfo);
721}

Referenced by DllMain(), MSVCRT__create_locale(), msvcrt_init_exception(), and setlocale().

◆ MSVCRT__get_current_locale()

MSVCRT__locale_t CDECL MSVCRT__get_current_locale ( void  )

Definition at line 699 of file locale.c.

700{
702 if(!loc)
703 return NULL;
704
705 loc->locinfo = get_locinfo();
706 loc->mbcinfo = get_mbcinfo();
709 return loc;
710}
#define InterlockedIncrement
Definition: armddk.h:53

◆ MSVCRT_btowc()

wint_t CDECL MSVCRT_btowc ( int  c)

Definition at line 573 of file locale.c.

574{
575 unsigned char letter = c;
576 wchar_t ret;
577
578 if(!MultiByteToWideChar(get_locinfo()->lc_handle[LC_CTYPE],
579 0, (LPCSTR)&letter, 1, &ret, 1))
580 return 0;
581
582 return ret;
583}
#define MultiByteToWideChar
Definition: compat.h:110
#define c
Definition: ke_i.h:80
const char * LPCSTR
Definition: xmlstorage.h:183

◆ MSVCRT_locale_to_LCID()

LCID MSVCRT_locale_to_LCID ( const char locale,
unsigned short codepage 
)

Definition at line 210 of file locale.c.

211{
212 LCID lcid;
214 const char *cp, *region;
215
216 memset(&search, 0, sizeof(locale_search_t));
217
218 cp = strchr(locale, '.');
219 region = strchr(locale, '_');
220
221 lstrcpynA(search.search_language, locale, MAX_ELEM_LEN);
222 if(region) {
223 lstrcpynA(search.search_country, region+1, MAX_ELEM_LEN);
224 if(region-locale < MAX_ELEM_LEN)
225 search.search_language[region-locale] = '\0';
226 } else
227 search.search_country[0] = '\0';
228
229 if(cp) {
230 lstrcpynA(search.search_codepage, cp+1, MAX_ELEM_LEN);
231 if(region && cp-region-1<MAX_ELEM_LEN)
232 search.search_country[cp-region-1] = '\0';
234 search.search_language[cp-locale] = '\0';
235 } else
236 search.search_codepage[0] = '\0';
237
238 if(!search.search_country[0] && !search.search_codepage[0])
239 remap_synonym(search.search_language);
240
243 (LONG_PTR)&search);
244
245 if (!search.match_flags)
246 return -1;
247
248 /* If we were given something that didn't match, fail */
249 if (search.search_country[0] && !(search.match_flags & FOUND_COUNTRY))
250 return -1;
251
252 lcid = MAKELCID(search.found_lang_id, SORT_DEFAULT);
253
254 /* Populate partial locale, translating LCID to locale string elements */
255 if (!(search.match_flags & FOUND_CODEPAGE)) {
256 /* Even if a codepage is not enumerated for a locale
257 * it can be set if valid */
258 if (search.search_codepage[0]) {
259 if (IsValidCodePage(atoi(search.search_codepage)))
260 memcpy(search.found_codepage,search.search_codepage,MAX_ELEM_LEN);
261 else {
262 /* Special codepage values: OEM & ANSI */
263 if (!strcasecmp(search.search_codepage,"OCP")) {
265 search.found_codepage, MAX_ELEM_LEN);
266 } else if (!strcasecmp(search.search_codepage,"ACP")) {
268 search.found_codepage, MAX_ELEM_LEN);
269 } else
270 return -1;
271
272 if (!atoi(search.found_codepage))
273 return -1;
274 }
275 } else {
276 /* Prefer ANSI codepages if present */
278 search.found_codepage, MAX_ELEM_LEN);
279 if (!search.found_codepage[0] || !atoi(search.found_codepage))
281 search.found_codepage, MAX_ELEM_LEN);
282 }
283 }
284 if (codepage)
285 *codepage = atoi(search.found_codepage);
286
287 return lcid;
288}
#define lstrcpynA
Definition: compat.h:751
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
BOOL WINAPI EnumResourceLanguagesA(HMODULE hmod, LPCSTR type, LPCSTR name, ENUMRESLANGPROCA lpfun, LONG_PTR lparam)
Definition: res.c:428
BOOL WINAPI IsValidCodePage(UINT codepage)
Definition: locale.c:2079
static short search(int val, const short *table, int size)
Definition: msg711.c:255
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define RT_STRING
Definition: pedump.c:368
static void remap_synonym(char *name)
Definition: locale.c:90
static BOOL CALLBACK find_best_locale_proc(HMODULE hModule, LPCSTR type, LPCSTR name, WORD LangID, LONG_PTR lParam)
Definition: locale.c:143
#define LOCALE_ILANGUAGE
Definition: winnls.h:25
char * LPSTR
Definition: xmlstorage.h:182

Referenced by MSVCRT__create_locale().

◆ remap_synonym()

static void remap_synonym ( char name)
static

Definition at line 90 of file locale.c.

91{
92 unsigned int i;
93 for (i = 0; i < sizeof(_country_synonyms)/sizeof(char*); i += 2 )
94 {
96 {
97 TRACE(":Mapping synonym %s to %s\n",name,_country_synonyms[i+1]);
99 return;
100 }
101 }
102}
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
static const char *const _country_synonyms[]
Definition: locale.c:52
Definition: name.c:39

Referenced by MSVCRT_locale_to_LCID().

◆ setlocale()

char *CDECL setlocale ( int  category,
const char locale 
)

Definition at line 1279 of file locale.c.

1280{
1281 MSVCRT__locale_t loc;
1283
1285 return NULL;
1286
1287 if(!locale) {
1288 if(category == MSVCRT_LC_ALL)
1289 return construct_lc_all(locinfo);
1290
1291 return locinfo->lc_category[category].locale;
1292 }
1293
1295 if(!loc) {
1296 WARN("%d %s failed\n", category, locale);
1297 return NULL;
1298 }
1299
1301
1302 switch(category) {
1303 case MSVCRT_LC_ALL:
1304 case MSVCRT_LC_COLLATE:
1305 locinfo->lc_collate_cp = loc->locinfo->lc_collate_cp;
1306 locinfo->lc_handle[MSVCRT_LC_COLLATE] =
1308 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_COLLATE].locale,
1309 (void**)&loc->locinfo->lc_category[MSVCRT_LC_COLLATE].locale);
1310 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_COLLATE].refcount,
1311 (void**)&loc->locinfo->lc_category[MSVCRT_LC_COLLATE].refcount);
1312
1313 if(category != MSVCRT_LC_ALL)
1314 break;
1315 /* fall through */
1316 case MSVCRT_LC_CTYPE:
1317 locinfo->lc_handle[MSVCRT_LC_CTYPE] =
1319 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_CTYPE].locale,
1320 (void**)&loc->locinfo->lc_category[MSVCRT_LC_CTYPE].locale);
1321 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_CTYPE].refcount,
1322 (void**)&loc->locinfo->lc_category[MSVCRT_LC_CTYPE].refcount);
1323
1324 locinfo->lc_codepage = loc->locinfo->lc_codepage;
1325 locinfo->lc_clike = loc->locinfo->lc_clike;
1326 locinfo->mb_cur_max = loc->locinfo->mb_cur_max;
1327
1328 swap_pointers((void**)&locinfo->ctype1_refcount,
1329 (void**)&loc->locinfo->ctype1_refcount);
1330 swap_pointers((void**)&locinfo->ctype1, (void**)&loc->locinfo->ctype1);
1331 swap_pointers((void**)&locinfo->pctype, (void**)&loc->locinfo->pctype);
1332 swap_pointers((void**)&locinfo->pclmap, (void**)&loc->locinfo->pclmap);
1333 swap_pointers((void**)&locinfo->pcumap, (void**)&loc->locinfo->pcumap);
1334
1335 if(category != MSVCRT_LC_ALL)
1336 break;
1337 /* fall through */
1338 case MSVCRT_LC_MONETARY:
1339 locinfo->lc_handle[MSVCRT_LC_MONETARY] =
1341 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_MONETARY].locale,
1342 (void**)&loc->locinfo->lc_category[MSVCRT_LC_MONETARY].locale);
1343 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_MONETARY].refcount,
1344 (void**)&loc->locinfo->lc_category[MSVCRT_LC_MONETARY].refcount);
1345
1346 swap_pointers((void**)&locinfo->lconv->int_curr_symbol,
1347 (void**)&loc->locinfo->lconv->int_curr_symbol);
1348 swap_pointers((void**)&locinfo->lconv->currency_symbol,
1349 (void**)&loc->locinfo->lconv->currency_symbol);
1350 swap_pointers((void**)&locinfo->lconv->mon_decimal_point,
1351 (void**)&loc->locinfo->lconv->mon_decimal_point);
1352 swap_pointers((void**)&locinfo->lconv->mon_thousands_sep,
1353 (void**)&loc->locinfo->lconv->mon_thousands_sep);
1354 swap_pointers((void**)&locinfo->lconv->mon_grouping,
1355 (void**)&loc->locinfo->lconv->mon_grouping);
1356 swap_pointers((void**)&locinfo->lconv->positive_sign,
1357 (void**)&loc->locinfo->lconv->positive_sign);
1358 swap_pointers((void**)&locinfo->lconv->negative_sign,
1359 (void**)&loc->locinfo->lconv->negative_sign);
1360 locinfo->lconv->int_frac_digits = loc->locinfo->lconv->int_frac_digits;
1361 locinfo->lconv->frac_digits = loc->locinfo->lconv->frac_digits;
1362 locinfo->lconv->p_cs_precedes = loc->locinfo->lconv->p_cs_precedes;
1363 locinfo->lconv->p_sep_by_space = loc->locinfo->lconv->p_sep_by_space;
1364 locinfo->lconv->n_cs_precedes = loc->locinfo->lconv->n_cs_precedes;
1365 locinfo->lconv->n_sep_by_space = loc->locinfo->lconv->n_sep_by_space;
1366 locinfo->lconv->p_sign_posn = loc->locinfo->lconv->p_sign_posn;
1367 locinfo->lconv->n_sign_posn = loc->locinfo->lconv->n_sign_posn;
1368
1369 if(category != MSVCRT_LC_ALL)
1370 break;
1371 /* fall through */
1372 case MSVCRT_LC_NUMERIC:
1373 locinfo->lc_handle[MSVCRT_LC_NUMERIC] =
1375 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_NUMERIC].locale,
1376 (void**)&loc->locinfo->lc_category[MSVCRT_LC_NUMERIC].locale);
1377 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_NUMERIC].refcount,
1378 (void**)&loc->locinfo->lc_category[MSVCRT_LC_NUMERIC].refcount);
1379
1380 swap_pointers((void**)&locinfo->lconv->decimal_point,
1381 (void**)&loc->locinfo->lconv->decimal_point);
1382 swap_pointers((void**)&locinfo->lconv->thousands_sep,
1383 (void**)&loc->locinfo->lconv->thousands_sep);
1384 swap_pointers((void**)&locinfo->lconv->grouping,
1385 (void**)&loc->locinfo->lconv->grouping);
1386
1387 if(category != MSVCRT_LC_ALL)
1388 break;
1389 /* fall through */
1390 case MSVCRT_LC_TIME:
1391 locinfo->lc_handle[MSVCRT_LC_TIME] =
1393 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_TIME].locale,
1394 (void**)&loc->locinfo->lc_category[MSVCRT_LC_TIME].locale);
1395 swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_TIME].refcount,
1396 (void**)&loc->locinfo->lc_category[MSVCRT_LC_TIME].refcount);
1397 swap_pointers((void**)&locinfo->lc_time_curr,
1398 (void**)&loc->locinfo->lc_time_curr);
1399
1400 if(category != MSVCRT_LC_ALL)
1401 break;
1402 }
1403
1406
1407 if(locinfo == MSVCRT_locale->locinfo) {
1408 int i;
1409
1410 __lc_codepage = locinfo->lc_codepage;
1411 MSVCRT___lc_collate_cp = locinfo->lc_collate_cp;
1412 __mb_cur_max = locinfo->mb_cur_max;
1413 _pctype = locinfo->pctype;
1414 for(i=LC_MIN; i<=LC_MAX; i++)
1415 MSVCRT___lc_handle[i] = MSVCRT_locale->locinfo->lc_handle[i];
1416 }
1417
1418 if(category == MSVCRT_LC_ALL)
1419 return construct_lc_all(locinfo);
1420
1422 return locinfo->lc_category[category].locale;
1423}
#define WARN(fmt,...)
Definition: precomp.h:61
#define _pctype
Definition: wctype.h:43
#define _Analysis_assume_(expr)
Definition: ms_sal.h:2901
static char * construct_lc_all(MSVCRT_pthreadlocinfo locinfo)
Definition: locale.c:376
static void swap_pointers(void **p1, void **p2)
Definition: locale.c:347
MSVCRT_ulong lc_handle[6]
Definition: msvcrt.h:115

◆ swap_pointers()

static void swap_pointers ( void **  p1,
void **  p2 
)
inlinestatic

Definition at line 347 of file locale.c.

347 {
348 void *hlp;
349
350 hlp = *p1;
351 *p1 = *p2;
352 *p2 = hlp;
353}

Referenced by setlocale().

◆ update_threadlocinfo_category()

static BOOL update_threadlocinfo_category ( LCID  lcid,
unsigned short  cp,
MSVCRT__locale_t  loc,
int  category 
)
static

Definition at line 291 of file locale.c.

293{
294 char buf[256], *p;
295 int len;
296
298 p = buf;
299
300 loc->locinfo->lc_id[category].wLanguage = 0;
301 while(*p) {
302 loc->locinfo->lc_id[category].wLanguage *= 16;
303
304 if(*p <= '9')
305 loc->locinfo->lc_id[category].wLanguage += *p-'0';
306 else
307 loc->locinfo->lc_id[category].wLanguage += *p-'a'+10;
308
309 p++;
310 }
311
314 }
315
317
318 loc->locinfo->lc_handle[category] = lcid;
319
320 len = 0;
323 buf[len-1] = '_';
326 buf[len-1] = '.';
327 sprintf(buf+len, "%u", cp);
328 len += strlen(buf+len)+1;
329
331 loc->locinfo->lc_category[category].refcount = MSVCRT_malloc(sizeof(int));
332 if(!loc->locinfo->lc_category[category].locale
333 || !loc->locinfo->lc_category[category].refcount) {
335 MSVCRT_free(loc->locinfo->lc_category[category].refcount);
336 loc->locinfo->lc_category[category].locale = NULL;
337 loc->locinfo->lc_category[category].refcount = NULL;
338 return TRUE;
339 }
340 memcpy(loc->locinfo->lc_category[category].locale, buf, len);
341 *loc->locinfo->lc_category[category].refcount = 1;
342
343 return FALSE;
344}
unsigned short wCountry
Definition: msvcrt.h:107
unsigned short wLanguage
Definition: msvcrt.h:106

Referenced by MSVCRT__create_locale().

Variable Documentation

◆ __lc_codepage

unsigned int __lc_codepage = 0

Definition at line 36 of file locale.c.

Referenced by ___lc_codepage_func(), __init_global_locale(), setlocale(), and Test___lc_codepage().

◆ __mb_cur_max

int __mb_cur_max = 1

Definition at line 39 of file locale.c.

Referenced by __init_global_locale(), and setlocale().

◆ __setlc_active

unsigned int __setlc_active
extern

Definition at line 16 of file environ.c.

Referenced by ___setlc_active_func(), and Test___setlc_active().

◆ __unguarded_readlc_active

unsigned int __unguarded_readlc_active
extern

◆ _country_synonyms

const char* const _country_synonyms[]
static

Definition at line 52 of file locale.c.

Referenced by remap_synonym().

◆ _mbctype

unsigned char _mbctype[257] = { 0 }

This file has no copyright assigned and is placed in the Public Domain. This file is part of the w64 mingw-runtime package. No warranty is given; refer to the file DISCLAIMER within this package.

Definition at line 42 of file locale.c.

Referenced by _ismbbkpunct(), _setmbcp_l(), and Test__mbctype().

◆ charmax

unsigned char charmax = CHAR_MAX
static

Definition at line 40 of file locale.c.

Referenced by __lconv_init().

◆ global_locale

◆ MSVCRT___lc_collate_cp

int MSVCRT___lc_collate_cp = 0

Definition at line 37 of file locale.c.

Referenced by __init_global_locale(), and setlocale().

◆ MSVCRT___lc_handle

LCID MSVCRT___lc_handle[LC_MAX - LC_MIN+1] = { 0 }

Definition at line 38 of file locale.c.

Referenced by ___lc_handle_func(), __init_global_locale(), and setlocale().