Release 980315
[wine/multimedia.git] / win32 / code_page.c
blob6ef33356775e30ad7b298eff81129d82f354e175
1 /*
2 * Win32 kernel functions
4 * Copyright 1995 Martin von Loewis and Cameron Heide
5 */
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "windows.h"
10 #include "winerror.h"
11 #include "winnls.h"
12 #include "heap.h"
13 #include "debug.h"
16 /***********************************************************************
17 * GetACP (KERNEL32.148)
19 UINT32 WINAPI GetACP(void)
21 return 1252; /* Windows 3.1 ISO Latin */
24 /***********************************************************************
25 * GetCPInfo (KERNEL32.154)
27 BOOL32 WINAPI GetCPInfo( UINT32 codepage, LPCPINFO cpinfo )
29 cpinfo->DefaultChar[0] = '?';
30 switch (codepage)
32 case 932 : /* Shift JIS (japan) */
33 cpinfo->MaxCharSize = 2;
34 cpinfo->LeadByte[0]= 0x81; cpinfo->LeadByte[1] = 0x9F;
35 cpinfo->LeadByte[2]= 0xE0; cpinfo->LeadByte[3] = 0xFC;
36 cpinfo->LeadByte[4]= 0x00; cpinfo->LeadByte[5] = 0x00;
37 break;
38 case 936 : /* GB2312 (Chinese) */
39 case 949 : /* KSC5601-1987 (Korean) */
40 case 950 : /* BIG5 (Chinese) */
41 cpinfo->MaxCharSize = 2;
42 cpinfo->LeadByte[0]= 0x81; cpinfo->LeadByte[1] = 0xFE;
43 cpinfo->LeadByte[2]= 0x00; cpinfo->LeadByte[3] = 0x00;
44 break;
45 case 1361 : /* Johab (Korean) */
46 cpinfo->MaxCharSize = 2;
47 cpinfo->LeadByte[0]= 0x84; cpinfo->LeadByte[1] = 0xD3;
48 cpinfo->LeadByte[2]= 0xD8; cpinfo->LeadByte[3] = 0xDE;
49 cpinfo->LeadByte[4]= 0xE0; cpinfo->LeadByte[5] = 0xF9;
50 cpinfo->LeadByte[6]= 0x00; cpinfo->LeadByte[7] = 0x00;
51 break;
52 default :
53 cpinfo->MaxCharSize = 1;
54 cpinfo->LeadByte[0]= 0x00; cpinfo->LeadByte[1] = 0x00;
55 break;
57 return 1;
60 /***********************************************************************
61 * GetOEMCP (KERNEL32.248)
63 UINT32 WINAPI GetOEMCP(void)
65 return 437; /* MS-DOS United States */
68 /***********************************************************************
69 * IsValidCodePage (KERNEL32.360)
71 BOOL32 WINAPI IsValidCodePage(UINT32 CodePage)
73 switch ( CodePage )
75 case 1252 :
76 case 437 :
77 return TRUE;
78 default :
79 return FALSE;
84 /***********************************************************************
85 * MultiByteToWideChar (KERNEL32.392)
87 INT32 WINAPI MultiByteToWideChar(UINT32 page, DWORD flags,
88 LPCSTR src, INT32 srclen,
89 LPWSTR dst, INT32 dstlen)
91 int ret;
93 if (srclen == -1)
94 srclen = lstrlen32A(src)+1;
95 if (!dstlen || !dst)
96 return srclen;
98 ret = srclen;
99 while (srclen > 0 && dstlen > 0) {
100 *dst = (WCHAR)(unsigned char)*src;
101 if (!*src)
102 return ret;
103 dst++; src++;
104 dstlen--; srclen--;
106 if (dstlen == 0) {
107 SetLastError(ERROR_INSUFFICIENT_BUFFER);
108 return 0;
110 return ret;
113 INT32 WINAPI WideCharToMultiByte(UINT32 page, DWORD flags, LPCWSTR src,
114 INT32 srclen,LPSTR dst, INT32 dstlen,
115 LPCSTR defchar, BOOL32 *used)
117 int count = 0;
118 int eos = 0;
119 int dont_copy= (dstlen==0);
120 if (page!=GetACP() && page!=CP_OEMCP && page!=CP_ACP)
121 fprintf(stdnimp,"Conversion in CP %d not supported\n",page);
122 #if 0
123 if (flags)
124 fprintf(stdnimp,"WideCharToMultiByte flags %lx not supported\n",flags);
125 #endif
126 if(used)
127 *used=0;
128 if (srclen == -1)
129 srclen = lstrlen32W(src)+1;
130 while(srclen && (dont_copy || dstlen))
132 if(!dont_copy){
133 if(*src<256)
134 *dst = *src;
135 else
137 /* ??? The WC_DEFAULTCHAR flag only gets used in
138 * combination with the WC_COMPOSITECHECK flag or at
139 * least this is what it seems from using the function
140 * on NT4.0 in combination with reading the documentation.
142 *dst = defchar ? *defchar : '?';
143 if(used)*used=1;
145 dstlen--;
146 dst++;
148 count++;
149 srclen--;
150 if(!*src) {
151 eos = 1;
152 break;
154 src++;
156 if (dont_copy)
157 return count;
159 if (!eos && srclen > 0) {
160 SetLastError(ERROR_INSUFFICIENT_BUFFER);
161 return 0;
163 return count;
167 /***********************************************************************
168 * IsDBCSLeadByteEx (KERNEL32.359)
170 BOOL32 WINAPI IsDBCSLeadByteEx( UINT32 codepage, BYTE testchar )
172 CPINFO cpinfo;
173 int i;
175 GetCPInfo(codepage, &cpinfo);
176 for (i = 0 ; i < sizeof(cpinfo.LeadByte)/sizeof(cpinfo.LeadByte[0]); i+=2)
178 if (cpinfo.LeadByte[i] == 0)
179 return FALSE;
180 if (cpinfo.LeadByte[i] <= testchar && testchar <= cpinfo.LeadByte[i+1])
181 return TRUE;
183 return FALSE;
187 /***********************************************************************
188 * IsDBCSLeadByte16 (KERNEL.207)
190 BOOL16 WINAPI IsDBCSLeadByte16( BYTE testchar )
192 return IsDBCSLeadByteEx(GetACP(), testchar);
196 /***********************************************************************
197 * IsDBCSLeadByte32 (KERNEL32.358)
199 BOOL32 WINAPI IsDBCSLeadByte32( BYTE testchar )
201 return IsDBCSLeadByteEx(GetACP(), testchar);
205 /***********************************************************************
206 * EnumSystemCodePages32A (KERNEL32.92)
208 BOOL32 WINAPI EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A lpfnCodePageEnum,DWORD flags)
210 TRACE(win32,"(%p,%08lx)\n",
211 lpfnCodePageEnum,flags
213 lpfnCodePageEnum("437");
214 return TRUE;
217 /***********************************************************************
218 * EnumSystemCodePages32W (KERNEL32.93)
220 BOOL32 WINAPI EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W lpfnCodePageEnum,
221 DWORD flags)
223 WCHAR *cp;
224 TRACE(win32,"(%p,%08lx)\n",
225 lpfnCodePageEnum,flags );
227 cp = HEAP_strdupAtoW( GetProcessHeap(), 0, "437" );
228 lpfnCodePageEnum(cp);
229 HeapFree( GetProcessHeap(), 0, cp );
230 return TRUE;