ReactOS 0.4.16-dev-300-g2aadf2e
_setmbcp.c File Reference
#include <precomp.h>
#include <mbctype.h>
Include dependency graph for _setmbcp.c:

Go to the source code of this file.

Classes

struct  cp_extra_info_t
 

Functions

int _setmbcp_l (int cp, LCID lcid, MSVCRT_pthreadmbcinfo mbcinfo)
 
int CDECL _setmbcp (int cp)
 

Variables

static struct cp_extra_info_t g_cpextrainfo []
 

Function Documentation

◆ _setmbcp()

int CDECL _setmbcp ( int  cp)

Definition at line 218 of file _setmbcp.c.

219{
220 return _setmbcp_l(cp, -1, NULL);
221}
int _setmbcp_l(int cp, LCID lcid, MSVCRT_pthreadmbcinfo mbcinfo)
Definition: _setmbcp.c:52
#define NULL
Definition: types.h:112
POINT cp
Definition: magnifier.c:59

Referenced by __init_global_locale(), test__ismbclx(), test__mbscat_s(), test_cp_table(), test_ismbckata(), test_ismbclegal(), test_mbbtombc(), test_mbcjisjms(), test_mbcjmsjis(), test_mbcp(), test_mbctohira(), test_mbctokata(), test_mbctombb(), test_mbsspn(), test_mbsspnp(), test_splitpath(), and test_wctob().

◆ _setmbcp_l()

int _setmbcp_l ( int  cp,
LCID  lcid,
MSVCRT_pthreadmbcinfo  mbcinfo 
)

Definition at line 52 of file _setmbcp.c.

