[KERNEL32]: Winesync all there is to Winesync in ReactOS' kernel32. This mainly affects LZ*, Comm*, *ProfileString* (INI), and *Resource* APIs, however the changes in there are relatively minor. More substantial changes affect the locale/NLS/language functions, many which were bitrotting for 6+ years.

In theory, this code is "better" than before, and it is closer to Wine (which arguably has better compatibility). It also resets things in sync with Wine however, and may lose and "fixes" ReactOS may have added over the years. But this is a good thing, since these fixes have been "lost" (they obviously never made it into Wine), and if regressions are now found due to this, actual upstream patches can be sent and picked up on the next sync. This avoids maintaining duplicate code, at the expenses of some potential short-term regressions in i18n.
Finally, note that much of /string seems to be taken from Wine's Unicode library (which a host "unicode" already exists in ReactOS' tools/. It may be better (for someone with more experience as to these wine-isms) to simply just pull-in whatever winelib files are not currently present in ReactOS, and have kernel32 and tools/unicode use winelib, instead of having 2 or 3 copies of the code.

svn path=/trunk/; revision=52754
This commit is contained in:
Alex Ionescu 2011-07-21 05:24:59 +00:00
parent b61bacd753
commit 8d4cdb4ba1
13 changed files with 8080 additions and 7203 deletions

File diff suppressed because it is too large Load diff

View file

@ -21,7 +21,7 @@
*/ */
/* Parses a mode string for a serial port, in the same syntax as the mode.com command */ /* Parses a mode string for a serial port, in the same syntax as the mode.com command */
#if 0
#if defined(__REACTOS__) && defined(_KERNEL32_) #if defined(__REACTOS__) && defined(_KERNEL32_)
#include <k32.h> #include <k32.h>
@ -671,3 +671,4 @@ DCB_BuildCommDCBW(LPCWSTR lpDef, LPDCB lpDCB)
} }
/* EOF */ /* EOF */
#endif

View file

