PATCH: kernel new compiler
Marcus Meissner
marcus at jet.franken.de
Fri Jul 16 08:17:44 CDT 2004
Hi,
This is by far the largest patch of the new compiler fixes.
I have reviewed it line by line several times, but have not found
a testcase in short notice, so it might not be correct.
Ciao, Marcus
Changelog:
Converted the 32->16 converter functions to use
constructs which work with the new gcc.
Index: dlls/kernel/resource16.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/resource16.c,v
retrieving revision 1.6
diff -u -r1.6 resource16.c
--- dlls/kernel/resource16.c 27 Nov 2003 00:59:36 -0000 1.6
+++ dlls/kernel/resource16.c 16 Jul 2004 13:15:25 -0000
@@ -409,74 +409,133 @@
return prevHandler;
}
+static DWORD __get_DWORD(LPBYTE *p) {
+ DWORD __tmp = *(DWORD*)*p;
+
+ *p += sizeof(DWORD);
+ return __tmp;
+}
+
+static DWORD __put_DWORD(LPBYTE *p, DWORD d) {
+ *(DWORD*)*p = d;
+ *p += sizeof(DWORD);
+ return d;
+}
+
+static DWORD __copy_DWORD(LPBYTE *dialog16, LPBYTE *p) {
+ DWORD __tmp = *(DWORD*)*p;;
+
+ *(DWORD*)*dialog16 = __tmp;
+ *p += sizeof(DWORD);
+ *dialog16 += sizeof(DWORD);
+ return __tmp;
+}
+
+#define COPY_DWORD __copy_DWORD(&dialog16,&p)
+
+static WORD __copy_WORD(LPBYTE *dialog16, LPBYTE *p) {
+ WORD __tmp = *(WORD*)*p;;
+
+ *(WORD*)*dialog16 = __tmp;
+ *p += sizeof(WORD);
+ *dialog16 += sizeof(WORD);
+ return __tmp;
+}
+
+#define COPY_WORD __copy_WORD(&dialog16,&p)
+
+static WORD __get_WORD(LPBYTE *p) {
+ WORD __tmp = *(WORD*)*p;
+
+ *p += sizeof(WORD);
+ return __tmp;
+}
+
+static WORD __put_WORD(LPBYTE *p, WORD w) {
+ *(WORD*)*p = w;
+ *p += sizeof(WORD);
+ return w;
+}
+
+static BYTE __get_BYTE(LPBYTE *p) {
+ BYTE __tmp = **p;
+ *p++;
+ return __tmp;
+}
+
+static BYTE __put_BYTE(LPBYTE *p, BYTE b) {
+ **p = b;
+ *p++;
+ return b;
+}
/**********************************************************************
* ConvertDialog32To16 (KERNEL.615)
*/
-VOID WINAPI ConvertDialog32To16( LPVOID dialog32, DWORD size, LPVOID dialog16 )
+VOID WINAPI ConvertDialog32To16( LPVOID dialog32, DWORD size, LPVOID _dialog16 )
{
- LPVOID p = dialog32;
+ LPBYTE p = dialog32;
+ LPBYTE dialog16 = _dialog16;
WORD nbItems, data, dialogEx;
DWORD style;
- style = *((DWORD *)dialog16)++ = *((DWORD *)p)++;
- dialogEx = (style == 0xffff0001); /* DIALOGEX resource */
+ style = COPY_DWORD;
+ dialogEx = (style == 0xffff0001); /* DIALOGEX resource */
if (dialogEx)
{
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
- style = *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
+ COPY_DWORD; /* helpID */
+ COPY_DWORD; /* exStyle */
+ style = COPY_DWORD; /* style */
}
else
- ((DWORD *)p)++; /* exStyle ignored in 16-bit standard dialog */
+ p += sizeof(DWORD); /* exStyle ignored in 16-bit standard dialog */
- nbItems = *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++;
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
+ nbItems = __put_BYTE(&dialog16,__get_WORD(&p));
+ COPY_WORD; /* x */
+ COPY_WORD; /* y */
+ COPY_WORD; /* cx */
+ COPY_WORD; /* cy */
/* Transfer menu name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
- case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
- *((WORD *)dialog16)++ = *((WORD *)p)++; break;
+ case 0x0000: __get_WORD(&p); __put_BYTE(&dialog16,0); break;
+ case 0xffff: __get_WORD(&p); __put_BYTE(&dialog16,0xff); COPY_WORD; break;
+
default: WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
break;
}
/* Transfer class name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
- case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
- *((WORD *)dialog16)++ = *((WORD *)p)++; break;
+ case 0x0000: __get_WORD(&p); __put_BYTE(&dialog16,0); break;
+ case 0xffff: __get_WORD(&p); __put_BYTE(&dialog16,0xff); COPY_WORD; break;
default: WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
break;
}
/* Transfer window caption */
WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
/* Transfer font info */
if (style & DS_SETFONT)
{
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* pointSize */
+ COPY_WORD; /* pointSize */
if (dialogEx)
{
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* weight */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* italic */
+ COPY_WORD; /* weight */
+ COPY_WORD; /* italic */
}
WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL ); /* faceName */
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
}
/* Transfer dialog items */
@@ -487,65 +546,67 @@
if (dialogEx)
{
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
+ COPY_DWORD; /* helpID */
+ COPY_DWORD; /* exStyle */
+ COPY_DWORD; /* style */
}
else
{
- style = *((DWORD *)p)++; /* save style */
- ((DWORD *)p)++; /* ignore exStyle */
+ style = __get_DWORD(&p); /* save style */
+ __get_DWORD(&p); /* ignore exStyle */
}
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
+ COPY_WORD; /* x */
+ COPY_WORD; /* y */
+ COPY_WORD; /* cx */
+ COPY_WORD; /* cy */
if (dialogEx)
- *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* ID */
+ COPY_DWORD; /* ID */
else
{
- *((WORD *)dialog16)++ = *((WORD *)p)++; /* ID */
- *((DWORD *)dialog16)++ = style; /* style from above */
+ COPY_WORD; /* ID */
+ __put_DWORD(&dialog16,style); /* style from above */
}
/* Transfer class name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
- case 0xffff: ((WORD *)p)++;
- *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++; break;
+ case 0x0000: __get_WORD(&p);
+ __put_BYTE(&dialog16,0);
+ break;
+ case 0xffff: __get_WORD(&p);
+ __put_BYTE(&dialog16,__get_WORD(&p));
+ break;
default: WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
break;
}
/* Transfer window name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
- case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
- *((WORD *)dialog16)++ = *((WORD *)p)++; break;
+ case 0x0000: __get_WORD(&p);__put_BYTE(&dialog16,0); break;
+ case 0xffff: __get_WORD(&p); __put_BYTE(&dialog16,0xff); COPY_WORD; break;
default: WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
- ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ dialog16 += strlen( (LPSTR)dialog16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
break;
}
/* Transfer data */
- data = *((WORD *)p)++;
+ data = __get_WORD(&p);
if (dialogEx)
- *((WORD *)dialog16)++ = data;
+ __put_WORD(&dialog16, data);
else
- *((BYTE *)dialog16)++ = (BYTE)data;
+ __put_BYTE(&dialog16,(BYTE)data);
if (data)
{
memcpy( dialog16, p, data );
- (LPSTR)dialog16 += data;
- (LPSTR)p += data;
+ dialog16 += data;
+ p += data;
}
/* Next item */
@@ -559,56 +620,56 @@
*/
WORD WINAPI GetDialog32Size16( LPVOID dialog32 )
{
- LPVOID p = dialog32;
+ LPBYTE p = dialog32;
WORD nbItems, data, dialogEx;
DWORD style;
- style = *((DWORD *)p)++;
+ style = __get_DWORD(&p);
dialogEx = (style == 0xffff0001); /* DIALOGEX resource */
if (dialogEx)
{
- ((DWORD *)p)++; /* helpID */
- ((DWORD *)p)++; /* exStyle */
- style = *((DWORD *)p)++; /* style */
+ __get_DWORD(&p); /* helpID */
+ __get_DWORD(&p); /* exStyle */
+ style = __get_DWORD(&p); /* style */
}
else
- ((DWORD *)p)++; /* exStyle */
+ __get_DWORD(&p); /* exStyle */
- nbItems = *((WORD *)p)++;
- ((WORD *)p)++; /* x */
- ((WORD *)p)++; /* y */
- ((WORD *)p)++; /* cx */
- ((WORD *)p)++; /* cy */
+ nbItems = __get_WORD(&p);
+ __get_WORD(&p); /* x */
+ __get_WORD(&p); /* y */
+ __get_WORD(&p); /* cx */
+ __get_WORD(&p); /* cy */
/* Skip menu name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; break;
- case 0xffff: ((WORD *)p) += 2; break;
- default: ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+ case 0x0000: __get_WORD(&p); break;
+ case 0xffff: __get_WORD(&p); __get_WORD(&p); break;
+ default: p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR); break;
}
/* Skip class name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; break;
- case 0xffff: ((WORD *)p) += 2; break;
- default: ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+ case 0x0000: __get_WORD(&p); break;
+ case 0xffff: __get_WORD(&p); __get_WORD(&p); break;
+ default: p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR); break;
}
/* Skip window caption */
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
/* Skip font info */
if (style & DS_SETFONT)
{
- ((WORD *)p)++; /* pointSize */
+ __get_WORD(&p);; /* pointSize */
if (dialogEx)
{
- ((WORD *)p)++; /* weight */
- ((WORD *)p)++; /* italic */
+ __get_WORD(&p); /* weight */
+ __get_WORD(&p); /* italic */
}
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; /* faceName */
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR); /* faceName */
}
/* Skip dialog items */
@@ -619,97 +680,102 @@
if (dialogEx)
{
- ((DWORD *)p)++; /* helpID */
- ((DWORD *)p)++; /* exStyle */
- ((DWORD *)p)++; /* style */
+ __get_DWORD(&p); /* helpID */
+ __get_DWORD(&p); /* exStyle */
+ __get_DWORD(&p); /* style */
}
else
{
- ((DWORD *)p)++; /* style */
- ((DWORD *)p)++; /* exStyle */
+ __get_DWORD(&p); /* style */
+ __get_DWORD(&p); /* exStyle */
}
- ((WORD *)p)++; /* x */
- ((WORD *)p)++; /* y */
- ((WORD *)p)++; /* cx */
- ((WORD *)p)++; /* cy */
+ __get_WORD(&p); /* x */
+ __get_WORD(&p); /* y */
+ __get_WORD(&p); /* cx */
+ __get_WORD(&p); /* cy */
if (dialogEx)
- ((DWORD *)p)++; /* ID */
+ __get_DWORD(&p); /* ID */
else
- ((WORD *)p)++; /* ID */
+ __get_WORD(&p); /* ID */
/* Skip class name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; break;
- case 0xffff: ((WORD *)p) += 2; break;
- default: ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+ case 0x0000: __get_WORD(&p); break;
+ case 0xffff: __get_WORD(&p); __get_WORD(&p); break;
+ default: p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR); break;
}
/* Skip window name */
switch (*((WORD *)p))
{
- case 0x0000: ((WORD *)p)++; break;
- case 0xffff: ((WORD *)p) += 2; break;
- default: ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+ case 0x0000: __get_WORD(&p); break;
+ case 0xffff: __get_WORD(&p); __get_WORD(&p); break;
+ default: p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR); break;
}
/* Skip data */
- data = *((WORD *)p)++;
- (LPSTR)p += data;
+ data = __get_WORD(&p);
+ p += data;
/* Next item */
nbItems--;
}
-
- return (WORD)((LPSTR)p - (LPSTR)dialog32);
+ return (WORD)(p - (LPBYTE)dialog32);
}
+#undef COPY_WORD
+#define COPY_WORD __copy_WORD(&menu16, &p)
+#undef COPY_DWORD
+#define COPY_DWORD __copy_DWORD(&menu16, &p)
+
/**********************************************************************
* ConvertMenu32To16 (KERNEL.616)
*/
-VOID WINAPI ConvertMenu32To16( LPVOID menu32, DWORD size, LPVOID menu16 )
+VOID WINAPI ConvertMenu32To16( LPVOID menu32, DWORD size, LPVOID _menu16 )
{
- LPVOID p = menu32;
+ LPBYTE p = menu32;
+ LPBYTE menu16 = _menu16;
WORD version, headersize, flags, level = 1;
- version = *((WORD *)menu16)++ = *((WORD *)p)++;
- headersize = *((WORD *)menu16)++ = *((WORD *)p)++;
+ version = COPY_WORD;
+ headersize = COPY_WORD;
if ( headersize )
{
memcpy( menu16, p, headersize );
- ((LPSTR)menu16) += headersize;
- ((LPSTR)p) += headersize;
+ menu16 += headersize;
+ p += headersize;
}
while ( level )
if ( version == 0 ) /* standard */
{
- flags = *((WORD *)menu16)++ = *((WORD *)p)++;
+ flags = COPY_WORD;
if ( !(flags & MF_POPUP) )
- *((WORD *)menu16)++ = *((WORD *)p)++; /* ID */
+ COPY_WORD; /* ID */
else
level++;
WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)menu16, 0x7fffffff, NULL,NULL );
- ((LPSTR)menu16) += strlen( (LPSTR)menu16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ menu16 += strlen( (LPSTR)menu16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
if ( flags & MF_END )
level--;
}
else /* extended */
{
- *((DWORD *)menu16)++ = *((DWORD *)p)++; /* fType */
- *((DWORD *)menu16)++ = *((DWORD *)p)++; /* fState */
- *((WORD *)menu16)++ = (WORD)*((DWORD *)p)++; /* ID */
- flags = *((BYTE *)menu16)++ = (BYTE)*((WORD *)p)++;
+ COPY_DWORD; /* fType */
+ COPY_DWORD; /* fState */
+ __put_WORD(&menu16, __get_DWORD(&p)); /* ID */
+ flags = __put_BYTE(&menu16,__get_WORD(&p));
WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)menu16, 0x7fffffff, NULL,NULL );
- ((LPSTR)menu16) += strlen( (LPSTR)menu16 ) + 1;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ menu16 += strlen( (LPSTR)menu16 ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
/* align on DWORD boundary (32-bit only) */
p = (LPVOID)((((int)p) + 3) & ~3);
@@ -717,7 +783,7 @@
/* If popup, transfer helpid */
if ( flags & 1)
{
- *((DWORD *)menu16)++ = *((DWORD *)p)++;
+ COPY_DWORD;
level++;
}
@@ -732,35 +798,35 @@
*/
WORD WINAPI GetMenu32Size16( LPVOID menu32 )
{
- LPVOID p = menu32;
+ LPBYTE p = menu32;
WORD version, headersize, flags, level = 1;
- version = *((WORD *)p)++;
- headersize = *((WORD *)p)++;
- ((LPSTR)p) += headersize;
+ version = __get_WORD(&p);
+ headersize = __get_WORD(&p);
+ p += headersize;
while ( level )
if ( version == 0 ) /* standard */
{
- flags = *((WORD *)p)++;
+ flags = __get_WORD(&p);
if ( !(flags & MF_POPUP) )
- ((WORD *)p)++; /* ID */
+ __get_WORD(&p); /* ID */
else
level++;
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
if ( flags & MF_END )
level--;
}
else /* extended */
{
- ((DWORD *)p)++; /* fType */
- ((DWORD *)p)++; /* fState */
- ((DWORD *)p)++; /* ID */
- flags = *((WORD *)p)++;
+ __get_DWORD(&p); /* fType */
+ __get_DWORD(&p); /* fState */
+ __get_DWORD(&p); /* ID */
+ flags = __get_WORD(&p);
- ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+ p += (strlenW( (LPWSTR)p ) + 1)*sizeof(WCHAR);
/* align on DWORD boundary (32-bit only) */
p = (LPVOID)((((int)p) + 3) & ~3);
@@ -768,7 +834,7 @@
/* If popup, skip helpid */
if ( flags & 1)
{
- ((DWORD *)p)++;
+ __get_DWORD(&p);
level++;
}
@@ -776,28 +842,29 @@
level--;
}
- return (WORD)((LPSTR)p - (LPSTR)menu32);
+ return (WORD)(p - (LPBYTE)menu32);
}
/**********************************************************************
* ConvertAccelerator32To16
*/
-static void ConvertAccelerator32To16( LPVOID acc32, DWORD size, LPVOID acc16 )
+static void ConvertAccelerator32To16( LPVOID _acc32, DWORD size, LPVOID _acc16 )
{
+ LPBYTE acc16 = _acc16, acc32 = _acc32;
int type;
do
{
/* Copy type */
- type = *((BYTE *)acc16)++ = *((BYTE *)acc32)++;
+ type = __put_BYTE(&acc16, __get_BYTE(&acc32));
/* Skip padding */
- ((BYTE *)acc32)++;
+ __get_BYTE(&acc32);
/* Copy event and IDval */
- *((WORD *)acc16)++ = *((WORD *)acc32)++;
- *((WORD *)acc16)++ = *((WORD *)acc32)++;
+ __put_WORD(&acc16, __get_WORD(&acc32));
+ __put_WORD(&acc16, __get_WORD(&acc32));
/* Skip padding */
- ((WORD *)acc32)++;
+ __get_WORD(&acc32);
} while ( !( type & 0x80 ) );
}
--
More information about the wine-patches
mailing list