53{
54 const char format[] = ".%d";
55
56 int newcp;
57 CPINFO cpi;
58 BYTE *bytes;
59 WORD chartypes[256];
60 char bufA[256];
61 WCHAR bufW[256];
62 int charcount;
63 int ret;
64 int i;
65
66 if(!mbcinfo)
67 mbcinfo = get_mbcinfo();
68
69 switch (cp)
70 {
71 case _MB_CP_ANSI:
72 newcp = GetACP();
73 break;
74 case _MB_CP_OEM:
75 newcp = GetOEMCP();
76 break;
77 case _MB_CP_LOCALE:
78 newcp = get_locinfo()->lc_codepage;
79 if(newcp)
80 break;
81 /* fall through (C locale) */
82 case _MB_CP_SBCS:
83 newcp = 20127; /* ASCII */
84 break;
85 default:
86 newcp = cp;
87 break;
88 }
89
90 if(lcid == -1) {
91 sprintf(bufA, format, newcp);
92 mbcinfo->mblcid = MSVCRT_locale_to_LCID(bufA, NULL);
93 } else {
94 mbcinfo->mblcid = lcid;
95 }
96
97 if(mbcinfo->mblcid == -1)
98 {
99 WARN("Can't assign LCID to codepage (%d)\n", mbcinfo->mblcid);
100 mbcinfo->mblcid = 0;
101 }
102
103 if (!GetCPInfo(newcp, &cpi))
104 {
105 WARN("Codepage %d not found\n", newcp);
106 *_errno() = EINVAL;
107 return -1;
108 }
109
110 /* setup the _mbctype */
111 memset(mbcinfo->mbctype, 0, sizeof(unsigned char[257]));
112 memset(mbcinfo->mbcasemap, 0, sizeof(unsigned char[256]));
113
114 bytes = cpi.LeadByte;
115 while (bytes[0] || bytes[1])
116 {
117 for (i = bytes[0]; i <= bytes[1]; i++)
118 mbcinfo->mbctype[i + 1] |= _M1;
119 bytes += 2;
120 }
121
122 if (cpi.MaxCharSize > 1)
123 {
124 /* trail bytes not available through kernel32 but stored in a structure in msvcrt */
125 struct cp_extra_info_t *cpextra = g_cpextrainfo;
126
127 mbcinfo->ismbcodepage = 1;
128 while (TRUE)
129 {
130 if (cpextra->cp == 0 || cpextra->cp == newcp)
131 {
132 if (cpextra->cp == 0)
133 FIXME("trail bytes data not available for DBCS codepage %d - assuming all bytes\n", newcp);
134
135 bytes = cpextra->TrailBytes;
136 while (bytes[0] || bytes[1])
137 {
138 for (i = bytes[0]; i <= bytes[1]; i++)
139 mbcinfo->mbctype[i + 1] |= _M2;
140 bytes += 2;
141 }
142 break;
143 }
144 cpextra++;
145 }
146 }
147 else
148 mbcinfo->ismbcodepage = 0;
149
150 /* we can't use GetStringTypeA directly because we don't have a locale - only a code page
151 */
152 charcount = 0;
153 for (i = 0; i < 256; i++)
154 if (!(mbcinfo->mbctype[i + 1] & _M1))
155 bufA[charcount++] = i;
156
157 ret = MultiByteToWideChar(newcp, 0, bufA, charcount, bufW, charcount);
158 if (ret != charcount)
159 ERR("MultiByteToWideChar of chars failed for cp %d, ret=%d (exp %d), error=%d\n", newcp, ret, charcount, GetLastError());
160
161 GetStringTypeW(CT_CTYPE1, bufW, charcount, chartypes);
162
163 charcount = 0;
164 for (i = 0; i < 256; i++)
165 if (!(mbcinfo->mbctype[i + 1] & _M1))
166 {
167 if (chartypes[charcount] & C1_UPPER)
168 {
169 mbcinfo->mbctype[i + 1] |= _SBUP;
170 bufW[charcount] = tolowerW(bufW[charcount]);
171 }
172 else if (chartypes[charcount] & C1_LOWER)
173 {
174 mbcinfo->mbctype[i + 1] |= _SBLOW;
175 bufW[charcount] = toupperW(bufW[charcount]);
176 }
177 charcount++;
178 }
179
180 ret = WideCharToMultiByte(newcp, 0, bufW, charcount, bufA, charcount, NULL, NULL);
181 if (ret != charcount)
182 ERR("WideCharToMultiByte failed for cp %d, ret=%d (exp %d), error=%d\n", newcp, ret, charcount, GetLastError());
183
184 charcount = 0;
185 for (i = 0; i < 256; i++)
186 {
187 if(!(mbcinfo->mbctype[i + 1] & _M1))
188 {
189 if(mbcinfo->mbctype[i] & (C1_UPPER|C1_LOWER))
190 mbcinfo->mbcasemap[i] = bufA[charcount];
191 charcount++;
192 }
193 }
194
195 if (newcp == 932) /* CP932 only - set _MP and _MS */
196 {
197 /* On Windows it's possible to calculate the _MP and _MS from CT_CTYPE1
198 * and CT_CTYPE3. But as of Wine 0.9.43 we return wrong values what makes
199 * it hard. As this is set only for codepage 932 we hardcode it what gives
200 * also faster execution.
201 */
202 for (i = 161; i <= 165; i++)
203 mbcinfo->mbctype[i + 1] |= _MP;
204 for (i = 166; i <= 223; i++)
205 mbcinfo->mbctype[i + 1] |= _MS;
206 }
207
208 mbcinfo->mbcodepage = newcp;
209 if(global_locale && mbcinfo == MSVCRT_locale->mbcinfo)
210 memcpy(_mbctype, MSVCRT_locale->mbcinfo->mbctype, sizeof(_mbctype));
211
212 return 0;
213}
static struct cp_extra_info_t g_cpextrainfo[]
Definition: _setmbcp.c:38
#define EINVAL
Definition: acclib.h:90
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define TRUE
Definition: types.h:120
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
UINT WINAPI GetACP(void)
Definition: locale.c:2021
BOOL WINAPI GetCPInfo(UINT codepage, LPCPINFO cpinfo)
Definition: locale.c:2144
BOOL WINAPI GetStringTypeW(DWORD type, LPCWSTR src, INT count, LPWORD chartype)
Definition: locale.c:3095
UINT WINAPI GetOEMCP(void)
Definition: locale.c:2060
unsigned short WORD
Definition: ntddk_ex.h:93
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 C1_LOWER
Definition: unicode.h:32
#define C1_UPPER
Definition: unicode.h:31
#define MSVCRT_locale
Definition: locale.h:80
MSVCRT__locale_t global_locale
Definition: locale.c:1497
_CRTIMP unsigned char _mbctype[257]
Definition: locale.c:42
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define for
Definition: utility.h:88
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define _M2
Definition: msvcrt.h:818
LCID MSVCRT_locale_to_LCID(const char *)
MSVCRT_pthreadmbcinfo get_mbcinfo(void)
Definition: locale.c:366
#define _MP
Definition: msvcrt.h:816
#define _MB_CP_OEM
Definition: msvcrt.h:829
#define _MB_CP_ANSI
Definition: msvcrt.h:830
#define _MB_CP_LOCALE
Definition: msvcrt.h:831
#define _M1
Definition: msvcrt.h:817
#define _SBLOW
Definition: msvcrt.h:821
#define _SBUP
Definition: msvcrt.h:820
#define _MS
Definition: msvcrt.h:815
#define _MB_CP_SBCS
Definition: msvcrt.h:828
#define toupperW(n)
Definition: unicode.h:51
#define tolowerW(n)
Definition: unicode.h:50
_CRTIMP int *__cdecl _errno(void)
Definition: errno.c:17
#define memset(x, y, z)
Definition: compat.h:39
unsigned char mbcasemap[256]
Definition: msvcrt.h:144
unsigned char mbctype[257]
Definition: msvcrt.h:143
BYTE LeadByte[MAX_LEADBYTES]
Definition: winnls.h:585
UINT MaxCharSize
Definition: winnls.h:583
BYTE TrailBytes[MAX_LEADBYTES]
Definition: _setmbcp.c:35
Definition: format.c:58
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define get_locinfo()
Definition: winesup.h:25
#define CT_CTYPE1
Definition: winnls.h:239
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193

Referenced by _setmbcp(), and MSVCRT__create_locale().

Variable Documentation

◆ g_cpextrainfo

struct cp_extra_info_t g_cpextrainfo[]
static
Initial value:
=
{
{932, {0x40, 0x7e, 0x80, 0xfc, 0, 0}},
{936, {0x40, 0xfe, 0, 0}},
{949, {0x41, 0xfe, 0, 0}},
{950, {0x40, 0x7e, 0xa1, 0xfe, 0, 0}},
{1361, {0x31, 0x7e, 0x81, 0xfe, 0, 0}},
{20932, {1, 255, 0, 0}},
{0, {1, 255, 0, 0}}
}

Definition at line 38 of file _setmbcp.c.

Referenced by _setmbcp_l().