@ -33,18 +33,29 @@
* o Check whether the return values are correct * o Check whether the return values are correct
* *
*/ */
//#include <k32.h>
//#include "config.h"
#include <k32.h>
#define NDEBUG
#include <debug.h>
#include "lzexpand.h"
#define HFILE_ERROR ((HFILE)-1) #define HFILE_ERROR ((HFILE)-1)
//#include "config.h"
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <stdarg.h>
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "windef.h"
#include "winbase.h"
#include "lzexpand.h"
#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(file);
/* The readahead length of the decompressor. Reading single bytes /* The readahead length of the decompressor. Reading single bytes
* using _hread() would be SLOW. * using _lread() would be SLOW.
*/ */
#define GETLEN 2048 #define GETLEN 2048
@ -101,7 +112,7 @@ _lzget(struct lzstate *lzs,BYTE *b) {
*b = lzs->get[lzs->getcur++]; *b = lzs->get[lzs->getcur++];
return 1; return 1;
} else { } else {
int ret = _hread(lzs->realfd,lzs->get,GETLEN); int ret = _lread(lzs->realfd,lzs->get,GETLEN);
if (ret==HFILE_ERROR) if (ret==HFILE_ERROR)
return HFILE_ERROR; return HFILE_ERROR;
if (ret==0) if (ret==0)
@ -128,7 +139,7 @@ static INT read_header(HFILE fd,struct lzfileheader *head)
/* We can't directly read the lzfileheader struct due to /* We can't directly read the lzfileheader struct due to
* structure element alignment * structure element alignment
*/ */
if (_hread(fd,buf,LZ_HEADER_LEN)<LZ_HEADER_LEN) if (_lread(fd,buf,LZ_HEADER_LEN)<LZ_HEADER_LEN)
return 0; return 0;
memcpy(head->magic,buf,LZ_MAGIC_LEN); memcpy(head->magic,buf,LZ_MAGIC_LEN);
memcpy(&(head->compressiontype),buf+LZ_MAGIC_LEN,1); memcpy(&(head->compressiontype),buf+LZ_MAGIC_LEN,1);
@ -150,7 +161,7 @@ static INT read_header(HFILE fd,struct lzfileheader *head)
*/ */
INT WINAPI LZStart(void) INT WINAPI LZStart(void)
{ {
DPRINT("(void)\n"); TRACE("(void)\n");
return 1; return 1;
} }
@ -173,7 +184,7 @@ HFILE WINAPI LZInit( HFILE hfSrc )
struct lzstate *lzs; struct lzstate *lzs;
int i, ret; int i, ret;
DPRINT("(%d)\n",hfSrc); TRACE("(%d)\n",hfSrc);
ret=read_header(hfSrc,&head); ret=read_header(hfSrc,&head);
if (ret<=0) { if (ret<=0) {
_llseek(hfSrc,0,SEEK_SET); _llseek(hfSrc,0,SEEK_SET);
@ -181,19 +192,19 @@ HFILE WINAPI LZInit( HFILE hfSrc )
} }
for (i = 0; i < MAX_LZSTATES; i++) if (!lzstates[i]) break; for (i = 0; i < MAX_LZSTATES; i++) if (!lzstates[i]) break;
if (i == MAX_LZSTATES) return LZERROR_GLOBALLOC; if (i == MAX_LZSTATES) return LZERROR_GLOBALLOC;
lzstates[i] = lzs = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct lzstate) ); lzstates[i] = lzs = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*lzs) );
if(lzs == NULL) return LZERROR_GLOBALLOC; if(lzs == NULL) return LZERROR_GLOBALLOC;
lzs->realfd = hfSrc; lzs->realfd = hfSrc;
lzs->lastchar = head.lastchar; lzs->lastchar = head.lastchar;
lzs->reallength = head.reallength; lzs->reallength = head.reallength;
lzs->get = RtlAllocateHeap( GetProcessHeap(), 0, GETLEN ); lzs->get = HeapAlloc( GetProcessHeap(), 0, GETLEN );
lzs->getlen = 0; lzs->getlen = 0;
lzs->getcur = 0; lzs->getcur = 0;
if(lzs->get == NULL) { if(lzs->get == NULL) {
RtlFreeHeap(GetProcessHeap(), 0, lzs); HeapFree(GetProcessHeap(), 0, lzs);
lzstates[i] = NULL; lzstates[i] = NULL;
return LZERROR_GLOBALLOC; return LZERROR_GLOBALLOC;
} }
@ -211,7 +222,7 @@ HFILE WINAPI LZInit( HFILE hfSrc )
*/ */
void WINAPI LZDone(void) void WINAPI LZDone(void)
{ {
DPRINT("(void)\n"); TRACE("(void)\n");
} }
@ -234,7 +245,7 @@ INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
INT fnislowercased,ret,len; INT fnislowercased,ret,len;
LPSTR s,t; LPSTR s,t;
DPRINT("(%s)\n",in); TRACE("(%s)\n",in);
fd=OpenFile(in,&ofs,OF_READ); fd=OpenFile(in,&ofs,OF_READ);
if (fd==HFILE_ERROR) if (fd==HFILE_ERROR)
return (INT)(INT16)LZERROR_BADINHANDLE; return (INT)(INT16)LZERROR_BADINHANDLE;
@ -256,7 +267,7 @@ INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
/* now mangle the basename */ /* now mangle the basename */
if (!*s) { if (!*s) {
/* FIXME: hmm. shouldn't happen? */ /* FIXME: hmm. shouldn't happen? */
DPRINT("Specified a directory or what? (%s)\n",in); WARN("Specified a directory or what? (%s)\n",in);
_lclose(fd); _lclose(fd);
return 1; return 1;
} }
@ -299,23 +310,14 @@ INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out ) INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out )
{ {
INT ret; INT ret;
DWORD len; DWORD len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL );
char *xin, *xout; char *xin = HeapAlloc( GetProcessHeap(), 0, len );
len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL ); char *xout = HeapAlloc( GetProcessHeap(), 0, len+3 );
xin = RtlAllocateHeap( RtlGetProcessHeap(), 0, len );
if (xin == NULL)
return LZERROR_BADVALUE;
xout = RtlAllocateHeap( RtlGetProcessHeap(), 0, len+3 );
if (xout == NULL)
{
RtlFreeHeap( RtlGetProcessHeap(), 0, xin );
return LZERROR_BADVALUE;
}
WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL );
if ((ret = GetExpandedNameA( xin, xout )) > 0) if ((ret = GetExpandedNameA( xin, xout )) > 0)
MultiByteToWideChar( CP_ACP, 0, xout, -1, out, wcslen(in)+4 ); MultiByteToWideChar( CP_ACP, 0, xout, -1, out, strlenW(in)+4 );
RtlFreeHeap( RtlGetProcessHeap(), 0, xin ); HeapFree( GetProcessHeap(), 0, xin );
RtlFreeHeap( RtlGetProcessHeap(), 0, xout ); HeapFree( GetProcessHeap(), 0, xout );
return ret; return ret;
} }
@ -330,9 +332,9 @@ INT WINAPI LZRead( HFILE fd, LPSTR vbuf, INT toread )
struct lzstate *lzs; struct lzstate *lzs;
buf=(LPBYTE)vbuf; buf=(LPBYTE)vbuf;
DPRINT("(%d,%p,%d)\n",fd,buf,toread); TRACE("(%d,%p,%d)\n",fd,buf,toread);
howmuch=toread; howmuch=toread;
if (!(lzs = GET_LZ_STATE(fd))) return _hread(fd,buf,toread); if (!(lzs = GET_LZ_STATE(fd))) return _lread(fd,buf,toread);
/* The decompressor itself is in a define, cause we need it twice /* The decompressor itself is in a define, cause we need it twice
* in this function. (the decompressed byte will be in b) * in this function. (the decompressed byte will be in b)
@ -419,7 +421,7 @@ LONG WINAPI LZSeek( HFILE fd, LONG off, INT type )
struct lzstate *lzs; struct lzstate *lzs;
LONG newwanted; LONG newwanted;
DPRINT("(%d,%ld,%d)\n",fd,off,type); TRACE("(%d,%d,%d)\n",fd,off,type);
/* not compressed? just use normal _llseek() */ /* not compressed? just use normal _llseek() */
if (!(lzs = GET_LZ_STATE(fd))) return _llseek(fd,off,type); if (!(lzs = GET_LZ_STATE(fd))) return _llseek(fd,off,type);
newwanted = lzs->realwanted; newwanted = lzs->realwanted;
@ -466,7 +468,7 @@ LONG WINAPI LZCopy( HFILE src, HFILE dest )
_readfun xread; _readfun xread;
DPRINT("(%d,%d)\n",src,dest); TRACE("(%d,%d)\n",src,dest);
if (!IS_LZ_HANDLE(src)) { if (!IS_LZ_HANDLE(src)) {
src = LZInit(src); src = LZInit(src);
if ((INT)src <= 0) return 0; if ((INT)src <= 0) return 0;
@ -489,7 +491,7 @@ LONG WINAPI LZCopy( HFILE src, HFILE dest )
return ret; return ret;
} }
len += ret; len += ret;
wret = _hwrite(dest,buf,ret); wret = _lwrite(dest,buf,ret);
if (wret!=ret) if (wret!=ret)
return LZERROR_WRITE; return LZERROR_WRITE;
} }
@ -510,7 +512,7 @@ LONG WINAPI LZCopy( HFILE src, HFILE dest )
static LPSTR LZEXPAND_MangleName( LPCSTR fn ) static LPSTR LZEXPAND_MangleName( LPCSTR fn )
{ {
char *p; char *p;
char *mfn = RtlAllocateHeap( GetProcessHeap(), 0, strlen(fn) + 3 ); /* "._" and \0 */ char *mfn = HeapAlloc( GetProcessHeap(), 0, strlen(fn) + 3 ); /* "._" and \0 */
if(mfn == NULL) return NULL; if(mfn == NULL) return NULL;
strcpy( mfn, fn ); strcpy( mfn, fn );
if (!(p = strrchr( mfn, '\\' ))) p = mfn; if (!(p = strrchr( mfn, '\\' ))) p = mfn;
@ -534,14 +536,14 @@ HFILE WINAPI LZOpenFileA( LPSTR fn, LPOFSTRUCT ofs, WORD mode )
{ {
HFILE fd,cfd; HFILE fd,cfd;
DPRINT("(%s,%p,%d)\n",fn,ofs,mode); TRACE("(%s,%p,%d)\n",fn,ofs,mode);
/* 0x70 represents all OF_SHARE_* flags, ignore them for the check */ /* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
fd=OpenFile(fn,ofs,mode); fd=OpenFile(fn,ofs,mode);
if (fd==HFILE_ERROR) if (fd==HFILE_ERROR)
{ {
LPSTR mfn = LZEXPAND_MangleName(fn); LPSTR mfn = LZEXPAND_MangleName(fn);
fd = OpenFile(mfn,ofs,mode); fd = OpenFile(mfn,ofs,mode);
RtlFreeHeap( GetProcessHeap(), 0, mfn ); HeapFree( GetProcessHeap(), 0, mfn );
} }
if ((mode&~0x70)!=OF_READ) if ((mode&~0x70)!=OF_READ)
return fd; return fd;
@ -560,10 +562,10 @@ HFILE WINAPI LZOpenFileW( LPWSTR fn, LPOFSTRUCT ofs, WORD mode )
{ {
HFILE ret; HFILE ret;
DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL ); DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
LPSTR xfn = RtlAllocateHeap( GetProcessHeap(), 0, len ); LPSTR xfn = HeapAlloc( GetProcessHeap(), 0, len );
WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL );
ret = LZOpenFileA(xfn,ofs,mode); ret = LZOpenFileA(xfn,ofs,mode);
RtlFreeHeap( GetProcessHeap(), 0, xfn ); HeapFree( GetProcessHeap(), 0, xfn );
return ret; return ret;
} }
@ -575,14 +577,13 @@ void WINAPI LZClose( HFILE fd )
{ {
struct lzstate *lzs; struct lzstate *lzs;
DPRINT("(%d)\n",fd); TRACE("(%d)\n",fd);
if (!(lzs = GET_LZ_STATE(fd))) _lclose(fd); if (!(lzs = GET_LZ_STATE(fd))) _lclose(fd);
else else
{ {
if (lzs->get) RtlFreeHeap( GetProcessHeap(), 0, lzs->get ); HeapFree( GetProcessHeap(), 0, lzs->get );
CloseHandle( LongToHandle(lzs->realfd) ); CloseHandle( LongToHandle(lzs->realfd) );
lzstates[fd - LZ_MIN_HANDLE] = NULL; lzstates[fd - LZ_MIN_HANDLE] = NULL;
RtlFreeHeap( GetProcessHeap(), 0, lzs ); HeapFree( GetProcessHeap(), 0, lzs );
} }
} }

View file

@ -19,10 +19,22 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <k32.h> //#include "config.h"
//#include "wine/port.h"
#define NDEBUG #include <string.h>
#include <debug.h> #include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winerror.h"
#include "winternl.h"
#include "wine/unicode.h"
#include "wine/library.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(profile);
static const char bom_utf8[] = {0xEF,0xBB,0xBF}; static const char bom_utf8[] = {0xEF,0xBB,0xBF};
@ -77,13 +89,12 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
{ {
0, 0, &PROFILE_CritSect, 0, 0, &PROFILE_CritSect,
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
0, 0, 0, 0, 0 0, 0, 0
}; };
static RTL_CRITICAL_SECTION PROFILE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 }; static RTL_CRITICAL_SECTION PROFILE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 };
static const char hex[16] = "0123456789ABCDEF"; static const char hex[16] = "0123456789ABCDEF";
/*********************************************************************** /***********************************************************************
* PROFILE_CopyEntry * PROFILE_CopyEntry
* *
@ -95,20 +106,19 @@ static void PROFILE_CopyEntry( LPWSTR buffer, LPCWSTR value, int len,
{ {
WCHAR quote = '\0'; WCHAR quote = '\0';
if (!buffer) return; if(!buffer) return;
if (strip_quote && ((*value == '\'') || (*value == '\"'))) if (strip_quote && ((*value == '\'') || (*value == '\"')))
{ {
if (value[1] && (value[wcslen(value)-1] == *value)) if (value[1] && (value[strlenW(value)-1] == *value)) quote = *value++;
quote = *value++;
} }
lstrcpynW( buffer, value, len ); lstrcpynW( buffer, value, len );
if (quote && (len >= (int)wcslen(value))) buffer[wcslen(buffer)-1] = '\0'; if (quote && (len >= lstrlenW(value))) buffer[strlenW(buffer)-1] = '\0';
} }
/* byte-swaps shorts in-place in a buffer. len is in WCHARs */ /* byte-swaps shorts in-place in a buffer. len is in WCHARs */
static __inline void PROFILE_ByteSwapShortBuffer(WCHAR * buffer, int len) static inline void PROFILE_ByteSwapShortBuffer(WCHAR * buffer, int len)
{ {
int i; int i;
USHORT * shortbuffer = buffer; USHORT * shortbuffer = buffer;
@ -117,7 +127,7 @@ static __inline void PROFILE_ByteSwapShortBuffer(WCHAR * buffer, int len)
} }
/* writes any necessary encoding marker to the file */ /* writes any necessary encoding marker to the file */
static __inline void PROFILE_WriteMarker(HANDLE hFile, ENCODING encoding) static inline void PROFILE_WriteMarker(HANDLE hFile, ENCODING encoding)
{ {
DWORD dwBytesWritten; DWORD dwBytesWritten;
WCHAR bom; WCHAR bom;
@ -145,7 +155,7 @@ static void PROFILE_WriteLine( HANDLE hFile, WCHAR * szLine, int len, ENCODING e
int write_buffer_len; int write_buffer_len;
DWORD dwBytesWritten; DWORD dwBytesWritten;
DPRINT("writing: %.*S\n", len, szLine); TRACE("writing: %s\n", debugstr_wn(szLine, len));
switch (encoding) switch (encoding)
{ {
@ -173,7 +183,7 @@ static void PROFILE_WriteLine( HANDLE hFile, WCHAR * szLine, int len, ENCODING e
WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL); WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
break; break;
default: default:
DPRINT1("encoding type %d not implemented\n", encoding); FIXME("encoding type %d not implemented\n", encoding);
} }
} }
@ -193,12 +203,12 @@ static void PROFILE_Save( HANDLE hFile, const PROFILESECTION *section, ENCODING
{ {
int len = 0; int len = 0;
if (section->name[0]) len += wcslen(section->name) + 4; if (section->name[0]) len += strlenW(section->name) + 4;
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
{ {
len += wcslen(key->name) + 2; len += strlenW(key->name) + 2;
if (key->value) len += wcslen(key->value) + 1; if (key->value) len += strlenW(key->value) + 1;
} }
buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
@ -208,8 +218,8 @@ static void PROFILE_Save( HANDLE hFile, const PROFILESECTION *section, ENCODING
if (section->name[0]) if (section->name[0])
{ {
*p++ = '['; *p++ = '[';
wcscpy( p, section->name ); strcpyW( p, section->name );
p += wcslen(p); p += strlenW(p);
*p++ = ']'; *p++ = ']';
*p++ = '\r'; *p++ = '\r';
*p++ = '\n'; *p++ = '\n';
@ -217,13 +227,13 @@ static void PROFILE_Save( HANDLE hFile, const PROFILESECTION *section, ENCODING
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
{ {
wcscpy( p, key->name ); strcpyW( p, key->name );
p += wcslen(p); p += strlenW(p);
if (key->value) if (key->value)
{ {
*p++ = '='; *p++ = '=';
wcscpy( p, key->value ); strcpyW( p, key->value );
p += wcslen(p); p += strlenW(p);
} }
*p++ = '\r'; *p++ = '\r';
*p++ = '\n'; *p++ = '\n';
@ -258,15 +268,15 @@ static void PROFILE_Free( PROFILESECTION *section )
} }
/* returns 1 if a character white space else 0 */ /* returns 1 if a character white space else 0 */
static __inline int PROFILE_isspaceW(WCHAR c) static inline int PROFILE_isspaceW(WCHAR c)
{ {
/* ^Z (DOS EOF) is a space too (found on CD-ROMs) */ /* ^Z (DOS EOF) is a space too (found on CD-ROMs) */
return isspace(c) || c == 0x1a; return isspaceW(c) || c == 0x1a;
} }
static __inline ENCODING PROFILE_DetectTextEncoding(const void * buffer, int * len) static inline ENCODING PROFILE_DetectTextEncoding(const void * buffer, int * len)
{ {
INT flags = IS_TEXT_UNICODE_SIGNATURE | int flags = IS_TEXT_UNICODE_SIGNATURE |
IS_TEXT_UNICODE_REVERSE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE |
IS_TEXT_UNICODE_ODD_LENGTH; IS_TEXT_UNICODE_ODD_LENGTH;
if (*len >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8))) if (*len >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8)))
@ -274,7 +284,7 @@ static __inline ENCODING PROFILE_DetectTextEncoding(const void * buffer, int * l
*len = sizeof(bom_utf8); *len = sizeof(bom_utf8);
return ENCODING_UTF8; return ENCODING_UTF8;
} }
RtlIsTextUnicode((void *)buffer, *len, &flags); RtlIsTextUnicode(buffer, *len, &flags);
if (flags & IS_TEXT_UNICODE_SIGNATURE) if (flags & IS_TEXT_UNICODE_SIGNATURE)
{ {
*len = sizeof(WCHAR); *len = sizeof(WCHAR);
@ -307,7 +317,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
PROFILEKEY *key, *prev_key, **next_key; PROFILEKEY *key, *prev_key, **next_key;
DWORD dwFileSize; DWORD dwFileSize;
DPRINT("%p\n", hFile); TRACE("%p\n", hFile);
dwFileSize = GetFileSize(hFile, NULL); dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize == INVALID_FILE_SIZE || dwFileSize == 0) if (dwFileSize == INVALID_FILE_SIZE || dwFileSize == 0)
@ -319,7 +329,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
if (!ReadFile(hFile, buffer_base, dwFileSize, &dwFileSize, NULL)) if (!ReadFile(hFile, buffer_base, dwFileSize, &dwFileSize, NULL))
{ {
HeapFree(GetProcessHeap(), 0, buffer_base); HeapFree(GetProcessHeap(), 0, buffer_base);
DPRINT("Error %ld reading file\n", GetLastError()); WARN("Error %d reading file\n", GetLastError());
return NULL; return NULL;
} }
len = dwFileSize; len = dwFileSize;
@ -331,7 +341,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
switch (*pEncoding) switch (*pEncoding)
{ {
case ENCODING_ANSI: case ENCODING_ANSI:
DPRINT("ANSI encoding\n"); TRACE("ANSI encoding\n");
len = MultiByteToWideChar(CP_ACP, 0, pBuffer, dwFileSize, NULL, 0); len = MultiByteToWideChar(CP_ACP, 0, pBuffer, dwFileSize, NULL, 0);
szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
@ -344,7 +354,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
szEnd = szFile + len; szEnd = szFile + len;
break; break;
case ENCODING_UTF8: case ENCODING_UTF8:
DPRINT("UTF8 encoding\n"); TRACE("UTF8 encoding\n");
len = MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, NULL, 0); len = MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, NULL, 0);
szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
@ -357,18 +367,18 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
szEnd = szFile + len; szEnd = szFile + len;
break; break;
case ENCODING_UTF16LE: case ENCODING_UTF16LE:
DPRINT("UTF16 Little Endian encoding\n"); TRACE("UTF16 Little Endian encoding\n");
szFile = pBuffer; szFile = pBuffer;
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize); szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
break; break;
case ENCODING_UTF16BE: case ENCODING_UTF16BE:
DPRINT("UTF16 Big Endian encoding\n"); TRACE("UTF16 Big Endian encoding\n");
szFile = pBuffer; szFile = pBuffer;
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize); szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
PROFILE_ByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR)); PROFILE_ByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR));
break; break;
default: default:
DPRINT("encoding type %d not implemented\n", *pEncoding); FIXME("encoding type %d not implemented\n", *pEncoding);
HeapFree(GetProcessHeap(), 0, buffer_base); HeapFree(GetProcessHeap(), 0, buffer_base);
return NULL; return NULL;
} }
@ -411,8 +421,8 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
const WCHAR * szSectionEnd; const WCHAR * szSectionEnd;
if (!(szSectionEnd = memrchrW( szLineStart, ']', szLineEnd - szLineStart ))) if (!(szSectionEnd = memrchrW( szLineStart, ']', szLineEnd - szLineStart )))
{ {
DPRINT("Invalid section header at line %d: %.*S\n", WARN("Invalid section header at line %d: %s\n",
line, (int)(szLineEnd - szLineStart), szLineStart); line, debugstr_wn(szLineStart, (int)(szLineEnd - szLineStart)) );
} }
else else
{ {
@ -431,7 +441,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
next_key = &section->key; next_key = &section->key;
prev_key = NULL; prev_key = NULL;
DPRINT("New section: %S\n", section->name); TRACE("New section: %s\n", debugstr_w(section->name));
continue; continue;
} }
@ -460,7 +470,6 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
{ {
len = (int)(szLineEnd - szValueStart); len = (int)(szLineEnd - szValueStart);
key->value = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ); key->value = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) );
if (!key->value) break;
memcpy(key->value, szValueStart, len * sizeof(WCHAR)); memcpy(key->value, szValueStart, len * sizeof(WCHAR));
key->value[len] = '\0'; key->value[len] = '\0';
} }
@ -471,8 +480,8 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
next_key = &key->next; next_key = &key->next;
prev_key = key; prev_key = key;
DPRINT("New key: name=%S, value=%S\n", TRACE("New key: name=%s, value=%s\n",
key->name, key->value ?key->value : L"(none)"); debugstr_w(key->name), key->value ? debugstr_w(key->value) : "(none)");
} }
} }
if (szFile != pBuffer) if (szFile != pBuffer)
@ -491,7 +500,7 @@ static BOOL PROFILE_DeleteSection( PROFILESECTION **section, LPCWSTR name )
{ {
while (*section) while (*section)
{ {
if ((*section)->name[0] && !_wcsicmp( (*section)->name, name )) if ((*section)->name[0] && !strcmpiW( (*section)->name, name ))
{ {
PROFILESECTION *to_del = *section; PROFILESECTION *to_del = *section;
*section = to_del->next; *section = to_del->next;
@ -515,12 +524,12 @@ static BOOL PROFILE_DeleteKey( PROFILESECTION **section,
{ {
while (*section) while (*section)
{ {
if ((*section)->name[0] && !_wcsicmp( (*section)->name, section_name )) if ((*section)->name[0] && !strcmpiW( (*section)->name, section_name ))
{ {
PROFILEKEY **key = &(*section)->key; PROFILEKEY **key = &(*section)->key;
while (*key) while (*key)
{ {
if (!_wcsicmp( (*key)->name, key_name )) if (!strcmpiW( (*key)->name, key_name ))
{ {
PROFILEKEY *to_del = *key; PROFILEKEY *to_del = *key;
*key = to_del->next; *key = to_del->next;
@ -547,7 +556,7 @@ static void PROFILE_DeleteAllKeys( LPCWSTR section_name)
PROFILESECTION **section= &CurProfile->section; PROFILESECTION **section= &CurProfile->section;
while (*section) while (*section)
{ {
if ((*section)->name[0] && !_wcsicmp( (*section)->name, section_name )) if ((*section)->name[0] && !strcmpiW( (*section)->name, section_name ))
{ {
PROFILEKEY **key = &(*section)->key; PROFILEKEY **key = &(*section)->key;
while (*key) while (*key)
@ -577,7 +586,7 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
while (PROFILE_isspaceW(*section_name)) section_name++; while (PROFILE_isspaceW(*section_name)) section_name++;
if (*section_name) if (*section_name)
p = section_name + wcslen(section_name) - 1; p = section_name + strlenW(section_name) - 1;
else else
p = section_name; p = section_name;
@ -586,7 +595,7 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
while (PROFILE_isspaceW(*key_name)) key_name++; while (PROFILE_isspaceW(*key_name)) key_name++;
if (*key_name) if (*key_name)
p = key_name + wcslen(key_name) - 1; p = key_name + strlenW(key_name) - 1;
else else
p = key_name; p = key_name;
@ -596,7 +605,7 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
while (*section) while (*section)
{ {
if ( ((*section)->name[0]) if ( ((*section)->name[0])
&& (!(_wcsnicmp( (*section)->name, section_name, seclen ))) && (!(strncmpiW( (*section)->name, section_name, seclen )))
&& (((*section)->name)[seclen] == '\0') ) && (((*section)->name)[seclen] == '\0') )
{ {
PROFILEKEY **key = &(*section)->key; PROFILEKEY **key = &(*section)->key;
@ -610,17 +619,16 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
*/ */
if(!create_always) if(!create_always)
{ {
if ( (!(_wcsnicmp( (*key)->name, key_name, keylen ))) if ( (!(strncmpiW( (*key)->name, key_name, keylen )))
&& (((*key)->name)[keylen] == '\0') ) && (((*key)->name)[keylen] == '\0') )
return *key; return *key;
} }
key = &(*key)->next; key = &(*key)->next;
} }
if (!create) if (!create) return NULL;
if (!(*key = HeapAlloc( GetProcessHeap(), 0, sizeof(PROFILEKEY) + strlenW(key_name) * sizeof(WCHAR) )))
return NULL; return NULL;
if (!(*key = HeapAlloc( GetProcessHeap(), 0, sizeof(PROFILEKEY) + wcslen(key_name) * sizeof(WCHAR) ))) strcpyW( (*key)->name, key_name );
return NULL;
wcscpy( (*key)->name, key_name );
(*key)->value = NULL; (*key)->value = NULL;
(*key)->next = NULL; (*key)->next = NULL;
return *key; return *key;
@ -628,17 +636,17 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
section = &(*section)->next; section = &(*section)->next;
} }
if (!create) return NULL; if (!create) return NULL;
*section = HeapAlloc( GetProcessHeap(), 0, sizeof(PROFILESECTION) + wcslen(section_name) * sizeof(WCHAR) ); *section = HeapAlloc( GetProcessHeap(), 0, sizeof(PROFILESECTION) + strlenW(section_name) * sizeof(WCHAR) );
if(*section == NULL) return NULL; if(*section == NULL) return NULL;
wcscpy( (*section)->name, section_name ); strcpyW( (*section)->name, section_name );
(*section)->next = NULL; (*section)->next = NULL;
if (!((*section)->key = HeapAlloc( GetProcessHeap(), 0, if (!((*section)->key = HeapAlloc( GetProcessHeap(), 0,
sizeof(PROFILEKEY) + wcslen(key_name) * sizeof(WCHAR) ))) sizeof(PROFILEKEY) + strlenW(key_name) * sizeof(WCHAR) )))
{ {
HeapFree(GetProcessHeap(), 0, *section); HeapFree(GetProcessHeap(), 0, *section);
return NULL; return NULL;
} }
wcscpy( (*section)->key->name, key_name ); strcpyW( (*section)->key->name, key_name );
(*section)->key->value = NULL; (*section)->key->value = NULL;
(*section)->key->next = NULL; (*section)->key->next = NULL;
return (*section)->key; return (*section)->key;
@ -657,7 +665,7 @@ static BOOL PROFILE_FlushFile(void)
if(!CurProfile) if(!CurProfile)
{ {
DPRINT("No current profile!\n"); WARN("No current profile!\n");
return FALSE; return FALSE;
} }
@ -668,11 +676,11 @@ static BOOL PROFILE_FlushFile(void)
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
{ {
DPRINT("could not save profile file %S (error was %ld)\n", CurProfile->filename, GetLastError()); WARN("could not save profile file %s (error was %d)\n", debugstr_w(CurProfile->filename), GetLastError());
return FALSE; return FALSE;
} }
DPRINT("Saving %S\n", CurProfile->filename); TRACE("Saving %s\n", debugstr_w(CurProfile->filename));
PROFILE_Save( hFile, CurProfile->section, CurProfile->encoding ); PROFILE_Save( hFile, CurProfile->section, CurProfile->encoding );
if(GetFileTime(hFile, NULL, NULL, &LastWriteTime)) if(GetFileTime(hFile, NULL, NULL, &LastWriteTime))
CurProfile->LastWriteTime=LastWriteTime; CurProfile->LastWriteTime=LastWriteTime;
@ -715,7 +723,7 @@ static BOOL is_not_current(FILETIME * ft)
GetSystemTimeAsFileTime(&Now); GetSystemTimeAsFileTime(&Now);
ftll = ((LONGLONG)ft->dwHighDateTime << 32) + ft->dwLowDateTime; ftll = ((LONGLONG)ft->dwHighDateTime << 32) + ft->dwLowDateTime;
nowll = ((LONGLONG)Now.dwHighDateTime << 32) + Now.dwLowDateTime; nowll = ((LONGLONG)Now.dwHighDateTime << 32) + Now.dwLowDateTime;
DPRINT("%08x;%08x\n",(unsigned)ftll+21000000,(unsigned)nowll); TRACE("%08x;%08x\n",(unsigned)ftll+21000000,(unsigned)nowll);
return ftll + 21000000 < nowll; return ftll + 21000000 < nowll;
} }
@ -726,7 +734,6 @@ static BOOL is_not_current(FILETIME * ft)
*/ */
static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access ) static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
{ {
WCHAR windirW[MAX_PATH];
WCHAR buffer[MAX_PATH]; WCHAR buffer[MAX_PATH];
HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hFile = INVALID_HANDLE_VALUE;
FILETIME LastWriteTime; FILETIME LastWriteTime;
@ -749,18 +756,18 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
ZeroMemory(&MRUProfile[i]->LastWriteTime, sizeof(FILETIME)); ZeroMemory(&MRUProfile[i]->LastWriteTime, sizeof(FILETIME));
} }
GetWindowsDirectoryW( windirW, MAX_PATH );
if (!filename) if (!filename)
filename = wininiW; filename = wininiW;
if ((RtlDetermineDosPathNameType_U(filename) == RtlPathTypeRelative) && if ((RtlDetermineDosPathNameType_U(filename) == RELATIVE_PATH) &&
!wcschr(filename, '\\') && !wcschr(filename, '/')) !strchrW(filename, '\\') && !strchrW(filename, '/'))
{ {
static const WCHAR wszSeparator[] = {'\\', 0}; static const WCHAR wszSeparator[] = {'\\', 0};
wcscpy(buffer, windirW); WCHAR windirW[MAX_PATH];
wcscat(buffer, wszSeparator); GetWindowsDirectoryW( windirW, MAX_PATH );
wcscat(buffer, filename); strcpyW(buffer, windirW);
strcatW(buffer, wszSeparator);
strcatW(buffer, filename);
} }
else else
{ {
@ -768,7 +775,7 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
GetFullPathNameW(filename, sizeof(buffer)/sizeof(buffer[0]), buffer, &dummy); GetFullPathNameW(filename, sizeof(buffer)/sizeof(buffer[0]), buffer, &dummy);
} }
DPRINT("path: %S\n", buffer); TRACE("path: %s\n", debugstr_w(buffer));
hFile = CreateFileW(buffer, GENERIC_READ | (write_access ? GENERIC_WRITE : 0), hFile = CreateFileW(buffer, GENERIC_READ | (write_access ? GENERIC_WRITE : 0),
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
@ -776,40 +783,43 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_FILE_NOT_FOUND)) if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_FILE_NOT_FOUND))
{ {
DPRINT("Error %ld opening file %S\n", GetLastError(), buffer); WARN("Error %d opening file %s\n", GetLastError(), debugstr_w(buffer));
return FALSE; return FALSE;
} }
for(i = 0; i < N_CACHED_PROFILES; i++) for(i=0;i<N_CACHED_PROFILES;i++)
{ {
if ((MRUProfile[i]->filename && !wcscmp( buffer, MRUProfile[i]->filename ))) if ((MRUProfile[i]->filename && !strcmpiW( buffer, MRUProfile[i]->filename )))
{ {
DPRINT("MRU Filename: %S, new filename: %S\n", MRUProfile[i]->filename, buffer); TRACE("MRU Filename: %s, new filename: %s\n", debugstr_w(MRUProfile[i]->filename), debugstr_w(buffer));
if(i) if(i)
{ {
PROFILE_FlushFile(); PROFILE_FlushFile();
tempProfile=MRUProfile[i]; tempProfile=MRUProfile[i];
for (j = i; j > 0; j--) for(j=i;j>0;j--)
MRUProfile[j] = MRUProfile[j-1]; MRUProfile[j]=MRUProfile[j-1];
CurProfile=tempProfile; CurProfile=tempProfile;
} }
if (hFile != INVALID_HANDLE_VALUE) if (hFile != INVALID_HANDLE_VALUE)
{ {
GetFileTime(hFile, NULL, NULL, &LastWriteTime); GetFileTime(hFile, NULL, NULL, &LastWriteTime);
if (!memcmp( &CurProfile->LastWriteTime, &LastWriteTime, sizeof(FILETIME) ) && if (!memcmp( &CurProfile->LastWriteTime, &LastWriteTime, sizeof(FILETIME) ) &&
is_not_current(&LastWriteTime)) is_not_current(&LastWriteTime))
DPRINT("(%S): already opened (mru=%d)\n", buffer, i); TRACE("(%s): already opened (mru=%d)\n",
debugstr_w(buffer), i);
else else
{ {
DPRINT("(%S): already opened, needs refreshing (mru=%d)\n", buffer, i); TRACE("(%s): already opened, needs refreshing (mru=%d)\n",
debugstr_w(buffer), i);
PROFILE_Free(CurProfile->section); PROFILE_Free(CurProfile->section);
CurProfile->section = PROFILE_Load(hFile, &CurProfile->encoding); CurProfile->section = PROFILE_Load(hFile, &CurProfile->encoding);
CurProfile->LastWriteTime = LastWriteTime; CurProfile->LastWriteTime = LastWriteTime;
} }
CloseHandle(hFile); CloseHandle(hFile);
} }
else DPRINT("(%S): already opened (mru = %d)\n", buffer, i ); else TRACE("(%s): already opened, not yet created (mru=%d)\n",
debugstr_w(buffer), i);
return TRUE; return TRUE;
} }
} }
@ -818,23 +828,18 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
PROFILE_FlushFile(); PROFILE_FlushFile();
/* Make the oldest profile the current one only in order to get rid of it */ /* Make the oldest profile the current one only in order to get rid of it */
if(i == N_CACHED_PROFILES) if(i==N_CACHED_PROFILES)
{ {
tempProfile = MRUProfile[N_CACHED_PROFILES-1]; tempProfile=MRUProfile[N_CACHED_PROFILES-1];
for (i = N_CACHED_PROFILES - 1; i > 0; i--) for(i=N_CACHED_PROFILES-1;i>0;i--)
MRUProfile[i] = MRUProfile[i-1]; MRUProfile[i]=MRUProfile[i-1];
CurProfile=tempProfile; CurProfile=tempProfile;
} }
if(CurProfile->filename) PROFILE_ReleaseFile(); if(CurProfile->filename) PROFILE_ReleaseFile();
/* OK, now that CurProfile is definitely free we assign it our new file */ /* OK, now that CurProfile is definitely free we assign it our new file */
CurProfile->filename = HeapAlloc( GetProcessHeap(), 0, (wcslen(buffer)+1) * sizeof(WCHAR) ); CurProfile->filename = HeapAlloc( GetProcessHeap(), 0, (strlenW(buffer)+1) * sizeof(WCHAR) );
if(CurProfile->filename == NULL) strcpyW( CurProfile->filename, buffer );
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
wcscpy( CurProfile->filename, buffer );
if (hFile != INVALID_HANDLE_VALUE) if (hFile != INVALID_HANDLE_VALUE)
{ {
@ -845,7 +850,7 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
else else
{ {
/* Does not exist yet, we will create it in PROFILE_FlushFile */ /* Does not exist yet, we will create it in PROFILE_FlushFile */
DPRINT("profile file %S not found\n", buffer); WARN("profile file %s not found\n", debugstr_w(buffer) );
} }
return TRUE; return TRUE;
} }
@ -858,17 +863,17 @@ static BOOL PROFILE_Open( LPCWSTR filename, BOOL write_access )
* If return_values is TRUE, also include the corresponding values. * If return_values is TRUE, also include the corresponding values.
*/ */
static INT PROFILE_GetSection( PROFILESECTION *section, LPCWSTR section_name, static INT PROFILE_GetSection( PROFILESECTION *section, LPCWSTR section_name,
LPWSTR buffer, UINT len, BOOL return_values ) LPWSTR buffer, DWORD len, BOOL return_values )
{ {
PROFILEKEY *key; PROFILEKEY *key;
if(!buffer) return 0; if(!buffer) return 0;
DPRINT("%S,%p,%u\n", section_name, buffer, len); TRACE("%s,%p,%u\n", debugstr_w(section_name), buffer, len);
while (section) while (section)
{ {
if (section->name[0] && !_wcsicmp( section->name, section_name )) if (section->name[0] && !strcmpiW( section->name, section_name ))
{ {
UINT oldlen = len; UINT oldlen = len;
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
@ -878,26 +883,25 @@ static INT PROFILE_GetSection( PROFILESECTION *section, LPCWSTR section_name,
if (IS_ENTRY_COMMENT(key->name)) continue; /* Skip comments */ if (IS_ENTRY_COMMENT(key->name)) continue; /* Skip comments */
if (!return_values && !key->value) continue; /* Skip lines w.o. '=' */ if (!return_values && !key->value) continue; /* Skip lines w.o. '=' */
PROFILE_CopyEntry( buffer, key->name, len - 1, 0 ); PROFILE_CopyEntry( buffer, key->name, len - 1, 0 );
len -= wcslen(buffer) + 1; len -= strlenW(buffer) + 1;
buffer += wcslen(buffer) + 1; buffer += strlenW(buffer) + 1;
if (len < 2) if (len < 2)
break; break;
if (return_values && key->value) if (return_values && key->value) {
{
buffer[-1] = '='; buffer[-1] = '=';
PROFILE_CopyEntry ( buffer, key->value, len - 1, 0 ); PROFILE_CopyEntry ( buffer, key->value, len - 1, 0 );
len -= wcslen(buffer) + 1; len -= strlenW(buffer) + 1;
buffer += wcslen(buffer) + 1; buffer += strlenW(buffer) + 1;
} }
} }
*buffer = '\0'; *buffer = '\0';
if (len <= 1) if (len <= 1)
{
/*If either lpszSection or lpszKey is NULL and the supplied /*If either lpszSection or lpszKey is NULL and the supplied
destination buffer is too small to hold all the strings, destination buffer is too small to hold all the strings,
the last string is truncated and followed by two null characters. the last string is truncated and followed by two null characters.
In this case, the return value is equal to cchReturnBuffer In this case, the return value is equal to cchReturnBuffer
minus two. */ minus two. */
{
buffer[-1] = '\0'; buffer[-1] = '\0';
return oldlen - 2; return oldlen - 2;
} }
@ -910,35 +914,35 @@ static INT PROFILE_GetSection( PROFILESECTION *section, LPCWSTR section_name,
} }
/* See GetPrivateProfileSectionNamesA for documentation */ /* See GetPrivateProfileSectionNamesA for documentation */
static INT PROFILE_GetSectionNames( LPWSTR buffer, UINT len ) static INT PROFILE_GetSectionNames( LPWSTR buffer, DWORD len )
{ {
LPWSTR buf; LPWSTR buf;
UINT buflen,tmplen; UINT buflen,tmplen;
PROFILESECTION *section; PROFILESECTION *section;
DPRINT("(%p, %d)\n", buffer, len); TRACE("(%p, %d)\n", buffer, len);
if (!buffer || !len) if (!buffer || !len)
return 0; return 0;
if (len == 1) { if (len==1) {
*buffer = '\0'; *buffer='\0';
return 0; return 0;
} }
buflen=len-1; buflen=len-1;
buf = buffer; buf=buffer;
section = CurProfile->section; section = CurProfile->section;
while ((section!=NULL)) { while ((section!=NULL)) {
if (section->name[0]) { if (section->name[0]) {
tmplen = wcslen(section->name)+1; tmplen = strlenW(section->name)+1;
if (tmplen >= buflen) { if (tmplen >= buflen) {
if (buflen > 0) { if (buflen > 0) {
memcpy(buf, section->name, (buflen - 1) * sizeof(WCHAR)); memcpy(buf, section->name, (buflen-1) * sizeof(WCHAR));
buf += buflen - 1; buf += buflen-1;
*buf++ = '\0'; *buf++='\0';
} }
*buf='\0'; *buf='\0';
return len - 2; return len-2;
} }
memcpy(buf, section->name, tmplen * sizeof(WCHAR)); memcpy(buf, section->name, tmplen * sizeof(WCHAR));
buf += tmplen; buf += tmplen;
@ -946,8 +950,8 @@ static INT PROFILE_GetSectionNames( LPWSTR buffer, UINT len )
} }
section = section->next; section = section->next;
} }
*buf = '\0'; *buf='\0';
return buf - buffer; return buf-buffer;
} }
@ -974,12 +978,12 @@ static INT PROFILE_GetSectionNames( LPWSTR buffer, UINT len )
* *
*/ */
static INT PROFILE_GetString( LPCWSTR section, LPCWSTR key_name, static INT PROFILE_GetString( LPCWSTR section, LPCWSTR key_name,
LPCWSTR def_val, LPWSTR buffer, UINT len ) LPCWSTR def_val, LPWSTR buffer, DWORD len )
{ {
PROFILEKEY *key = NULL; PROFILEKEY *key = NULL;
static const WCHAR empty_strW[] = { 0 }; static const WCHAR empty_strW[] = { 0 };
if (!buffer || !len) return 0; if(!buffer || !len) return 0;
if (!def_val) def_val = empty_strW; if (!def_val) def_val = empty_strW;
if (key_name) if (key_name)
@ -987,17 +991,16 @@ static INT PROFILE_GetString( LPCWSTR section, LPCWSTR key_name,
if (!key_name[0]) if (!key_name[0])
{ {
PROFILE_CopyEntry(buffer, def_val, len, TRUE); PROFILE_CopyEntry(buffer, def_val, len, TRUE);
return wcslen(buffer); return strlenW(buffer);
} }
key = PROFILE_Find( &CurProfile->section, section, key_name, FALSE, FALSE); key = PROFILE_Find( &CurProfile->section, section, key_name, FALSE, FALSE);
PROFILE_CopyEntry( buffer, (key && key->value) ? key->value : def_val, PROFILE_CopyEntry( buffer, (key && key->value) ? key->value : def_val,
len, TRUE ); len, TRUE );
DPRINT("(%S, %S, %S): returning %S\n", TRACE("(%s,%s,%s): returning %s\n",
section, key_name, debugstr_w(section), debugstr_w(key_name),
def_val, buffer); debugstr_w(def_val), debugstr_w(buffer) );
return wcslen(buffer); return strlenW( buffer );
} }
/* no "else" here ! */ /* no "else" here ! */
if (section && section[0]) if (section && section[0])
{ {
@ -1005,7 +1008,7 @@ static INT PROFILE_GetString( LPCWSTR section, LPCWSTR key_name,
if (!buffer[0]) /* no luck -> def_val */ if (!buffer[0]) /* no luck -> def_val */
{ {
PROFILE_CopyEntry(buffer, def_val, len, TRUE); PROFILE_CopyEntry(buffer, def_val, len, TRUE);
ret = wcslen(buffer); ret = strlenW(buffer);
} }
return ret; return ret;
} }
@ -1024,7 +1027,7 @@ static BOOL PROFILE_SetString( LPCWSTR section_name, LPCWSTR key_name,
{ {
if (!key_name) /* Delete a whole section */ if (!key_name) /* Delete a whole section */
{ {
DPRINT("(%S)\n", section_name); TRACE("(%s)\n", debugstr_w(section_name));
CurProfile->changed |= PROFILE_DeleteSection( &CurProfile->section, CurProfile->changed |= PROFILE_DeleteSection( &CurProfile->section,
section_name ); section_name );
return TRUE; /* Even if PROFILE_DeleteSection() has failed, return TRUE; /* Even if PROFILE_DeleteSection() has failed,
@ -1032,7 +1035,7 @@ static BOOL PROFILE_SetString( LPCWSTR section_name, LPCWSTR key_name,
} }
else if (!value) /* Delete a key */ else if (!value) /* Delete a key */
{ {
DPRINT("(%S, %S)\n", section_name, key_name); TRACE("(%s,%s)\n", debugstr_w(section_name), debugstr_w(key_name) );
CurProfile->changed |= PROFILE_DeleteKey( &CurProfile->section, CurProfile->changed |= PROFILE_DeleteKey( &CurProfile->section,
section_name, key_name ); section_name, key_name );
return TRUE; /* same error handling as above */ return TRUE; /* same error handling as above */
@ -1041,8 +1044,8 @@ static BOOL PROFILE_SetString( LPCWSTR section_name, LPCWSTR key_name,
{ {
PROFILEKEY *key = PROFILE_Find(&CurProfile->section, section_name, PROFILEKEY *key = PROFILE_Find(&CurProfile->section, section_name,
key_name, TRUE, create_always ); key_name, TRUE, create_always );
DPRINT("(%S, %S, %S):\n", TRACE("(%s,%s,%s):\n",
section_name, key_name, value); debugstr_w(section_name), debugstr_w(key_name), debugstr_w(value) );
if (!key) return FALSE; if (!key) return FALSE;
/* strip the leading spaces. We can safely strip \n\r and /* strip the leading spaces. We can safely strip \n\r and
@ -1051,25 +1054,17 @@ static BOOL PROFILE_SetString( LPCWSTR section_name, LPCWSTR key_name,
if (key->value) if (key->value)
{ {
if (!wcscmp( key->value, value )) if (!strcmpW( key->value, value ))
{ {
DPRINT(" no change needed\n" ); TRACE(" no change needed\n" );
return TRUE; /* No change needed */ return TRUE; /* No change needed */
} }
DPRINT(" replacing %S\n", key->value); TRACE(" replacing %s\n", debugstr_w(key->value) );
HeapFree( GetProcessHeap(), 0, key->value ); HeapFree( GetProcessHeap(), 0, key->value );
} }
else else TRACE(" creating key\n" );
{ key->value = HeapAlloc( GetProcessHeap(), 0, (strlenW(value)+1) * sizeof(WCHAR) );
DPRINT(" creating key\n"); strcpyW( key->value, value );
}
key->value = HeapAlloc( GetProcessHeap(), 0, (wcslen(value) + 1) * sizeof(WCHAR) );
if(key->value == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
wcscpy( key->value, value );
CurProfile->changed = TRUE; CurProfile->changed = TRUE;
} }
return TRUE; return TRUE;
@ -1092,7 +1087,7 @@ UINT WINAPI GetProfileIntA( LPCSTR section, LPCSTR entry, INT def_val )
*/ */
UINT WINAPI GetProfileIntW( LPCWSTR section, LPCWSTR entry, INT def_val ) UINT WINAPI GetProfileIntW( LPCWSTR section, LPCWSTR entry, INT def_val )
{ {
return GetPrivateProfileIntW( section, entry, def_val, L"win.ini" ); return GetPrivateProfileIntW( section, entry, def_val, wininiW );
} }
/*********************************************************************** /***********************************************************************
@ -1105,13 +1100,13 @@ DWORD WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
int ret; int ret;
LPWSTR defval_tmp = NULL; LPWSTR defval_tmp = NULL;
DPRINT("%S, %S, %S, %p, %u, %S\n", TRACE("%s,%s,%s,%p,%u,%s\n", debugstr_w(section), debugstr_w(entry),
section, entry, def_val, buffer, len, filename); debugstr_w(def_val), buffer, len, debugstr_w(filename));
/* strip any trailing ' ' of def_val. */ /* strip any trailing ' ' of def_val. */
if (def_val) if (def_val)
{ {
LPCWSTR p = def_val + wcslen(def_val) - 1; LPCWSTR p = def_val + strlenW(def_val) - 1;
while (p > def_val && *p == ' ') while (p > def_val && *p == ' ')
p--; p--;
@ -1121,7 +1116,6 @@ DWORD WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
int len = (int)(p - def_val) + 1; int len = (int)(p - def_val) + 1;
defval_tmp = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR)); defval_tmp = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
if (!defval_tmp) return 0;
memcpy(defval_tmp, def_val, len * sizeof(WCHAR)); memcpy(defval_tmp, def_val, len * sizeof(WCHAR));
defval_tmp[len] = '\0'; defval_tmp[len] = '\0';
def_val = defval_tmp; def_val = defval_tmp;
@ -1138,7 +1132,7 @@ DWORD WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
ret = PROFILE_GetString( section, entry, def_val, buffer, len ); ret = PROFILE_GetString( section, entry, def_val, buffer, len );
} else if (buffer && def_val) { } else if (buffer && def_val) {
lstrcpynW( buffer, def_val, len ); lstrcpynW( buffer, def_val, len );
ret = wcslen( buffer ); ret = strlenW( buffer );
} }
else else
ret = 0; ret = 0;
@ -1147,7 +1141,7 @@ DWORD WINAPI GetPrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
HeapFree(GetProcessHeap(), 0, defval_tmp); HeapFree(GetProcessHeap(), 0, defval_tmp);
DPRINT("returning %S, %d\n", buffer, ret); TRACE("returning %s, %d\n", debugstr_w(buffer), ret);
return ret; return ret;
} }
@ -1176,7 +1170,7 @@ DWORD WINAPI GetPrivateProfileStringA( LPCSTR section, LPCSTR entry,
retW = GetPrivateProfileStringW( sectionW.Buffer, entryW.Buffer, retW = GetPrivateProfileStringW( sectionW.Buffer, entryW.Buffer,
def_valW.Buffer, bufferW, len, def_valW.Buffer, bufferW, len,
filenameW.Buffer); filenameW.Buffer);
if (len) if (len && buffer)
{ {
if (retW) if (retW)
{ {
@ -1212,7 +1206,7 @@ DWORD WINAPI GetProfileStringW( LPCWSTR section, LPCWSTR entry,
LPCWSTR def_val, LPWSTR buffer, DWORD len ) LPCWSTR def_val, LPWSTR buffer, DWORD len )
{ {
return GetPrivateProfileStringW( section, entry, def_val, return GetPrivateProfileStringW( section, entry, def_val,
buffer, len, L"win.ini" ); buffer, len, wininiW );
} }
/*********************************************************************** /***********************************************************************
@ -1230,7 +1224,7 @@ BOOL WINAPI WriteProfileStringA( LPCSTR section, LPCSTR entry,
BOOL WINAPI WriteProfileStringW( LPCWSTR section, LPCWSTR entry, BOOL WINAPI WriteProfileStringW( LPCWSTR section, LPCWSTR entry,
LPCWSTR string ) LPCWSTR string )
{ {
return WritePrivateProfileStringW( section, entry, string, L"win.ini" ); return WritePrivateProfileStringW( section, entry, string, wininiW );
} }
@ -1300,7 +1294,7 @@ DWORD WINAPI GetPrivateProfileSectionW( LPCWSTR section, LPWSTR buffer,
return 0; return 0;
} }
DPRINT("(%S, %p, %ld, %S)\n", section, buffer, len, filename); TRACE("(%s, %p, %d, %s)\n", debugstr_w(section), buffer, len, debugstr_w(filename));
RtlEnterCriticalSection( &PROFILE_CritSect ); RtlEnterCriticalSection( &PROFILE_CritSect );
@ -1329,12 +1323,6 @@ DWORD WINAPI GetPrivateProfileSectionA( LPCSTR section, LPSTR buffer,
} }
bufferW = HeapAlloc(GetProcessHeap(), 0, len * 2 * sizeof(WCHAR)); bufferW = HeapAlloc(GetProcessHeap(), 0, len * 2 * sizeof(WCHAR));
if (!bufferW)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
RtlCreateUnicodeStringFromAsciiz(&sectionW, section); RtlCreateUnicodeStringFromAsciiz(&sectionW, section);
if (filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename); if (filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename);
else filenameW.Buffer = NULL; else filenameW.Buffer = NULL;
@ -1377,7 +1365,7 @@ DWORD WINAPI GetProfileSectionA( LPCSTR section, LPSTR buffer, DWORD len )
*/ */
DWORD WINAPI GetProfileSectionW( LPCWSTR section, LPWSTR buffer, DWORD len ) DWORD WINAPI GetProfileSectionW( LPCWSTR section, LPWSTR buffer, DWORD len )
{ {
return GetPrivateProfileSectionW( section, buffer, len, L"win.ini" ); return GetPrivateProfileSectionW( section, buffer, len, wininiW );
} }
@ -1465,20 +1453,14 @@ BOOL WINAPI WritePrivateProfileSectionW( LPCWSTR section,
PROFILE_DeleteAllKeys(section); PROFILE_DeleteAllKeys(section);
ret = TRUE; ret = TRUE;
while(*string) { while(*string) {
LPWSTR buf = HeapAlloc( GetProcessHeap(), 0, (wcslen(string)+1) * sizeof(WCHAR) ); LPWSTR buf = HeapAlloc( GetProcessHeap(), 0, (strlenW(string)+1) * sizeof(WCHAR) );
if(buf == NULL) strcpyW( buf, string );
{ if((p = strchrW( buf, '='))) {
RtlLeaveCriticalSection( &PROFILE_CritSect ); *p='\0';
SetLastError(ERROR_NOT_ENOUGH_MEMORY); ret = PROFILE_SetString( section, buf, p+1, TRUE);
return FALSE;
}
wcscpy( buf, string );
if((p = wcschr( buf, '='))) {
*p = '\0';
ret = PROFILE_SetString( section, buf, p + 1, TRUE);
} }
HeapFree( GetProcessHeap(), 0, buf ); HeapFree( GetProcessHeap(), 0, buf );
string += wcslen(string) + 1; string += strlenW(string)+1;
} }
PROFILE_FlushFile(); PROFILE_FlushFile();
} }
@ -1530,7 +1512,7 @@ BOOL WINAPI WritePrivateProfileSectionA( LPCSTR section,
BOOL WINAPI WriteProfileSectionA( LPCSTR section, LPCSTR keys_n_values) BOOL WINAPI WriteProfileSectionA( LPCSTR section, LPCSTR keys_n_values)
{ {
return WritePrivateProfileSectionA(section, keys_n_values, "win.ini"); return WritePrivateProfileSectionA( section, keys_n_values, "win.ini");
} }
/*********************************************************************** /***********************************************************************
@ -1641,33 +1623,29 @@ BOOL WINAPI GetPrivateProfileStructW (LPCWSTR section, LPCWSTR key,
RtlEnterCriticalSection( &PROFILE_CritSect ); RtlEnterCriticalSection( &PROFILE_CritSect );
if (PROFILE_Open( filename, FALSE )) if (PROFILE_Open( filename, FALSE )) {
{
PROFILEKEY *k = PROFILE_Find ( &CurProfile->section, section, key, FALSE, FALSE); PROFILEKEY *k = PROFILE_Find ( &CurProfile->section, section, key, FALSE, FALSE);
if (k) if (k) {
{ TRACE("value (at %p): %s\n", k->value, debugstr_w(k->value));
DPRINT("value (at %p): %S\n", k->value, k->value); if (((strlenW(k->value) - 2) / 2) == len)
if (((wcslen(k->value) - 2) / 2) == len)
{ {
LPWSTR end, p; LPWSTR end, p;
BOOL valid = TRUE; BOOL valid = TRUE;
WCHAR c; WCHAR c;
DWORD chksum = 0; DWORD chksum = 0;
end = k->value + wcslen(k->value); /* -> '\0' */ end = k->value + strlenW(k->value); /* -> '\0' */
/* check for invalid chars in ASCII coded hex string */ /* check for invalid chars in ASCII coded hex string */
for (p = k->value; p < end; p++) for (p=k->value; p < end; p++)
{ {
if (!isxdigit(*p)) if (!isxdigitW(*p))
{ {
DPRINT("invalid char '%x' in file %S->[%S]->%S !\n", WARN("invalid char '%x' in file %s->[%s]->%s !\n",
*p, filename, section, key); *p, debugstr_w(filename), debugstr_w(section), debugstr_w(key));
valid = FALSE; valid = FALSE;
break; break;
} }
} }
if (valid) if (valid)
{ {
BOOL highnibble = TRUE; BOOL highnibble = TRUE;
@ -1676,10 +1654,11 @@ BOOL WINAPI GetPrivateProfileStructW (LPCWSTR section, LPCWSTR key,
end -= 2; /* don't include checksum in output data */ end -= 2; /* don't include checksum in output data */
/* translate ASCII hex format into binary data */ /* translate ASCII hex format into binary data */
for (p = k->value; p < end; p++) for (p=k->value; p < end; p++)
{ {
c = towupper(*p); c = toupperW(*p);
val = (c > '9') ? (c - 'A' + 10) : (c - '0'); val = (c > '9') ?
(c - 'A' + 10) : (c - '0');
if (highnibble) if (highnibble)
b = val << 4; b = val << 4;
@ -1691,11 +1670,10 @@ BOOL WINAPI GetPrivateProfileStructW (LPCWSTR section, LPCWSTR key,
} }
highnibble ^= 1; /* toggle */ highnibble ^= 1; /* toggle */
} }
/* retrieve stored checksum value */ /* retrieve stored checksum value */
c = towupper(*p++); c = toupperW(*p++);
b = ( (c > '9') ? (c - 'A' + 10) : (c - '0') ) << 4; b = ( (c > '9') ? (c - 'A' + 10) : (c - '0') ) << 4;
c = towupper(*p); c = toupperW(*p);
b += (c > '9') ? (c - 'A' + 10) : (c - '0'); b += (c > '9') ? (c - 'A' + 10) : (c - '0');
if (b == (chksum & 0xff)) /* checksums match ? */ if (b == (chksum & 0xff)) /* checksums match ? */
ret = TRUE; ret = TRUE;
@ -1752,14 +1730,8 @@ BOOL WINAPI WritePrivateProfileStructW (LPCWSTR section, LPCWSTR key,
/* allocate string buffer for hex chars + checksum hex char + '\0' */ /* allocate string buffer for hex chars + checksum hex char + '\0' */
outstring = HeapAlloc( GetProcessHeap(), 0, (bufsize*2 + 2 + 1) * sizeof(WCHAR) ); outstring = HeapAlloc( GetProcessHeap(), 0, (bufsize*2 + 2 + 1) * sizeof(WCHAR) );
if(outstring == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
p = outstring; p = outstring;
for (binbuf = (LPBYTE)buf; binbuf < (LPBYTE)buf+bufsize; binbuf++) for (binbuf = (LPBYTE)buf; binbuf < (LPBYTE)buf+bufsize; binbuf++) {
{
*p++ = hex[*binbuf >> 4]; *p++ = hex[*binbuf >> 4];
*p++ = hex[*binbuf & 0xf]; *p++ = hex[*binbuf & 0xf];
sum += *binbuf; sum += *binbuf;
@ -1771,8 +1743,7 @@ BOOL WINAPI WritePrivateProfileStructW (LPCWSTR section, LPCWSTR key,
RtlEnterCriticalSection( &PROFILE_CritSect ); RtlEnterCriticalSection( &PROFILE_CritSect );
if (PROFILE_Open( filename, TRUE )) if (PROFILE_Open( filename, TRUE )) {
{
ret = PROFILE_SetString( section, key, outstring, FALSE); ret = PROFILE_SetString( section, key, outstring, FALSE);
PROFILE_FlushFile(); PROFILE_FlushFile();
} }
@ -1787,8 +1758,7 @@ BOOL WINAPI WritePrivateProfileStructW (LPCWSTR section, LPCWSTR key,
/*********************************************************************** /***********************************************************************
* WritePrivateProfileStructA (KERNEL32.@) * WritePrivateProfileStructA (KERNEL32.@)
*/ */
BOOL WINAPI BOOL WINAPI WritePrivateProfileStructA (LPCSTR section, LPCSTR key,
WritePrivateProfileStructA (LPCSTR section, LPCSTR key,
LPVOID buf, UINT bufsize, LPCSTR filename) LPVOID buf, UINT bufsize, LPCSTR filename)
{ {
UNICODE_STRING sectionW, keyW, filenameW; UNICODE_STRING sectionW, keyW, filenameW;
@ -1815,9 +1785,8 @@ WritePrivateProfileStructA (LPCSTR section, LPCSTR key,
/*********************************************************************** /***********************************************************************
* OpenProfileUserMapping (KERNEL32.@) * OpenProfileUserMapping (KERNEL32.@)
*/ */
BOOL WINAPI OpenProfileUserMapping(VOID) BOOL WINAPI OpenProfileUserMapping(void) {
{ FIXME("(), stub!\n");
DPRINT1("(), stub!\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; return FALSE;
} }
@ -1825,24 +1794,8 @@ BOOL WINAPI OpenProfileUserMapping(VOID)
/*********************************************************************** /***********************************************************************
* CloseProfileUserMapping (KERNEL32.@) * CloseProfileUserMapping (KERNEL32.@)
*/ */
BOOL WINAPI CloseProfileUserMapping(VOID) BOOL WINAPI CloseProfileUserMapping(void) {
{ FIXME("(), stub!\n");
DPRINT1("(), stub!\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @unimplemented
*/
BOOL
WINAPI
QueryWin31IniFilesMappedToRegistry(DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2,
DWORD Unknown3)
{
DPRINT1("QueryWin31IniFilesMappedToRegistry not implemented\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; return FALSE;
} }

File diff suppressed because it is too large Load diff

View file

@ -3,15 +3,15 @@
#include "wine/unicode.h" #include "wine/unicode.h"
const WCHAR wine_casemap_lower[3318] = const WCHAR wine_casemap_lower[3802] =
{ {
/* index */ /* index */
0x01bf, 0x02bf, 0x03bf, 0x0439, 0x0539, 0x0639, 0x0100, 0x0100, 0x01bf, 0x02bf, 0x03bf, 0x044f, 0x054f, 0x064f, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0699, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x06af, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0799, 0x0892, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x07af, 0x08ae,
0x0100, 0x098f, 0x0100, 0x0100, 0x0a13, 0x0100, 0x0100, 0x0100, 0x0100, 0x09ab, 0x0100, 0x0100, 0x0a2f, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0b13, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0b2f, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@ -26,6 +26,7 @@ const WCHAR wine_casemap_lower[3318] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0c1d, 0x0cfb,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@ -36,8 +37,7 @@ const WCHAR wine_casemap_lower[3318] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0dda,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0bf6,
/* defaults */ /* defaults */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -162,23 +162,25 @@ const WCHAR wine_casemap_lower[3318] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x0386 .. 0x03ff */ /* 0x0370 .. 0x03ff */
0x0026, 0x0000, 0x0025, 0x0025, 0x0025, 0x0000, 0x0040, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x003f, 0x003f, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0026, 0x0000,
0x0025, 0x0025, 0x0025, 0x0000, 0x0040, 0x0000, 0x003f, 0x003f,
0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffc4, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0000, 0x0001, 0x0000, 0xfff9, 0x0001, 0x0000, 0x0000, 0xff7e, 0x0000, 0x0000, 0x0000, 0x0000, 0xffc4, 0x0000, 0x0000, 0x0001,
0xff7e, 0xff7e, 0x0000, 0xfff9, 0x0001, 0x0000, 0x0000, 0xff7e, 0xff7e, 0xff7e,
/* 0x0400 .. 0x04ff */ /* 0x0400 .. 0x04ff */
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
@ -215,9 +217,9 @@ const WCHAR wine_casemap_lower[3318] =
/* 0x0500 .. 0x05ff */ /* 0x0500 .. 0x05ff */
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,
0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,
@ -278,52 +280,52 @@ const WCHAR wine_casemap_lower[3318] =
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe241, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
/* 0x1f01 .. 0x1fff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0xfff8, 0x0000, 0xfff8, 0x0000, 0xfff8, 0x0000, 0xfff8, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x1f07 .. 0x1fff */
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xfff8, 0x0000, 0xfff8, 0x0000, 0xfff8, 0x0000,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0xfff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0xfff8, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xffb6, 0xffb6, 0xfff7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xffb6, 0xffb6, 0xfff7, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xffaa, 0xffaa, 0xffaa, 0xffaa, 0xfff7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffaa,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffaa, 0xffaa, 0xffaa, 0xfff7, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xff9c, 0xff9c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xff9c, 0xff9c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xfff8, 0xfff8, 0xff90, 0xff90, 0xfff9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff8, 0xff90, 0xff90, 0xfff9, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xff80, 0xff80, 0xff82, 0xff82, 0xfff7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff80,
0x0000, 0xff80, 0xff82, 0xff82, 0xfff7, 0x0000, 0x0000, 0x0000,
/* 0x2103 .. 0x21ff */ /* 0x2103 .. 0x21ff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -389,9 +391,9 @@ const WCHAR wine_casemap_lower[3318] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0xd609, 0xf11a, 0xd619, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0xd609, 0xf11a, 0xd619, 0x0000, 0x0000, 0x0001,
0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0xd5e4, 0xd603, 0xd5e1,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0xd5e2, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c1, 0xd5c1,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
@ -405,14 +407,74 @@ const WCHAR wine_casemap_lower[3318] =
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa612 .. 0xa6ff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xff1d .. 0xffff */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa722 .. 0xa7ff */
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0000, 0x0001, 0x0000, 0x75fc, 0x0001, 0x0000, 0x0001, 0x0000,
0x0001, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xff21 .. 0xffff */
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -436,10 +498,9 @@ const WCHAR wine_casemap_lower[3318] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
0x0000, 0x0000, 0x0000
}; };
const WCHAR wine_casemap_upper[3582] = const WCHAR wine_casemap_upper[3994] =
{ {
/* index */ /* index */
0x019f, 0x029f, 0x039f, 0x045a, 0x0556, 0x0656, 0x0100, 0x0100, 0x019f, 0x029f, 0x039f, 0x045a, 0x0556, 0x0656, 0x0100, 0x0100,
@ -462,6 +523,7 @@ const WCHAR wine_casemap_upper[3582] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0cfe, 0x0ddb,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@ -472,8 +534,7 @@ const WCHAR wine_casemap_upper[3582] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0e9a,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0cfe,
/* defaults */ /* defaults */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -569,14 +630,14 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x2a3f,
0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x2a3f, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0x0000, 0x0000, 0xff2e, 0xff32, 0x0000, 0xff33, 0xff33, 0x2a1f, 0x2a1c, 0x2a1e, 0xff2e, 0xff32, 0x0000, 0xff33, 0xff33,
0x0000, 0xff36, 0x0000, 0xff35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff36, 0x0000, 0xff35, 0x0000, 0x0000, 0x0000, 0x0000,
0xff33, 0x0000, 0x0000, 0xff31, 0x0000, 0x0000, 0x0000, 0x0000, 0xff33, 0x0000, 0x0000, 0xff31, 0x0000, 0x0000, 0x0000, 0x0000,
0xff2f, 0xff2d, 0x0000, 0x29f7, 0x0000, 0x0000, 0x0000, 0xff2d, 0xff2f, 0xff2d, 0x0000, 0x29f7, 0x0000, 0x0000, 0x0000, 0xff2d,
0x0000, 0x0000, 0xff2b, 0x0000, 0x0000, 0xff2a, 0x0000, 0x0000, 0x0000, 0x29fd, 0xff2b, 0x0000, 0x0000, 0xff2a, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x29e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x29e7, 0x0000, 0x0000,
0xff26, 0x0000, 0x0000, 0xff26, 0x0000, 0x0000, 0x0000, 0x0000, 0xff26, 0x0000, 0x0000, 0xff26, 0x0000, 0x0000, 0x0000, 0x0000,
0xff26, 0xffbb, 0xff27, 0xff27, 0xffb9, 0x0000, 0x0000, 0x0000, 0xff26, 0xffbb, 0xff27, 0xff27, 0xffb9, 0x0000, 0x0000, 0x0000,
@ -600,8 +661,8 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0082, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0082, 0x0082,
0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -613,7 +674,7 @@ const WCHAR wine_casemap_upper[3582] =
0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe1, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe1, 0xffe0, 0xffe0,
0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffc0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffc0,
0xffc1, 0xffc1, 0x0000, 0xffc2, 0xffc7, 0x0000, 0x0000, 0x0000, 0xffc1, 0xffc1, 0x0000, 0xffc2, 0xffc7, 0x0000, 0x0000, 0x0000,
0xffd1, 0xffca, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffd1, 0xffca, 0xfff8, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0xffaa, 0xffb0, 0x0007, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffaa, 0xffb0, 0x0007, 0x0000, 0x0000,
@ -655,9 +716,9 @@ const WCHAR wine_casemap_upper[3582] =
/* 0x0500 .. 0x05ff */ /* 0x0500 .. 0x05ff */
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -686,7 +747,7 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x1d79 .. 0x1dff */ /* 0x1d79 .. 0x1dff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0ee6, 0x0000, 0x0000, 0x0000, 0x8a04, 0x0000, 0x0000, 0x0000, 0x0ee6, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -735,7 +796,7 @@ const WCHAR wine_casemap_upper[3582] =
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
/* 0x1f00 .. 0x1fff */ /* 0x1f00 .. 0x1fff */
0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -831,7 +892,7 @@ const WCHAR wine_casemap_upper[3582] =
0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0, 0xffd0,
0xffd0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xd5d5, 0xffd0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xd5d5,
0xd5d8, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xd5d8, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
@ -846,8 +907,8 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
/* 0x2d00 .. 0x2dff */ /* 0x2d00 .. 0x2dff */
@ -883,6 +944,60 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa641 .. 0xa6ff */
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa723 .. 0xa7ff */
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xff41 .. 0xffff */ /* 0xff41 .. 0xffff */
0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0,
0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0,
@ -909,14 +1024,14 @@ const WCHAR wine_casemap_upper[3582] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
}; };
const WCHAR wine_digitmap[4619] = const WCHAR wine_digitmap[5837] =
{ {
/* index */ /* index */
0x01d0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x028a, 0x0384, 0x01d0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x028a, 0x0384,
0x0100, 0x044e, 0x053e, 0x062e, 0x071e, 0x080e, 0x08be, 0x099e, 0x0100, 0x044e, 0x053e, 0x062e, 0x071e, 0x080e, 0x08be, 0x099e,
0x0a5e, 0x0100, 0x0100, 0x0af5, 0x0100, 0x0100, 0x0100, 0x0b67, 0x0a5e, 0x0100, 0x0100, 0x0af8, 0x0100, 0x0100, 0x0100, 0x0b6a,
0x0c57, 0x0d11, 0x0100, 0x0deb, 0x0100, 0x0100, 0x0100, 0x0100, 0x0c5a, 0x0d14, 0x0def, 0x0e9f, 0x0f5f, 0x0100, 0x0100, 0x0100,
0x0e7b, 0x0100, 0x0100, 0x0100, 0x0f1b, 0x0100, 0x0100, 0x101b, 0x0fef, 0x0100, 0x0100, 0x0100, 0x108f, 0x0100, 0x0100, 0x118f,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@ -932,6 +1047,8 @@ const WCHAR wine_digitmap[4619] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x126f, 0x0100,
0x129f, 0x139f, 0x1479, 0x14d3, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@ -941,9 +1058,7 @@ const WCHAR wine_digitmap[4619] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x15cd,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x110b,
/* defaults */ /* defaults */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1276,6 +1391,8 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xefa0, 0xefa0, 0xefa0, 0xefa0, 0xefa0, 0xefa0, 0xefa0, 0xefa0,
0xefa0, 0xefa0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1288,11 +1405,9 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1366 .. 0x13ff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecc8, 0xecc8, 0xecc8, 0xecc8, 0xecc8,
/* 0x1369 .. 0x13ff */ 0xecc8, 0xecc8, 0xecc8, 0xecc8, 0x0000, 0x0000, 0x0000, 0x0000,
0xecc8, 0xecc8, 0xecc8, 0xecc8, 0xecc8, 0xecc8, 0xecc8, 0xecc8,
0xecc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1309,7 +1424,8 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000,
/* 0x178e .. 0x17ff */ /* 0x178e .. 0x17ff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1376,20 +1492,69 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xe660, 0xe660, 0xe660, 0xe660, 0xe660, 0xe660, 0x0000, 0x0000, 0xe660, 0xe660, 0xe660, 0xe660, 0xe660, 0xe660,
0xe660, 0xe660, 0xe660, 0xe660, 0x0000, 0x0000, 0x0000, 0x0000, 0xe660, 0xe660, 0xe660, 0xe660, 0xe657, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
/* 0x1b26 .. 0x1bff */ /* 0x1a25 .. 0x1aff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xe5b0, 0xe5b0, 0xe5b0, 0xe5b0, 0xe5b0,
0xe5b0, 0xe5b0, 0xe5b0, 0xe5b0, 0xe5b0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xe5a0, 0xe5a0, 0xe5a0, 0xe5a0, 0xe5a0,
0xe5a0, 0xe5a0, 0xe5a0, 0xe5a0, 0xe5a0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000,
/* 0x1b50 .. 0x1bff */
0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0, 0xe4e0,
0xe4e0, 0xe4e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xe480, 0xe480, 0xe480, 0xe480, 0xe480, 0xe480, 0xe480, 0xe480,
0xe480, 0xe480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x1c40 .. 0x1cff */
0xe3f0, 0xe3f0, 0xe3f0, 0xe3f0, 0xe3f0, 0xe3f0, 0xe3f0, 0xe3f0,
0xe3f0, 0xe3f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xe3e0, 0xe3e0, 0xe3e0, 0xe3e0, 0xe3e0, 0xe3e0, 0xe3e0, 0xe3e0,
0xe3e0, 0xe3e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1410,7 +1575,6 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000,
/* 0x2070 .. 0x20ff */ /* 0x2070 .. 0x20ff */
0xdfc0, 0x0000, 0x0000, 0x0000, 0xdfc0, 0xdfc0, 0xdfc0, 0xdfc0, 0xdfc0, 0x0000, 0x0000, 0x0000, 0xdfc0, 0xdfc0, 0xdfc0, 0xdfc0,
0xdfc0, 0xdfc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfc0, 0xdfc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1484,9 +1648,121 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xff10 .. 0xffff */ /* 0xa620 .. 0xa6ff */
0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x5a10, 0x5a10, 0x5a10, 0x5a10, 0x5a10, 0x5a10, 0x5a10, 0x5a10,
0x0120, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a10, 0x5a10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa8d0 .. 0xa8ff */
0x5760, 0x5760, 0x5760, 0x5760, 0x5760, 0x5760, 0x5760, 0x5760,
0x5760, 0x5760, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xa900 .. 0xa9ff */
0x5730, 0x5730, 0x5730, 0x5730, 0x5730, 0x5730, 0x5730, 0x5730,
0x5730, 0x5730, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x5660, 0x5660, 0x5660, 0x5660, 0x5660, 0x5660, 0x5660, 0x5660,
0x5660, 0x5660, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xaa26 .. 0xaaff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x55e0, 0x55e0, 0x55e0, 0x55e0, 0x55e0, 0x55e0,
0x55e0, 0x55e0, 0x55e0, 0x55e0, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000,
/* 0xaba6 .. 0xabff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440,
0x5440, 0x5440, 0x5440, 0x5440, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000,
/* 0xff06 .. 0xffff */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120,
0x0120, 0x0120, 0x0120, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@ -1514,7 +1790,8 @@ const WCHAR wine_digitmap[4619] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000
}; };
const WCHAR wine_compatmap[1497] = const WCHAR wine_compatmap[1497] =
{ {
@ -1631,7 +1908,7 @@ const WCHAR wine_compatmap[1497] =
0x7f06, 0x7f0c, 0x7f3b, 0x7f3b, 0x7fec, 0x802c, 0x816a, 0x839d, 0x7f06, 0x7f0c, 0x7f3b, 0x7f3b, 0x7fec, 0x802c, 0x816a, 0x839d,
0x83b1, 0x83e8, 0x8518, 0x85aa, 0x8791, 0x881c, 0x881b, 0x89f8, 0x83b1, 0x83e8, 0x8518, 0x85aa, 0x8791, 0x881c, 0x881b, 0x89f8,
0x8eb0, 0x8f35, 0x909f, 0x90d6, 0x926f, 0x92a3, 0x9550, 0x95d1, 0x8eb0, 0x8f35, 0x909f, 0x90d6, 0x926f, 0x92a3, 0x9550, 0x95d1,
0x9c7b, 0x9d96, 0x9dd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c7b, 0x9d96, 0x9dd1, 0x660a, 0x4882, 0x87ab, 0x0000, 0x0000,
0x53b6, 0x5744, 0x56f6, 0x550d, 0x56d1, 0x570b, 0x5851, 0x5883, 0x53b6, 0x5744, 0x56f6, 0x550d, 0x56d1, 0x570b, 0x5851, 0x5883,
0x5b25, 0x5adc, 0x5b1f, 0x5b67, 0x5dde, 0x5e36, 0x5ec6, 0x5ed5, 0x5b25, 0x5adc, 0x5b1f, 0x5b67, 0x5dde, 0x5e36, 0x5ec6, 0x5ed5,
0x5fe2, 0x60a7, 0x6450, 0x6456, 0x64e5, 0x6528, 0x6652, 0x66c7, 0x5fe2, 0x60a7, 0x6450, 0x6456, 0x64e5, 0x6528, 0x6652, 0x66c7,

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* Unicode collation element table */ /* Unicode collation element table */
/* generated from www.unicode.org/reports/tr10/allkeys.txt */ /* generated from http://www.unicode.org/reports/tr10/allkeys.txt */
/* DO NOT EDIT!! */ /* DO NOT EDIT!! */
const unsigned int collation_table[12800] = const unsigned int collation_table[12800] =

View file

@ -19,10 +19,24 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <k32.h> #include <stdarg.h>
#define NDEBUG #include <stdio.h>
#include <debug.h> #include <string.h>
DEBUG_CHANNEL(resource);
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winternl.h"
#include "winuser.h"
#include "winnls.h"
#include "wine/unicode.h"
#include "wine/debug.h"
extern HMODULE kernel32_handle;
WINE_DEFAULT_DEBUG_CHANNEL(resource);
struct format_args struct format_args
{ {
@ -31,8 +45,6 @@ struct format_args
int last; int last;
}; };
static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0};
/* Messages used by FormatMessage /* Messages used by FormatMessage
* *
* They can be specified either directly or using a message ID and * They can be specified either directly or using a message ID and
@ -63,7 +75,7 @@ static const WCHAR FMTWSTR[] = { '%','s',0 };
*/ */
static LPWSTR load_message( HMODULE module, UINT id, WORD lang ) static LPWSTR load_message( HMODULE module, UINT id, WORD lang )
{ {
PMESSAGE_RESOURCE_ENTRY mre; const MESSAGE_RESOURCE_ENTRY *mre;
WCHAR *buffer; WCHAR *buffer;
NTSTATUS status; NTSTATUS status;
@ -389,7 +401,6 @@ DWORD WINAPI FormatMessageA(
DWORD destlength; DWORD destlength;
LPWSTR from; LPWSTR from;
DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK;
HMODULE kernel32_handle = GetModuleHandleW(kernel32W);
TRACE("(0x%x,%p,%d,0x%x,%p,%d,%p)\n", TRACE("(0x%x,%p,%d,0x%x,%p,%d,%p)\n",
dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args);
@ -496,7 +507,6 @@ DWORD WINAPI FormatMessageW(
DWORD talloced; DWORD talloced;
LPWSTR from; LPWSTR from;
DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK;
HMODULE kernel32_handle = GetModuleHandleW(kernel32W);
TRACE("(0x%x,%p,%d,0x%x,%p,%d,%p)\n", TRACE("(0x%x,%p,%d,0x%x,%p,%d,%p)\n",
dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args);

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
* *
* Copyright 1995 Martin von Loewis * Copyright 1995 Martin von Loewis
* Copyright 1998 David Lee Lambert * Copyright 1998 David Lee Lambert
* Copyright 2000 Julio César zquez * Copyright 2000 Julio C©sar G°zquez
* Copyright 2003 Jon Griffiths * Copyright 2003 Jon Griffiths
* Copyright 2005 Dmitry Timoshkov * Copyright 2005 Dmitry Timoshkov
* *
@ -22,17 +22,24 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
/* //#include "config.h"
* Whole file ripped from Wine's dlls\kernel\lcformat.c, rev 1.7 and is //#include "wine/port.h"
* unchanged except that includes are different. I thought about adding
* @implemeted to each exported function, but this might make merging harder?
* -Gunnar
*/
#include <k32.h> #include <string.h>
#define NDEBUG #include <stdarg.h>
#include <debug.h> #include <stdio.h>
DEBUG_CHANNEL(resource); #include <stdlib.h>
#include "windef.h"
#include "winbase.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "winternl.h"
#define CRITICAL_SECTION RTL_CRITICAL_SECTION
#define CRITICAL_SECTION_DEBUG RTL_CRITICAL_SECTION_DEBUG
WINE_DEFAULT_DEBUG_CHANNEL(nls);
#define DATE_DATEVARSONLY 0x0100 /* only date stuff: yMdg */ #define DATE_DATEVARSONLY 0x0100 /* only date stuff: yMdg */
#define TIME_TIMEVARSONLY 0x0200 /* only time stuff: hHmst */ #define TIME_TIMEVARSONLY 0x0200 /* only time stuff: hHmst */
@ -77,15 +84,15 @@ typedef struct _NLS_FORMAT_NODE
#define GetShortMonth(fmt,mth) fmt->lppszStrings[42 + mth] #define GetShortMonth(fmt,mth) fmt->lppszStrings[42 + mth]
/* Write access to the cache is protected by this critical section */ /* Write access to the cache is protected by this critical section */
static RTL_CRITICAL_SECTION NLS_FormatsCS; static CRITICAL_SECTION NLS_FormatsCS;
static RTL_CRITICAL_SECTION_DEBUG NLS_FormatsCS_debug = static CRITICAL_SECTION_DEBUG NLS_FormatsCS_debug =
{ {
0, 0, &NLS_FormatsCS, 0, 0, &NLS_FormatsCS,
{ &NLS_FormatsCS_debug.ProcessLocksList, { &NLS_FormatsCS_debug.ProcessLocksList,
&NLS_FormatsCS_debug.ProcessLocksList }, &NLS_FormatsCS_debug.ProcessLocksList },
0, 0, 0, 0, 0 0, 0, 0
}; };
static RTL_CRITICAL_SECTION NLS_FormatsCS = { &NLS_FormatsCS_debug, -1, 0, 0, 0, 0 }; static CRITICAL_SECTION NLS_FormatsCS = { &NLS_FormatsCS_debug, -1, 0, 0, 0, 0 };
/************************************************************************** /**************************************************************************
* NLS_GetLocaleNumber <internal> * NLS_GetLocaleNumber <internal>
@ -1044,10 +1051,8 @@ INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags,
TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue), TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue),
lpFormat, lpNumberStr, cchOut); lpFormat, lpNumberStr, cchOut);
lcid = ConvertDefaultLocale(lcid);
if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpNumberStr) || if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpNumberStr) ||
!IsValidLocale(lcid, LCID_INSTALLED) || !IsValidLocale(lcid, 0) ||
(lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep))) (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep)))
{ {
goto error; goto error;
@ -1417,10 +1422,8 @@ INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags,
TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue), TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue),
lpFormat, lpCurrencyStr, cchOut); lpFormat, lpCurrencyStr, cchOut);
lcid = ConvertDefaultLocale(lcid);
if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) || if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) ||
!IsValidLocale(lcid, LCID_INSTALLED) || !IsValidLocale(lcid, 0) ||
(lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep || (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep ||
!lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 || !lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 ||
lpFormat->PositiveOrder > 3))) lpFormat->PositiveOrder > 3)))

View file

@ -1669,6 +1669,185 @@ static INT WideCharToUtf7(LPCWSTR pszWide, INT cchWide, LPSTR pszUtf7, INT cchUt
return c; return c;
} }
static BOOL
GetLocalisedText(DWORD dwResId, WCHAR *lpszDest)
{
HRSRC hrsrc;
LCID lcid;
LANGID langId;
DWORD dwId;
if (dwResId == 37)
dwId = dwResId * 100;
else
dwId = dwResId;
lcid = GetUserDefaultLCID();
lcid = ConvertDefaultLocale(lcid);
langId = LANGIDFROMLCID(lcid);
if (PRIMARYLANGID(langId) == LANG_NEUTRAL)
langId = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
hrsrc = FindResourceExW(hCurrentModule,
(LPWSTR)RT_STRING,
MAKEINTRESOURCEW((dwId >> 4) + 1),
langId);
if (hrsrc)
{
HGLOBAL hmem = LoadResource(hCurrentModule, hrsrc);
if (hmem)
{
const WCHAR *p;
unsigned int i;
p = LockResource(hmem);
for (i = 0; i < (dwId & 0x0f); i++) p += *p + 1;
memcpy(lpszDest, p + 1, *p * sizeof(WCHAR));
lpszDest[*p] = '\0';
return TRUE;
}
}
DPRINT1("Could not get codepage name. dwResId = %ld\n", dwResId);
return FALSE;
}
/*
* @implemented
*/
BOOL
WINAPI
GetCPInfo(UINT CodePage,
LPCPINFO CodePageInfo)
{
PCODEPAGE_ENTRY CodePageEntry;
if (!CodePageInfo)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
CodePageEntry = IntGetCodePageEntry(CodePage);
if (CodePageEntry == NULL)
{
switch(CodePage)
{
case CP_UTF7:
case CP_UTF8:
CodePageInfo->DefaultChar[0] = 0x3f;
CodePageInfo->DefaultChar[1] = 0;
CodePageInfo->LeadByte[0] = CodePageInfo->LeadByte[1] = 0;
CodePageInfo->MaxCharSize = (CodePage == CP_UTF7) ? 5 : 4;
return TRUE;
}
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (CodePageEntry->CodePageTable.DefaultChar & 0xff00)
{
CodePageInfo->DefaultChar[0] = (CodePageEntry->CodePageTable.DefaultChar & 0xff00) >> 8;
CodePageInfo->DefaultChar[1] = CodePageEntry->CodePageTable.DefaultChar & 0x00ff;
}
else
{
CodePageInfo->DefaultChar[0] = CodePageEntry->CodePageTable.DefaultChar & 0xff;
CodePageInfo->DefaultChar[1] = 0;
}
if ((CodePageInfo->MaxCharSize = CodePageEntry->CodePageTable.MaximumCharacterSize) == 2)
memcpy(CodePageInfo->LeadByte, CodePageEntry->CodePageTable.LeadByte, sizeof(CodePageInfo->LeadByte));
else
CodePageInfo->LeadByte[0] = CodePageInfo->LeadByte[1] = 0;
return TRUE;
}
/*
* @implemented
*/
BOOL
WINAPI
GetCPInfoExW(UINT CodePage,
DWORD dwFlags,
LPCPINFOEXW lpCPInfoEx)
{
if (!GetCPInfo(CodePage, (LPCPINFO) lpCPInfoEx))
return FALSE;
switch(CodePage)
{
case CP_UTF7:
{
lpCPInfoEx->CodePage = CP_UTF7;
lpCPInfoEx->UnicodeDefaultChar = 0x3f;
return GetLocalisedText((DWORD)CodePage, lpCPInfoEx->CodePageName);
}
break;
case CP_UTF8:
{
lpCPInfoEx->CodePage = CP_UTF8;
lpCPInfoEx->UnicodeDefaultChar = 0x3f;
return GetLocalisedText((DWORD)CodePage, lpCPInfoEx->CodePageName);
}
default:
{
PCODEPAGE_ENTRY CodePageEntry;
CodePageEntry = IntGetCodePageEntry(CodePage);
if (CodePageEntry == NULL)
{
DPRINT1("Could not get CodePage Entry! CodePageEntry = 0\n");
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
lpCPInfoEx->CodePage = CodePageEntry->CodePageTable.CodePage;
lpCPInfoEx->UnicodeDefaultChar = CodePageEntry->CodePageTable.UniDefaultChar;
return GetLocalisedText((DWORD)CodePage, lpCPInfoEx->CodePageName);
}
break;
}
}
/*
* @implemented
*/
BOOL
WINAPI
GetCPInfoExA(UINT CodePage,
DWORD dwFlags,
LPCPINFOEXA lpCPInfoEx)
{
CPINFOEXW CPInfo;
if (!GetCPInfoExW(CodePage, dwFlags, &CPInfo))
return FALSE;
/* the layout is the same except for CodePageName */
memcpy(lpCPInfoEx, &CPInfo, sizeof(CPINFOEXA));
WideCharToMultiByte(CP_ACP,
0,
CPInfo.CodePageName,
-1,
lpCPInfoEx->CodePageName,
sizeof(lpCPInfoEx->CodePageName),
NULL,
NULL);
return TRUE;
}
/** /**
* @name WideCharToMultiByte * @name WideCharToMultiByte
* *

View file

@ -19,6 +19,7 @@
*/ */
#include "wine/unicode.h" #include "wine/unicode.h"
#define get_char_typeW(x) iswctype((x) >> 8, (x) & 0xFF)
extern int get_decomposition(WCHAR src, WCHAR *dst, unsigned int dstlen); extern int get_decomposition(WCHAR src, WCHAR *dst, unsigned int dstlen);
extern const unsigned int collation_table[]; extern const unsigned int collation_table[];
@ -52,7 +53,7 @@ int wine_get_sortkey(int flags, const WCHAR *src, int srclen, char *dst, int dst
* and skips white space and punctuation characters for * and skips white space and punctuation characters for
* NORM_IGNORESYMBOLS. * NORM_IGNORESYMBOLS.
*/ */
if ((flags & NORM_IGNORESYMBOLS) && (iswctype(wch, _SPACE | _PUNCT))) if ((flags & NORM_IGNORESYMBOLS) && (get_char_typeW(wch) & (C1_PUNCT | C1_SPACE)))
continue; continue;
if (flags & NORM_IGNORECASE) wch = tolowerW(wch); if (flags & NORM_IGNORECASE) wch = tolowerW(wch);
@ -110,7 +111,7 @@ int wine_get_sortkey(int flags, const WCHAR *src, int srclen, char *dst, int dst
* and skips white space and punctuation characters for * and skips white space and punctuation characters for
* NORM_IGNORESYMBOLS. * NORM_IGNORESYMBOLS.
*/ */
if ((flags & NORM_IGNORESYMBOLS) && (iswctype(wch, _SPACE | _PUNCT))) if ((flags & NORM_IGNORESYMBOLS) && (get_char_typeW(wch) & (C1_PUNCT | C1_SPACE)))
continue; continue;
if (flags & NORM_IGNORECASE) wch = tolowerW(wch); if (flags & NORM_IGNORECASE) wch = tolowerW(wch);
@ -171,13 +172,13 @@ static inline int compare_unicode_weights(int flags, const WCHAR *str1, int len1
{ {
int skip = 0; int skip = 0;
/* FIXME: not tested */ /* FIXME: not tested */
if (iswctype(*str1, _SPACE | _PUNCT)) if (get_char_typeW(*str1) & (C1_PUNCT | C1_SPACE))
{ {
str1++; str1++;
len1--; len1--;
skip = 1; skip = 1;
} }
if (iswctype(*str2, _SPACE | _PUNCT)) if (get_char_typeW(*str2) & (C1_PUNCT | C1_SPACE))
{ {
str2++; str2++;
len2--; len2--;
@ -242,13 +243,13 @@ static inline int compare_diacritic_weights(int flags, const WCHAR *str1, int le
{ {
int skip = 0; int skip = 0;
/* FIXME: not tested */ /* FIXME: not tested */
if (iswctype(*str1, _SPACE | _PUNCT)) if (get_char_typeW(*str1) & (C1_PUNCT | C1_SPACE))
{ {
str1++; str1++;
len1--; len1--;
skip = 1; skip = 1;
} }
if (iswctype(*str2, _SPACE | _PUNCT)) if (get_char_typeW(*str2) & (C1_PUNCT | C1_SPACE))
{ {
str2++; str2++;
len2--; len2--;
@ -291,13 +292,13 @@ static inline int compare_case_weights(int flags, const WCHAR *str1, int len1,
{ {
int skip = 0; int skip = 0;
/* FIXME: not tested */ /* FIXME: not tested */
if (iswctype(*str1, _SPACE | _PUNCT)) if (get_char_typeW(*str1) & (C1_PUNCT | C1_SPACE))
{ {
str1++; str1++;
len1--; len1--;
skip = 1; skip = 1;
} }
if (iswctype(*str2, _SPACE | _PUNCT)) if (get_char_typeW(*str2) & (C1_PUNCT | C1_SPACE))
{ {
str2++; str2++;
len2--; len2--;