Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2018
- 68 participants
- 1149 messages
[PATCH] ntdll: Only set owned bits in RTL_BITMAP
by janisozaur@gmail.com
From: Michał Janiszewski <janisozaur(a)gmail.com>
Signed-off-by: Michał Janiszewski <janisozaur(a)gmail.com>
---
dlls/ntdll/rtlbitmap.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/rtlbitmap.c b/dlls/ntdll/rtlbitmap.c
index 318f6fcbd4..c3e9385ec0 100644
--- a/dlls/ntdll/rtlbitmap.c
+++ b/dlls/ntdll/rtlbitmap.c
@@ -157,7 +157,8 @@ VOID WINAPI RtlSetBits(PRTL_BITMAP lpBits, ULONG ulStart, ULONG ulCount)
USHORT initialWord = NTDLL_maskBits[ulCount] << (ulStart & 7);
*lpOut++ |= (initialWord & 0xff);
- *lpOut |= (initialWord >> 8);
+ if (lpOut < ((BYTE *)lpBits->Buffer) + (lpBits->SizeOfBitMap / 8))
+ *lpOut |= (initialWord >> 8);
return;
}
}
@@ -218,7 +219,8 @@ VOID WINAPI RtlClearBits(PRTL_BITMAP lpBits, ULONG ulStart, ULONG ulCount)
USHORT initialWord = ~(NTDLL_maskBits[ulCount] << (ulStart & 7));
*lpOut++ &= (initialWord & 0xff);
- *lpOut &= (initialWord >> 8);
+ if (lpOut < ((BYTE *)lpBits->Buffer) + (lpBits->SizeOfBitMap / 8))
+ *lpOut &= (initialWord >> 8);
return;
}
}
--
2.17.1
June 30, 2018
[PATCH] ntdll: Only set owned bits in RTL_BITMAP
by janisozaur@gmail.com
From: Michał Janiszewski <janisozaur(a)gmail.com>
Signed-off-by: Michał Janiszewski <janisozaur(a)gmail.com>
---
dlls/ntdll/rtlbitmap.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/rtlbitmap.c b/dlls/ntdll/rtlbitmap.c
index 318f6fcbd4..c3e9385ec0 100644
--- a/dlls/ntdll/rtlbitmap.c
+++ b/dlls/ntdll/rtlbitmap.c
@@ -157,7 +157,8 @@ VOID WINAPI RtlSetBits(PRTL_BITMAP lpBits, ULONG ulStart, ULONG ulCount)
USHORT initialWord = NTDLL_maskBits[ulCount] << (ulStart & 7);
*lpOut++ |= (initialWord & 0xff);
- *lpOut |= (initialWord >> 8);
+ if (lpOut < ((BYTE *)lpBits->Buffer) + (lpBits->SizeOfBitMap / 8))
+ *lpOut |= (initialWord >> 8);
return;
}
}
@@ -218,7 +219,8 @@ VOID WINAPI RtlClearBits(PRTL_BITMAP lpBits, ULONG ulStart, ULONG ulCount)
USHORT initialWord = ~(NTDLL_maskBits[ulCount] << (ulStart & 7));
*lpOut++ &= (initialWord & 0xff);
- *lpOut &= (initialWord >> 8);
+ if (lpOut < ((BYTE *)lpBits->Buffer) + (lpBits->SizeOfBitMap / 8))
+ *lpOut &= (initialWord >> 8);
return;
}
}
--
2.17.1
June 30, 2018
[v2 PATCH] tools: Update to Unicode 11.0.0.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/analyzer.c | 4 +
dlls/dwrite/bracket.c | 2 +-
dlls/dwrite/linebreak.c | 214 +++++++++++++-------------
dlls/dwrite/mirror.c | 2 +-
dlls/dwrite/scripts.c | 308 +++++++++++++++++++------------------
dlls/dwrite/scripts.h | 8 +-
dlls/gdi32/vertical.c | 2 +-
dlls/usp10/bracket.c | 2 +-
dlls/usp10/indicsyllable.c | 86 +++++------
dlls/usp10/linebreak.c | 214 +++++++++++++-------------
dlls/usp10/mirror.c | 2 +-
dlls/usp10/shaping.c | 116 +++++++-------
dlls/wineps.drv/vertical.c | 2 +-
libs/port/compose.c | 2 +-
libs/port/decompose.c | 2 +-
libs/port/digitmap.c | 2 +-
libs/wine/casemap.c | 2 +-
libs/wine/wctype.c | 38 ++---
tools/make_unicode | 9 +-
19 files changed, 514 insertions(+), 503 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 8d553c6d56..19214ee392 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -184,6 +184,10 @@ static const struct dwritescript_properties dwritescripts_properties[Script_Last
{ /* Osge */ { 0x6567734f, 219, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('o','s','g','e') },
{ /* Sgnw */ { 0x776e6753, 95, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('s','g','n','w') },
{ /* Tang */ { 0x676e6154, 520, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('t','a','n','g') },
+ { /* Gonm */ { 0x6d6e6f47, 313, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('g','o','n','m') },
+ { /* Nshu */ { 0x7568734e, 499, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, _OT('n','s','h','u') },
+ { /* Soyo */ { 0x6f796f53, 329, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('s','o','y','o') },
+ { /* Zanb */ { 0x626e615a, 339, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('z','a','n','b') },
};
#undef _OT
diff --git a/dlls/dwrite/bracket.c b/dlls/dwrite/bracket.c
index 1509d572c9..16df6381a6 100644
--- a/dlls/dwrite/bracket.c
+++ b/dlls/dwrite/bracket.c
@@ -1,5 +1,5 @@
/* Unicode Bidirectional Bracket table */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiBrackets.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiBrackets.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/dwrite/linebreak.c b/dlls/dwrite/linebreak.c
index 56bde66e9e..cd2ca64952 100644
--- a/dlls/dwrite/linebreak.c
+++ b/dlls/dwrite/linebreak.c
@@ -1,10 +1,10 @@
/* Unicode Line Break Properties */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/LineBreak.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/LineBreak.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
+const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7264] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
@@ -56,22 +56,22 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0790, 0x07a0, 0x07b0,
0x07c0, 0x07d0, 0x05b0, 0x0580, 0x07e0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x07f0, 0x0800, 0x07b0, 0x05b0, 0x0760, 0x0810,
- 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0870,
- 0x0870, 0x0870, 0x05b0, 0x0880, 0x0870, 0x0890, 0x08a0, 0x0580,
- 0x08b0, 0x05b0, 0x05b0, 0x08c0, 0x0580, 0x08d0, 0x08e0, 0x05b0,
- 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950, 0x0960,
- 0x0970, 0x0900, 0x0910, 0x0980, 0x0990, 0x09a0, 0x09b0, 0x09c0,
- 0x09d0, 0x0690, 0x0910, 0x09e0, 0x09f0, 0x0a00, 0x0950, 0x0a10,
- 0x0a20, 0x0900, 0x0910, 0x09e0, 0x0a30, 0x0a40, 0x0950, 0x0a50,
- 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0, 0x09b0, 0x0ac0,
- 0x0ad0, 0x0ae0, 0x0910, 0x0af0, 0x0b00, 0x0b10, 0x0950, 0x0b20,
- 0x0b30, 0x0ae0, 0x0910, 0x0b40, 0x0b00, 0x0b50, 0x0950, 0x0b60,
- 0x0ad0, 0x0ae0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0950, 0x0ba0,
- 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09b0, 0x0c00,
- 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0870, 0x0870,
- 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0870, 0x0870,
+ 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x05b0, 0x0870, 0x0860, 0x0880, 0x0890, 0x0580,
+ 0x08a0, 0x05b0, 0x05b0, 0x08b0, 0x0580, 0x08c0, 0x08d0, 0x05b0,
+ 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950,
+ 0x0960, 0x08f0, 0x0900, 0x0970, 0x0980, 0x0990, 0x09a0, 0x09b0,
+ 0x09c0, 0x0690, 0x0900, 0x09d0, 0x09e0, 0x09f0, 0x0940, 0x0a00,
+ 0x0a10, 0x08f0, 0x0900, 0x09d0, 0x0a20, 0x0a30, 0x0940, 0x0a40,
+ 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x09a0, 0x0ab0,
+ 0x0ac0, 0x0ad0, 0x0900, 0x0ae0, 0x0af0, 0x0b00, 0x0940, 0x0b10,
+ 0x0b20, 0x0ad0, 0x0900, 0x0b30, 0x0af0, 0x0b40, 0x0940, 0x0b50,
+ 0x0b60, 0x0ad0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0940, 0x0ba0,
+ 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09a0, 0x0c00,
+ 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0860, 0x0860,
+ 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0860, 0x0860,
0x0cc0, 0x0cd0, 0x07b0, 0x0ce0, 0x0cf0, 0x05b0, 0x0d00, 0x0d10,
- 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0870, 0x0870,
+ 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0860, 0x0860,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0d70, 0x0c20, 0x0c20, 0x0c20,
0x0c20, 0x0d80, 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0,
0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0db0, 0x0db0,
@@ -86,16 +86,16 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0e70, 0x0e80, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0e90, 0x0ea0,
0x0eb0, 0x0ec0, 0x05b0, 0x0ed0, 0x05b0, 0x0ee0, 0x0eb0, 0x0ef0,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0f00, 0x0f10, 0x0e50,
- 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a50,
+ 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a40,
0x0f30, 0x05b0, 0x0f40, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0f50,
0x05b0, 0x0840, 0x0f60, 0x0f60, 0x0f70, 0x0c20, 0x0f80, 0x0f90,
0x0c20, 0x0c20, 0x0fa0, 0x0c20, 0x0fb0, 0x0fc0, 0x05b0, 0x05b0,
0x05b0, 0x0fd0, 0x0c20, 0x0c20, 0x0c20, 0x0fe0, 0x0c20, 0x0ff0,
- 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0870, 0x0870, 0x0870, 0x0870,
+ 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0860, 0x0860, 0x0860, 0x0860,
0x1010, 0x05b0, 0x05b0, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060,
0x1070, 0x05b0, 0x1080, 0x07b0, 0x05b0, 0x05b0, 0x07f0, 0x1090,
0x05b0, 0x05b0, 0x1020, 0x10a0, 0x10b0, 0x07b0, 0x05b0, 0x10c0,
- 0x0ea0, 0x0870, 0x0870, 0x0870, 0x0a50, 0x10d0, 0x10e0, 0x10f0,
+ 0x0ea0, 0x0860, 0x0860, 0x0860, 0x0a40, 0x10d0, 0x10e0, 0x10f0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0580, 0x0580, 0x0580, 0x1100,
0x05b0, 0x0e60, 0x05b0, 0x05b0, 0x0e60, 0x1110, 0x05b0, 0x1120,
@@ -108,80 +108,80 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x1320, 0x1330, 0x1340, 0x1350, 0x05b0, 0x05b0, 0x1360, 0x05b0,
0x1370, 0x1380, 0x1390, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x13a0,
- 0x05b0, 0x05b0, 0x13b0, 0x0870, 0x0860, 0x0870, 0x13c0, 0x13c0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13d0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x1270, 0x13c0, 0x13c0, 0x13e0,
- 0x13c0, 0x13f0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x05b0,
- 0x1450, 0x1460, 0x05b0, 0x1470, 0x1480, 0x05b0, 0x1490, 0x14a0,
- 0x05b0, 0x14b0, 0x05b0, 0x14c0, 0x14d0, 0x14e0, 0x14f0, 0x1500,
- 0x1510, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1520, 0x1530, 0x1540,
- 0x13c0, 0x1550, 0x05b0, 0x05b0, 0x1560, 0x05b0, 0x1570, 0x05b0,
+ 0x05b0, 0x05b0, 0x13b0, 0x0860, 0x13c0, 0x0860, 0x13d0, 0x13d0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13e0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x1270, 0x13d0, 0x13d0, 0x13f0,
+ 0x13d0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x1450, 0x05b0,
+ 0x1460, 0x1470, 0x05b0, 0x1480, 0x1490, 0x05b0, 0x14a0, 0x14b0,
+ 0x05b0, 0x14c0, 0x05b0, 0x14d0, 0x14e0, 0x14f0, 0x1500, 0x1510,
+ 0x1520, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1530, 0x1540, 0x1550,
+ 0x13d0, 0x1560, 0x05b0, 0x05b0, 0x1570, 0x05b0, 0x1580, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x1580, 0x1590, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15a0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15b0, 0x05b0, 0x15c0,
- 0x05b0, 0x15d0, 0x05b0, 0x15e0, 0x0910, 0x15f0, 0x1600, 0x0870,
+ 0x1590, 0x15a0, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15c0, 0x05b0, 0x15d0,
+ 0x05b0, 0x15e0, 0x05b0, 0x15f0, 0x0900, 0x1600, 0x1610, 0x0860,
0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1610, 0x1620,
- 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1630, 0x1640,
- 0x05b0, 0x13b0, 0x1650, 0x1650, 0x1650, 0x1650, 0x0580, 0x0580,
- 0x1660, 0x1670, 0x1680, 0x1690, 0x16a0, 0x0870, 0x0870, 0x0870,
- 0x16b0, 0x16c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16d0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16e0, 0x0870, 0x16f0,
- 0x1700, 0x1710, 0x1720, 0x1730, 0x1740, 0x16b0, 0x1750, 0x16b0,
- 0x1760, 0x1770, 0x1780, 0x16b0, 0x1750, 0x16b0, 0x1760, 0x1790,
- 0x17a0, 0x16b0, 0x17b0, 0x17c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x17b0, 0x16b0, 0x16b0, 0x17d0, 0x16b0, 0x16b0, 0x16d0, 0x17e0,
- 0x16b0, 0x17b0, 0x16b0, 0x16b0, 0x17f0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x17b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x16b0, 0x1800, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x1810, 0x16b0, 0x16b0, 0x16b0, 0x1820, 0x05b0, 0x05b0, 0x10c0,
- 0x1830, 0x05b0, 0x1840, 0x0870, 0x05b0, 0x05b0, 0x1610, 0x1850,
- 0x05b0, 0x1860, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1870,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1620, 0x1630,
+ 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1640, 0x1650,
+ 0x05b0, 0x13b0, 0x1660, 0x1660, 0x1660, 0x1660, 0x0580, 0x0580,
+ 0x1670, 0x1680, 0x1690, 0x16a0, 0x16b0, 0x0860, 0x0860, 0x0860,
+ 0x16c0, 0x16d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16f0, 0x0860, 0x1700,
+ 0x1710, 0x1720, 0x1730, 0x1740, 0x1750, 0x16c0, 0x1760, 0x16c0,
+ 0x1770, 0x1780, 0x1790, 0x16c0, 0x1760, 0x16c0, 0x1770, 0x17a0,
+ 0x17b0, 0x16c0, 0x17c0, 0x17d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x17e0, 0x16c0, 0x16c0, 0x17f0, 0x16c0, 0x16c0, 0x16e0, 0x1800,
+ 0x16c0, 0x17e0, 0x16c0, 0x16c0, 0x1810, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x17e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
+ 0x16c0, 0x1820, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x1830, 0x16c0, 0x16c0, 0x16c0, 0x1840, 0x05b0, 0x05b0, 0x10c0,
+ 0x1850, 0x05b0, 0x1860, 0x0860, 0x05b0, 0x05b0, 0x1620, 0x1870,
+ 0x05b0, 0x1880, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1890,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x0840, 0x0a50, 0x0870, 0x0870, 0x0870, 0x1880,
- 0x1890, 0x05b0, 0x18a0, 0x18b0, 0x05b0, 0x05b0, 0x05b0, 0x18c0,
- 0x18d0, 0x05b0, 0x05b0, 0x1020, 0x18e0, 0x0f10, 0x0580, 0x18f0,
- 0x07b0, 0x05b0, 0x1900, 0x05b0, 0x1910, 0x1920, 0x0da0, 0x1930,
- 0x08b0, 0x05b0, 0x05b0, 0x1940, 0x1950, 0x1960, 0x0c20, 0x1970,
- 0x05b0, 0x05b0, 0x1980, 0x1990, 0x19a0, 0x19b0, 0x0c20, 0x0c20,
- 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19c0, 0x19d0, 0x0760, 0x19e0,
- 0x19f0, 0x1a00, 0x1650, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a10, 0x0f10,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a70, 0x0db0, 0x1a80, 0x0dd0, 0x0dd0, 0x1a90,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x13b0, 0x1ab0, 0x1ac0, 0x1ad0, 0x1ae0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1af0, 0x1b00, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x1b10, 0x0870, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x1b20, 0x05b0, 0x05b0, 0x0a50, 0x0870, 0x0870, 0x1b30,
- 0x0580, 0x1b40, 0x0580, 0x1b50, 0x1b60, 0x1b70, 0x1b80, 0x1130,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1b90,
- 0x1ba0, 0x1bb0, 0x16b0, 0x1bc0, 0x16b0, 0x1bd0, 0x1be0, 0x1bf0,
- 0x16b0, 0x1c00, 0x16b0, 0x17b0, 0x1c10, 0x1c20, 0x1c30, 0x1c40,
+ 0x05b0, 0x05b0, 0x0840, 0x0a40, 0x0860, 0x0860, 0x0860, 0x18a0,
+ 0x18b0, 0x05b0, 0x18c0, 0x18d0, 0x05b0, 0x05b0, 0x05b0, 0x18e0,
+ 0x18f0, 0x05b0, 0x05b0, 0x1020, 0x1900, 0x0f10, 0x0580, 0x1910,
+ 0x07b0, 0x05b0, 0x1920, 0x05b0, 0x1930, 0x1940, 0x0da0, 0x1950,
+ 0x08a0, 0x05b0, 0x05b0, 0x1960, 0x1970, 0x1980, 0x0c20, 0x1990,
+ 0x05b0, 0x05b0, 0x19a0, 0x19b0, 0x19c0, 0x19d0, 0x0c20, 0x0c20,
+ 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19e0, 0x19f0, 0x0760, 0x1a00,
+ 0x1a10, 0x1a20, 0x1660, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a30, 0x0f10,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a90, 0x0db0, 0x1aa0, 0x0dd0, 0x0dd0, 0x1ab0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x13b0, 0x1ad0, 0x1ae0, 0x1af0, 0x1b00, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1600, 0x1b10, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x1b20, 0x0860, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x1b30, 0x05b0, 0x05b0, 0x0a40, 0x0860, 0x0860, 0x1b40,
+ 0x0580, 0x1b50, 0x0580, 0x1b60, 0x1b70, 0x1b80, 0x1b90, 0x1130,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1ba0,
+ 0x1bb0, 0x1bc0, 0x16c0, 0x1bd0, 0x16c0, 0x1be0, 0x1bf0, 0x1c00,
+ 0x16c0, 0x1c10, 0x16c0, 0x17e0, 0x1c20, 0x1c30, 0x1c40, 0x1c50,
/* values */
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0022, 0x0003, 0x0001, 0x0001, 0x0002, 0x0004, 0x0004,
@@ -277,8 +277,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x001d, 0x0011,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
@@ -310,7 +308,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x0004, 0x0004, 0x0011, 0x0011, 0x001c, 0x001c,
0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c,
0x001d, 0x001d, 0x001b, 0x001b, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001b, 0x001d, 0x001a, 0x001d, 0x001d, 0x0011, 0x0011,
+ 0x001d, 0x001b, 0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d,
0x001d, 0x0011, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d, 0x0011,
@@ -332,7 +330,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x001d, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0011, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x0004,
@@ -375,8 +373,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x0011,
0x0011, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0004, 0x0004, 0x001d, 0x0004, 0x0004,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0004, 0x0004,
0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x0004,
@@ -551,10 +551,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x001d, 0x001d, 0x001d, 0x001d, 0x0004, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0004,
+ 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0011,
0x0004, 0x0004, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -638,9 +638,11 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0012, 0x0013, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001e, 0x001e, 0x001e, 0x001e, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
@@ -711,7 +713,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -733,8 +735,8 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0012, 0x0013, 0x0022, 0x0022, 0x0022, 0x0022, 0x0017, 0x001d,
0x0022, 0x0022, 0x001d, 0x0022, 0x0022, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0025, 0x0025, 0x0022, 0x0022, 0x0022, 0x001d,
- 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
- 0x0022, 0x0022, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -768,10 +770,12 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
- 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011, 0x0011,
0x0011, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
@@ -871,8 +875,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0011, 0x0026, 0x0011,
0x0026, 0x0026, 0x0011, 0x0026, 0x0026, 0x0011, 0x0026, 0x0026,
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026,
- 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
diff --git a/dlls/dwrite/mirror.c b/dlls/dwrite/mirror.c
index 23dab536c4..daadfa8054 100644
--- a/dlls/dwrite/mirror.c
+++ b/dlls/dwrite/mirror.c
@@ -1,5 +1,5 @@
/* Unicode BiDi mirroring */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiMirroring.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiMirroring.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/dwrite/scripts.c b/dlls/dwrite/scripts.c
index ce139f2932..5d7846afdf 100644
--- a/dlls/dwrite/scripts.c
+++ b/dlls/dwrite/scripts.c
@@ -1,63 +1,63 @@
/* Unicode Script IDs */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/Scripts.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/Scripts.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
+const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6880] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
0x0180, 0x0190, 0x01a0, 0x01b0, 0x01c0, 0x01d0, 0x01e0, 0x01f0,
0x0200, 0x0210, 0x0220, 0x0230, 0x0240, 0x0240, 0x0250, 0x0260,
0x0270, 0x0280, 0x0290, 0x02a0, 0x02b0, 0x02c0, 0x0110, 0x02d0,
- 0x02e0, 0x02f0, 0x0300, 0x0300, 0x0310, 0x0300, 0x0300, 0x0300,
- 0x0320, 0x0300, 0x0300, 0x0330, 0x0340, 0x0350, 0x0360, 0x0370,
- 0x0380, 0x0390, 0x03a0, 0x03b0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03d0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03e0,
- 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x0430,
- 0x0440, 0x0450, 0x0460, 0x0470, 0x0210, 0x0210, 0x0210, 0x0210,
+ 0x02e0, 0x02f0, 0x0300, 0x0310, 0x0320, 0x0300, 0x0300, 0x0300,
+ 0x0330, 0x0300, 0x0300, 0x0340, 0x0350, 0x0360, 0x0370, 0x0380,
+ 0x0390, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03e0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03f0,
+ 0x0400, 0x0400, 0x0400, 0x0400, 0x0410, 0x0420, 0x0430, 0x0440,
+ 0x0450, 0x0460, 0x0470, 0x0480, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
- 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0480,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x03c0, 0x04a0, 0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0,
+ 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0490,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x03d0, 0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0, 0x0500,
/* level 2 offsets */
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0510, 0x0520, 0x0510, 0x0520,
- 0x0500, 0x0500, 0x0530, 0x0530, 0x0540, 0x0550, 0x0540, 0x0550,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0560, 0x0500, 0x0500, 0x0570, 0x0500,
- 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0590,
- 0x05a0, 0x05b0, 0x05c0, 0x05b0, 0x05b0, 0x05b0, 0x05d0, 0x05b0,
- 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05f0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05e0, 0x05e0, 0x05e0, 0x0600, 0x0610, 0x0620, 0x0600, 0x0610,
- 0x0630, 0x0640, 0x0650, 0x0650, 0x0660, 0x0650, 0x0670, 0x0680,
- 0x0690, 0x06a0, 0x06b0, 0x06b0, 0x06c0, 0x06d0, 0x06b0, 0x06e0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06f0, 0x06b0, 0x06b0,
- 0x0700, 0x0710, 0x0710, 0x0710, 0x0720, 0x06b0, 0x06b0, 0x06b0,
- 0x0730, 0x0730, 0x0730, 0x0740, 0x0750, 0x0750, 0x0750, 0x0760,
- 0x0770, 0x0770, 0x0780, 0x0790, 0x07a0, 0x07b0, 0x07c0, 0x07d0,
- 0x07d0, 0x07d0, 0x06b0, 0x07e0, 0x07d0, 0x07f0, 0x0800, 0x06b0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0520, 0x0530, 0x0520, 0x0530,
+ 0x0510, 0x0510, 0x0540, 0x0540, 0x0550, 0x0560, 0x0550, 0x0560,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0570, 0x0510, 0x0510, 0x0580, 0x0510,
+ 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x05a0,
+ 0x05b0, 0x05c0, 0x05d0, 0x05c0, 0x05c0, 0x05c0, 0x05e0, 0x05c0,
+ 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x0600, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x05f0, 0x05f0, 0x05f0, 0x0610, 0x0620, 0x0630, 0x0610, 0x0620,
+ 0x0640, 0x0650, 0x0660, 0x0660, 0x0670, 0x0660, 0x0680, 0x0690,
+ 0x06a0, 0x06b0, 0x06c0, 0x06c0, 0x06d0, 0x06e0, 0x06c0, 0x06f0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x0700, 0x06c0, 0x06c0,
+ 0x0710, 0x0720, 0x0720, 0x0720, 0x0730, 0x06c0, 0x06c0, 0x06c0,
+ 0x0740, 0x0740, 0x0740, 0x0750, 0x0760, 0x0760, 0x0760, 0x0770,
+ 0x0780, 0x0780, 0x0790, 0x07a0, 0x07b0, 0x07c0, 0x07d0, 0x07d0,
+ 0x07d0, 0x07d0, 0x06c0, 0x07e0, 0x07d0, 0x07f0, 0x0800, 0x06c0,
0x0810, 0x0810, 0x0810, 0x0810, 0x0810, 0x0820, 0x0830, 0x0810,
0x0840, 0x0850, 0x0860, 0x0870, 0x0880, 0x0890, 0x08a0, 0x08b0,
0x08c0, 0x08d0, 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930,
@@ -66,108 +66,110 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0a40, 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0,
0x0ac0, 0x0ad0, 0x0ae0, 0x0af0, 0x0b00, 0x0b10, 0x0b20, 0x0b30,
0x0b40, 0x0b50, 0x0b60, 0x0b70, 0x0b80, 0x0b90, 0x0ba0, 0x0bb0,
- 0x0bc0, 0x0bd0, 0x0be0, 0x0be0, 0x0bf0, 0x0c00, 0x0c10, 0x0be0,
- 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0c60, 0x0c70, 0x0c80, 0x0c90,
- 0x0ca0, 0x0cb0, 0x0cb0, 0x0cc0, 0x0cb0, 0x0cd0, 0x07d0, 0x07d0,
- 0x0ce0, 0x0cf0, 0x0d00, 0x0d10, 0x0d20, 0x0d30, 0x07d0, 0x07d0,
- 0x0d40, 0x0d40, 0x0d40, 0x0d40, 0x0d50, 0x0d40, 0x0d60, 0x0d70,
- 0x0d40, 0x0d50, 0x0d40, 0x0d80, 0x0d80, 0x0d90, 0x07d0, 0x07d0,
- 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0,
- 0x0da0, 0x0da0, 0x0db0, 0x0db0, 0x0dc0, 0x0db0, 0x0db0, 0x0dd0,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0e00, 0x0e10, 0x0df0, 0x0df0,
- 0x0e00, 0x0df0, 0x0df0, 0x0e20, 0x0e30, 0x0e40, 0x0df0, 0x0df0,
- 0x0df0, 0x0e30, 0x0df0, 0x0df0, 0x0df0, 0x0e50, 0x0df0, 0x0e60,
- 0x0df0, 0x0e70, 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x0e90,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0eb0, 0x0ec0, 0x0ed0, 0x0ed0, 0x0ed0, 0x0ed0, 0x0ee0, 0x0ef0,
- 0x0f00, 0x0f10, 0x0f20, 0x0f30, 0x0f40, 0x0f50, 0x0f60, 0x0f70,
- 0x0f80, 0x0f80, 0x0f80, 0x0f80, 0x0f80, 0x0f90, 0x0fa0, 0x0fa0,
- 0x0fb0, 0x0fc0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fe0,
- 0x0fd0, 0x0fd0, 0x0ff0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x1000,
- 0x1010, 0x1020, 0x1030, 0x1030, 0x1040, 0x1050, 0x1060, 0x1070,
- 0x1080, 0x1080, 0x1090, 0x1080, 0x10a0, 0x10b0, 0x0f80, 0x0f80,
- 0x10c0, 0x10d0, 0x10e0, 0x10e0, 0x10e0, 0x10f0, 0x10e0, 0x1100,
- 0x1110, 0x1110, 0x1120, 0x1130, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
- 0x1140, 0x1140, 0x1140, 0x1140, 0x1150, 0x1140, 0x1140, 0x1160,
- 0x1170, 0x1170, 0x1170, 0x1170, 0x1180, 0x1180, 0x1180, 0x1190,
- 0x11a0, 0x11a0, 0x11a0, 0x11b0, 0x11c0, 0x11d0, 0x11d0, 0x11d0,
- 0x11e0, 0x07d0, 0x07d0, 0x07d0, 0x11f0, 0x1200, 0x1210, 0x1220,
- 0x0540, 0x0540, 0x1230, 0x0540, 0x0540, 0x1240, 0x1250, 0x1260,
- 0x0540, 0x0540, 0x0540, 0x1270, 0x0580, 0x0580, 0x0580, 0x1280,
- 0x05b0, 0x1290, 0x05b0, 0x05b0, 0x1290, 0x12a0, 0x05b0, 0x12b0,
- 0x05b0, 0x05b0, 0x05b0, 0x12c0, 0x12c0, 0x12d0, 0x05b0, 0x12e0,
- 0x12f0, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x1300, 0x1310,
- 0x1320, 0x1330, 0x0500, 0x0500, 0x07d0, 0x0580, 0x0580, 0x1340,
- 0x0500, 0x0500, 0x1350, 0x1360, 0x1370, 0x0500, 0x0540, 0x0540,
- 0x1380, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x1390, 0x07d0, 0x13a0, 0x07d0, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0,
- 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x13c0,
- 0x0500, 0x13d0, 0x0500, 0x13e0, 0x13f0, 0x1400, 0x1410, 0x07d0,
- 0x1420, 0x1420, 0x1430, 0x1420, 0x1420, 0x1430, 0x0540, 0x0540,
- 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1450,
- 0x0db0, 0x0db0, 0x0dc0, 0x1460, 0x1460, 0x1460, 0x1470, 0x1480,
- 0x0df0, 0x1490, 0x14a0, 0x14a0, 0x14a0, 0x14a0, 0x05e0, 0x05e0,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x14b0, 0x07d0, 0x07d0, 0x07d0,
- 0x14c0, 0x14d0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14e0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14f0, 0x07d0, 0x1500,
- 0x1510, 0x0500, 0x1520, 0x1530, 0x1540, 0x1550, 0x1550, 0x1550,
- 0x1550, 0x1560, 0x1570, 0x1580, 0x1580, 0x1580, 0x1580, 0x1590,
- 0x15a0, 0x15b0, 0x15c0, 0x15d0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x15e0, 0x0500, 0x15b0, 0x15f0, 0x0500, 0x0500, 0x1600, 0x1580,
- 0x0de0, 0x15e0, 0x0500, 0x0500, 0x0500, 0x0500, 0x0de0, 0x1610,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x1580, 0x1580, 0x1620,
- 0x1580, 0x1580, 0x1580, 0x1580, 0x1580, 0x1630, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14f0, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1640, 0x07d0,
+ 0x0bc0, 0x0bd0, 0x0be0, 0x0bf0, 0x0c00, 0x0c10, 0x0c20, 0x0be0,
+ 0x0c30, 0x0c40, 0x0c50, 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0,
+ 0x0cb0, 0x0cc0, 0x0cc0, 0x0cd0, 0x0cc0, 0x0ce0, 0x07d0, 0x07d0,
+ 0x0cf0, 0x0d00, 0x0d10, 0x0d20, 0x0d30, 0x0d40, 0x07d0, 0x07d0,
+ 0x0d50, 0x0d50, 0x0d50, 0x0d50, 0x0d60, 0x0d50, 0x0d70, 0x0d80,
+ 0x0d50, 0x0d60, 0x0d50, 0x0d90, 0x0d90, 0x0da0, 0x07d0, 0x07d0,
+ 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0,
+ 0x0db0, 0x0db0, 0x0dc0, 0x0dc0, 0x0dd0, 0x0dc0, 0x0dc0, 0x0de0,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0e00, 0x0e00, 0x0e00, 0x0e00, 0x0e10, 0x0e20, 0x0e00, 0x0e00,
+ 0x0e10, 0x0e00, 0x0e00, 0x0e30, 0x0e40, 0x0e50, 0x0e00, 0x0e00,
+ 0x0e00, 0x0e40, 0x0e00, 0x0e00, 0x0e00, 0x0e60, 0x0e00, 0x0e70,
+ 0x0e00, 0x0e80, 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0ea0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0ec0, 0x0ed0, 0x0ee0, 0x0ee0, 0x0ee0, 0x0ee0, 0x0ef0, 0x0f00,
+ 0x0f10, 0x0f20, 0x0f30, 0x0f40, 0x0f50, 0x0f60, 0x0f70, 0x0f80,
+ 0x0f90, 0x0f90, 0x0f90, 0x0f90, 0x0f90, 0x0fa0, 0x0fb0, 0x0fb0,
+ 0x0fc0, 0x0fd0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0ff0,
+ 0x0fe0, 0x0fe0, 0x1000, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x1010,
+ 0x1020, 0x1030, 0x1040, 0x1040, 0x1050, 0x1060, 0x1070, 0x1080,
+ 0x1090, 0x1090, 0x10a0, 0x1090, 0x10b0, 0x10c0, 0x0f90, 0x0f90,
+ 0x10d0, 0x10e0, 0x10f0, 0x10f0, 0x10f0, 0x1100, 0x10f0, 0x1110,
+ 0x1120, 0x1120, 0x1130, 0x1140, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
+ 0x1150, 0x1150, 0x1150, 0x1150, 0x1160, 0x1150, 0x1150, 0x1170,
+ 0x1180, 0x1180, 0x1180, 0x1180, 0x1190, 0x1190, 0x1190, 0x11a0,
+ 0x11b0, 0x11b0, 0x11b0, 0x11c0, 0x11d0, 0x11e0, 0x11e0, 0x11e0,
+ 0x11f0, 0x07d0, 0x07d0, 0x07d0, 0x1200, 0x1210, 0x1220, 0x1230,
+ 0x0550, 0x0550, 0x1240, 0x0550, 0x0550, 0x1250, 0x1260, 0x1270,
+ 0x0550, 0x0550, 0x0550, 0x1280, 0x0590, 0x0590, 0x0590, 0x1290,
+ 0x05c0, 0x12a0, 0x05c0, 0x05c0, 0x12a0, 0x12b0, 0x05c0, 0x12c0,
+ 0x05c0, 0x05c0, 0x05c0, 0x12d0, 0x12d0, 0x12e0, 0x05c0, 0x12f0,
+ 0x1300, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1310, 0x1320,
+ 0x1330, 0x1340, 0x0510, 0x1330, 0x07d0, 0x0590, 0x0590, 0x1350,
+ 0x0510, 0x0510, 0x1360, 0x1370, 0x1380, 0x0510, 0x0550, 0x0550,
+ 0x1390, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1330,
+ 0x0510, 0x0510, 0x13a0, 0x07d0, 0x13b0, 0x07d0, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0,
+ 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x13d0,
+ 0x0510, 0x13e0, 0x0510, 0x13f0, 0x1400, 0x1410, 0x1420, 0x07d0,
+ 0x1430, 0x1430, 0x1440, 0x1430, 0x1430, 0x1440, 0x0550, 0x0550,
+ 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1460,
+ 0x0dc0, 0x0dc0, 0x0dd0, 0x1470, 0x1470, 0x1470, 0x1480, 0x1490,
+ 0x0e00, 0x14a0, 0x14b0, 0x14b0, 0x14b0, 0x14b0, 0x05f0, 0x05f0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x14c0, 0x07d0, 0x07d0, 0x07d0,
+ 0x14d0, 0x14e0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14f0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x07d0, 0x1510,
+ 0x1520, 0x0510, 0x1530, 0x1540, 0x1550, 0x1560, 0x1560, 0x1560,
+ 0x1560, 0x1570, 0x1580, 0x1590, 0x1590, 0x1590, 0x1590, 0x15a0,
+ 0x15b0, 0x15c0, 0x15d0, 0x15e0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x15f0, 0x0510, 0x15c0, 0x1600, 0x0510, 0x0510, 0x1610, 0x1590,
+ 0x0df0, 0x15f0, 0x0510, 0x0510, 0x0510, 0x0510, 0x0df0, 0x1620,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1590, 0x1590, 0x1630,
+ 0x1590, 0x1590, 0x1590, 0x1590, 0x1590, 0x1640, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x07d0, 0x07d0,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1660, 0x1650, 0x1650, 0x1650, 0x1670, 0x1680, 0x1680, 0x1680,
0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690,
0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690,
- 0x1690, 0x1690, 0x16a0, 0x07d0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05e0, 0x05e0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16c0,
- 0x0500, 0x0500, 0x16d0, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x16e0, 0x0540, 0x16f0, 0x1700, 0x07d0, 0x07d0, 0x07d0, 0x1710,
- 0x1720, 0x1720, 0x1730, 0x14b0, 0x1740, 0x1740, 0x1740, 0x1750,
- 0x1760, 0x1760, 0x1760, 0x1760, 0x1770, 0x1780, 0x0810, 0x1790,
- 0x17a0, 0x17a0, 0x17b0, 0x17c0, 0x17c0, 0x17d0, 0x0de0, 0x17e0,
- 0x17f0, 0x17f0, 0x17f0, 0x17f0, 0x1800, 0x1810, 0x0da0, 0x1820,
- 0x1830, 0x1830, 0x1830, 0x1840, 0x1850, 0x1860, 0x0da0, 0x0da0,
- 0x1870, 0x1870, 0x1870, 0x1870, 0x1880, 0x1890, 0x18a0, 0x18b0,
- 0x18c0, 0x18d0, 0x14a0, 0x0540, 0x0540, 0x18e0, 0x18f0, 0x0e80,
- 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x18a0, 0x18a0, 0x1900, 0x1910,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0de0, 0x0de0, 0x1920, 0x0de0, 0x1930, 0x0de0, 0x0de0, 0x1940,
+ 0x1690, 0x1690, 0x16a0, 0x07d0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x05f0, 0x05f0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16c0,
+ 0x0510, 0x0510, 0x16d0, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x16e0, 0x0550, 0x16f0, 0x1700, 0x07d0, 0x07d0, 0x07d0, 0x1710,
+ 0x1720, 0x1720, 0x1730, 0x1740, 0x1750, 0x1750, 0x1750, 0x1760,
+ 0x1770, 0x1770, 0x1770, 0x1770, 0x1780, 0x1790, 0x0810, 0x17a0,
+ 0x17b0, 0x17b0, 0x17c0, 0x17d0, 0x17d0, 0x17e0, 0x0df0, 0x17f0,
+ 0x1800, 0x1800, 0x1800, 0x1800, 0x1810, 0x1820, 0x0db0, 0x1830,
+ 0x1840, 0x1840, 0x1840, 0x1850, 0x1860, 0x1870, 0x0db0, 0x0db0,
+ 0x1880, 0x1880, 0x1880, 0x1880, 0x1890, 0x18a0, 0x18b0, 0x18c0,
+ 0x18d0, 0x18e0, 0x14b0, 0x0550, 0x0550, 0x18f0, 0x1900, 0x0e90,
+ 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x18b0, 0x18b0, 0x1910, 0x1920,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0df0, 0x0df0, 0x1930, 0x0df0, 0x1940, 0x0df0, 0x0df0, 0x1950,
0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1950, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1960, 0x07d0, 0x07d0,
- 0x1970, 0x1980, 0x0650, 0x1990, 0x19a0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x19b0, 0x19c0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x19d0, 0x07d0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x19e0, 0x06b0, 0x06b0, 0x19f0, 0x07d0, 0x07d0, 0x1a00,
- 0x0580, 0x14b0, 0x1a10, 0x0500, 0x0500, 0x1a20, 0x1a30, 0x1a40,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x1a50,
- 0x1a60, 0x0500, 0x0510, 0x0520, 0x0510, 0x0520, 0x1a70, 0x1570,
- 0x1580, 0x1a80, 0x0de0, 0x15e0, 0x1a90, 0x1aa0, 0x1ab0, 0x1ac0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1960, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1970, 0x07d0, 0x07d0,
+ 0x1980, 0x1990, 0x0660, 0x19a0, 0x19b0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x19c0, 0x19d0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x19e0, 0x07d0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x19f0, 0x06c0, 0x06c0, 0x1a00, 0x07d0, 0x07d0, 0x1a10,
+ 0x0590, 0x1740, 0x1a20, 0x0510, 0x0510, 0x1a30, 0x1a40, 0x1a50,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x1a60,
+ 0x1a70, 0x0510, 0x0520, 0x0530, 0x0520, 0x0530, 0x1a80, 0x1580,
+ 0x1590, 0x1a90, 0x0df0, 0x15f0, 0x1aa0, 0x1ab0, 0x1ac0, 0x1ad0,
/* values */
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -222,7 +224,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
- 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0000, 0x0003, 0x0001,
+ 0x0003, 0x0003, 0x0003, 0x0001, 0x0001, 0x0000, 0x0003, 0x0001,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0001, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
@@ -257,8 +259,6 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039,
0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039,
0x0039, 0x0039, 0x0039, 0x0039, 0x0000, 0x0000, 0x0039, 0x0000,
- 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051,
- 0x0051, 0x0051, 0x0051, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003,
@@ -288,7 +288,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
- 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000,
+ 0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020,
0x0020, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
@@ -320,7 +320,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x001f, 0x001f, 0x001f, 0x001f, 0x0000, 0x0000, 0x001f, 0x001f,
0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f,
0x001f, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f,
+ 0x0000, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0045, 0x0045, 0x0045, 0x0000, 0x0045, 0x0045, 0x0045,
0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0000, 0x0000, 0x0045,
0x0045, 0x0000, 0x0000, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045,
@@ -385,12 +385,14 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b,
0x0000, 0x002b, 0x002b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038, 0x0038,
+ 0x0000, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038,
0x0038, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
+ 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
+ 0x0038, 0x0038, 0x0038, 0x0000, 0x0000, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038,
0x0038, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0000, 0x0000, 0x0000, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038,
@@ -589,7 +591,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0000,
0x0002, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0016, 0x0031, 0x0031, 0x0031, 0x0031,
@@ -601,8 +603,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0016, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x001e,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0000, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0000, 0x0000,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0000, 0x0000,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -649,7 +651,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 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, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -671,8 +673,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0000,
0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0000,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
@@ -706,7 +708,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
- 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0000,
+ 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0000, 0x0000,
0x0000, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
@@ -721,8 +723,6 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0000,
0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
- 0x0021, 0x0021, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
@@ -753,6 +753,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
0x0050, 0x0050, 0x0050, 0x0050, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
diff --git a/dlls/dwrite/scripts.h b/dlls/dwrite/scripts.h
index 7202f402e6..bf38988b0a 100644
--- a/dlls/dwrite/scripts.h
+++ b/dlls/dwrite/scripts.h
@@ -1,5 +1,5 @@
/* Unicode Script IDs */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/Scripts.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/Scripts.txt */
/* DO NOT EDIT!! */
enum unicode_script_id {
@@ -141,5 +141,9 @@ enum unicode_script_id {
Script_Osage = 135,
Script_SignWriting = 136,
Script_Tangut = 137,
- Script_LastId = 137
+ Script_Masaram_Gondi = 138,
+ Script_Nushu = 139,
+ Script_Soyombo = 140,
+ Script_Zanabazar_Square = 141,
+ Script_LastId = 141
};
diff --git a/dlls/gdi32/vertical.c b/dlls/gdi32/vertical.c
index 05737604b8..ca4467911c 100644
--- a/dlls/gdi32/vertical.c
+++ b/dlls/gdi32/vertical.c
@@ -1,5 +1,5 @@
/* Unicode Vertical Orientation */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/VerticalOrientation.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/VerticalOrientation.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/bracket.c b/dlls/usp10/bracket.c
index 1509d572c9..16df6381a6 100644
--- a/dlls/usp10/bracket.c
+++ b/dlls/usp10/bracket.c
@@ -1,5 +1,5 @@
/* Unicode Bidirectional Bracket table */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiBrackets.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiBrackets.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/indicsyllable.c b/dlls/usp10/indicsyllable.c
index dbdac5d4ae..709b1d4ae8 100644
--- a/dlls/usp10/indicsyllable.c
+++ b/dlls/usp10/indicsyllable.c
@@ -1,11 +1,11 @@
/* Unicode Indic Syllabic Category */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/IndicSyllabicCategory.txt */
-/* and from http://www.unicode.org/Public/10.0.0/ucd/IndicPositionalCategory.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/IndicSyllabicCategory.txt */
+/* and from http://www.unicode.org/Public/11.0.0/ucd/IndicPositionalCategory.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
+const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3296] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110,
@@ -53,41 +53,41 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0, 0x0500, 0x0400, 0x0270,
0x0510, 0x0520, 0x0370, 0x0530, 0x0540, 0x0550, 0x0330, 0x0270,
0x0560, 0x0520, 0x0370, 0x0570, 0x0580, 0x0590, 0x0330, 0x05a0,
- 0x05b0, 0x0520, 0x02f0, 0x05c0, 0x05d0, 0x05e0, 0x0330, 0x05f0,
- 0x0600, 0x0610, 0x02f0, 0x0620, 0x0630, 0x0640, 0x0400, 0x0650,
- 0x0660, 0x02f0, 0x0670, 0x0680, 0x0690, 0x0290, 0x0270, 0x0270,
- 0x06a0, 0x06b0, 0x06c0, 0x06d0, 0x06e0, 0x06f0, 0x0270, 0x0270,
- 0x0270, 0x0700, 0x0710, 0x0720, 0x0730, 0x02f0, 0x0740, 0x0750,
- 0x0760, 0x0770, 0x0780, 0x0790, 0x07a0, 0x0270, 0x0270, 0x0270,
- 0x02f0, 0x02f0, 0x07b0, 0x07c0, 0x07d0, 0x07e0, 0x07f0, 0x0800,
- 0x0810, 0x0820, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0830, 0x0840, 0x0850, 0x0840, 0x0850, 0x0860, 0x0830, 0x0870,
- 0x02f0, 0x02f0, 0x0880, 0x0890, 0x08a0, 0x08b0, 0x0290, 0x0270,
- 0x08c0, 0x0670, 0x08d0, 0x08e0, 0x0400, 0x02f0, 0x08f0, 0x0900,
- 0x02f0, 0x02f0, 0x0910, 0x0920, 0x0930, 0x0290, 0x0270, 0x0270,
- 0x02f0, 0x0940, 0x02f0, 0x02f0, 0x0950, 0x0960, 0x0970, 0x0980,
+ 0x0560, 0x0520, 0x02f0, 0x05b0, 0x05c0, 0x05d0, 0x0330, 0x05e0,
+ 0x05f0, 0x0600, 0x02f0, 0x0610, 0x0620, 0x0630, 0x0400, 0x0640,
+ 0x0650, 0x02f0, 0x0660, 0x0670, 0x0680, 0x0290, 0x0270, 0x0270,
+ 0x0690, 0x06a0, 0x06b0, 0x06c0, 0x06d0, 0x06e0, 0x0270, 0x0270,
+ 0x0270, 0x06f0, 0x0700, 0x0710, 0x0720, 0x02f0, 0x0730, 0x0740,
+ 0x0750, 0x0760, 0x0770, 0x0780, 0x0790, 0x0270, 0x0270, 0x0270,
+ 0x02f0, 0x02f0, 0x07a0, 0x07b0, 0x07c0, 0x07d0, 0x07e0, 0x07f0,
+ 0x0800, 0x0810, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
+ 0x0820, 0x0830, 0x0840, 0x0830, 0x0840, 0x0850, 0x0820, 0x0860,
+ 0x02f0, 0x02f0, 0x0870, 0x0880, 0x0890, 0x08a0, 0x0290, 0x0270,
+ 0x08b0, 0x0660, 0x08c0, 0x08d0, 0x0400, 0x02f0, 0x08e0, 0x08f0,
+ 0x02f0, 0x02f0, 0x0900, 0x0910, 0x0920, 0x0290, 0x0270, 0x0270,
+ 0x02f0, 0x0930, 0x02f0, 0x02f0, 0x0940, 0x0950, 0x0960, 0x0970,
0x0290, 0x0290, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0990, 0x0850, 0x02f0, 0x09a0, 0x09b0, 0x0290, 0x09c0, 0x09d0,
- 0x09e0, 0x02f0, 0x09f0, 0x0a00, 0x02f0, 0x02f0, 0x0a10, 0x0a20,
- 0x02f0, 0x02f0, 0x0a30, 0x0a40, 0x0a50, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a60, 0x0a70, 0x0a80,
+ 0x0980, 0x0840, 0x02f0, 0x0990, 0x09a0, 0x0290, 0x09b0, 0x09c0,
+ 0x09d0, 0x02f0, 0x09e0, 0x09f0, 0x02f0, 0x02f0, 0x0a00, 0x0a10,
+ 0x02f0, 0x02f0, 0x0a20, 0x0a30, 0x0a40, 0x0270, 0x0270, 0x0270,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a50, 0x0a60, 0x0a70,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a90,
- 0x0aa0, 0x0ab0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0ac0,
- 0x0ad0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a80,
+ 0x0a90, 0x0aa0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0ab0,
+ 0x0ac0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0ae0, 0x0270, 0x0270, 0x0270,
- 0x0af0, 0x02f0, 0x0b00, 0x0270, 0x02f0, 0x0b10, 0x0b20, 0x0b30,
- 0x0b40, 0x0b50, 0x02f0, 0x0b60, 0x0b70, 0x0290, 0x0b80, 0x0b90,
- 0x0ba0, 0x02f0, 0x0bb0, 0x02f0, 0x0bc0, 0x0bd0, 0x0270, 0x0270,
- 0x0be0, 0x02f0, 0x02f0, 0x0bf0, 0x0c00, 0x0290, 0x0c10, 0x0c20,
- 0x0c30, 0x02f0, 0x0c40, 0x0c50, 0x0c60, 0x0290, 0x02f0, 0x0c70,
- 0x02f0, 0x02f0, 0x02f0, 0x0c80, 0x0c90, 0x0270, 0x0ca0, 0x0cb0,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0ad0, 0x0270, 0x0270, 0x0270,
+ 0x0ae0, 0x02f0, 0x0af0, 0x0270, 0x02f0, 0x0b00, 0x0b10, 0x0b20,
+ 0x0b30, 0x0b40, 0x02f0, 0x0b50, 0x0b60, 0x0290, 0x0b70, 0x0b80,
+ 0x0b90, 0x02f0, 0x0ba0, 0x02f0, 0x0bb0, 0x0bc0, 0x0270, 0x0270,
+ 0x0bd0, 0x02f0, 0x02f0, 0x0be0, 0x0bf0, 0x0290, 0x0c00, 0x0c10,
+ 0x0c20, 0x02f0, 0x0c30, 0x0c40, 0x0c50, 0x0290, 0x02f0, 0x0c60,
+ 0x02f0, 0x02f0, 0x02f0, 0x0c70, 0x0c80, 0x0270, 0x0c90, 0x0ca0,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0cc0, 0x0cd0, 0x0ce0, 0x0290,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0cb0, 0x0cc0, 0x0cd0, 0x0290,
/* values */
0x5f00, 0x9c00, 0x9500, 0x9500, 0x8600, 0x8600, 0x8600, 0x8600,
- 0x7e00, 0x6e00, 0x6c00, 0x6000, 0x5100, 0x3c00, 0x2600, 0x1900,
+ 0x7e00, 0x6e00, 0x5d00, 0x5100, 0x4200, 0x2d00, 0x1700, 0x0a00,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -129,7 +129,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0107,
0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a,
0x000a, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0501, 0x0501, 0x0102, 0x0000, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006,
0x000a, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a, 0x000a, 0x0000,
@@ -151,7 +151,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0107, 0x0607, 0x0607, 0x0607, 0x0607, 0x0507, 0x0000, 0x0507,
0x0507, 0x0007, 0x0000, 0x0107, 0x0107, 0x0605, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x000a, 0x0519, 0x0519, 0x0519, 0x0504, 0x0504, 0x0504,
+ 0x0000, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x0000, 0x0000, 0x0604, 0x0003, 0x0107, 0x0507,
0x0107, 0x0607, 0x0607, 0x0607, 0x0607, 0x0000, 0x0000, 0x0207,
@@ -192,10 +192,8 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0000,
0x0000, 0x001f, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0501, 0x0501, 0x0101, 0x0102, 0x0000, 0x0006, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0000, 0x0006, 0x0006,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
- 0x000a, 0x000a, 0x000a, 0x0516, 0x0516, 0x0003, 0x0107, 0x0107,
+ 0x000a, 0x000a, 0x000a, 0x0000, 0x0000, 0x0003, 0x0107, 0x0107,
0x0107, 0x0107, 0x0107, 0x0607, 0x0607, 0x0000, 0x0207, 0x0207,
0x0207, 0x0000, 0x0407, 0x0407, 0x0407, 0x0505, 0x0015, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, 0x0107,
@@ -310,12 +308,12 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0607, 0x0207, 0x0107, 0x0507, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0006, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x000a, 0x000a, 0x020e, 0x060e, 0x010d,
- 0x050f, 0x050f, 0x050c, 0x060d, 0x060d, 0x060d, 0x060d, 0x0000,
+ 0x0006, 0x0006, 0x0006, 0x000a, 0x000a, 0x020e, 0x060e, 0x010f,
+ 0x050f, 0x050f, 0x050f, 0x060f, 0x060f, 0x060f, 0x060f, 0x0000,
0x0017, 0x0107, 0x0507, 0x0107, 0x0107, 0x0507, 0x0507, 0x0507,
0x0507, 0x0607, 0x0607, 0x0507, 0x0607, 0x0107, 0x0207, 0x0207,
- 0x0207, 0x0207, 0x0207, 0x0507, 0x0501, 0x0513, 0x0513, 0x0513,
- 0x0513, 0x0513, 0x0516, 0x0521, 0x0521, 0x0000, 0x0000, 0x0621,
+ 0x0207, 0x0207, 0x0207, 0x0507, 0x0507, 0x0513, 0x0513, 0x0513,
+ 0x0513, 0x0513, 0x0521, 0x0521, 0x0521, 0x0000, 0x0000, 0x0621,
0x0501, 0x0501, 0x0501, 0x050c, 0x0102, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x000a, 0x000a, 0x000a, 0x000a, 0x0504, 0x0107, 0x0507, 0x0507,
@@ -346,7 +344,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0619, 0x0619, 0x0519, 0x0519, 0x0619, 0x0619, 0x0619, 0x0619,
0x0519, 0x0119, 0x0d00, 0x0d00, 0x0d00, 0x0d00, 0x0d00, 0x0d00,
0x0d00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0002, 0x0002, 0x0519, 0x0000, 0x0000, 0x0119,
+ 0x0000, 0x0000, 0x0002, 0x0002, 0x0519, 0x0000, 0x0000, 0x0000,
0x0019, 0x0019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0521, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -380,7 +378,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519,
0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519,
- 0x0519, 0x0519, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0519, 0x0519, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
@@ -393,7 +391,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0501, 0x0501, 0x050c, 0x0102, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x000a, 0x000a, 0x000a, 0x0006, 0x0006, 0x0006, 0x000a,
0x000a, 0x000a, 0x000a, 0x0504, 0x0107, 0x0107, 0x0507, 0x0507,
- 0x0607, 0x0607, 0x0207, 0x0207, 0x0507, 0x010d, 0x010e, 0x000e,
+ 0x0607, 0x0607, 0x0207, 0x0207, 0x0507, 0x010d, 0x010e, 0x010e,
0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0507, 0x0000, 0x000a,
diff --git a/dlls/usp10/linebreak.c b/dlls/usp10/linebreak.c
index 56bde66e9e..cd2ca64952 100644
--- a/dlls/usp10/linebreak.c
+++ b/dlls/usp10/linebreak.c
@@ -1,10 +1,10 @@
/* Unicode Line Break Properties */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/LineBreak.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/LineBreak.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
+const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7264] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
@@ -56,22 +56,22 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0790, 0x07a0, 0x07b0,
0x07c0, 0x07d0, 0x05b0, 0x0580, 0x07e0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x07f0, 0x0800, 0x07b0, 0x05b0, 0x0760, 0x0810,
- 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0870,
- 0x0870, 0x0870, 0x05b0, 0x0880, 0x0870, 0x0890, 0x08a0, 0x0580,
- 0x08b0, 0x05b0, 0x05b0, 0x08c0, 0x0580, 0x08d0, 0x08e0, 0x05b0,
- 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950, 0x0960,
- 0x0970, 0x0900, 0x0910, 0x0980, 0x0990, 0x09a0, 0x09b0, 0x09c0,
- 0x09d0, 0x0690, 0x0910, 0x09e0, 0x09f0, 0x0a00, 0x0950, 0x0a10,
- 0x0a20, 0x0900, 0x0910, 0x09e0, 0x0a30, 0x0a40, 0x0950, 0x0a50,
- 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0, 0x09b0, 0x0ac0,
- 0x0ad0, 0x0ae0, 0x0910, 0x0af0, 0x0b00, 0x0b10, 0x0950, 0x0b20,
- 0x0b30, 0x0ae0, 0x0910, 0x0b40, 0x0b00, 0x0b50, 0x0950, 0x0b60,
- 0x0ad0, 0x0ae0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0950, 0x0ba0,
- 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09b0, 0x0c00,
- 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0870, 0x0870,
- 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0870, 0x0870,
+ 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x05b0, 0x0870, 0x0860, 0x0880, 0x0890, 0x0580,
+ 0x08a0, 0x05b0, 0x05b0, 0x08b0, 0x0580, 0x08c0, 0x08d0, 0x05b0,
+ 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950,
+ 0x0960, 0x08f0, 0x0900, 0x0970, 0x0980, 0x0990, 0x09a0, 0x09b0,
+ 0x09c0, 0x0690, 0x0900, 0x09d0, 0x09e0, 0x09f0, 0x0940, 0x0a00,
+ 0x0a10, 0x08f0, 0x0900, 0x09d0, 0x0a20, 0x0a30, 0x0940, 0x0a40,
+ 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x09a0, 0x0ab0,
+ 0x0ac0, 0x0ad0, 0x0900, 0x0ae0, 0x0af0, 0x0b00, 0x0940, 0x0b10,
+ 0x0b20, 0x0ad0, 0x0900, 0x0b30, 0x0af0, 0x0b40, 0x0940, 0x0b50,
+ 0x0b60, 0x0ad0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0940, 0x0ba0,
+ 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09a0, 0x0c00,
+ 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0860, 0x0860,
+ 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0860, 0x0860,
0x0cc0, 0x0cd0, 0x07b0, 0x0ce0, 0x0cf0, 0x05b0, 0x0d00, 0x0d10,
- 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0870, 0x0870,
+ 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0860, 0x0860,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0d70, 0x0c20, 0x0c20, 0x0c20,
0x0c20, 0x0d80, 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0,
0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0db0, 0x0db0,
@@ -86,16 +86,16 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0e70, 0x0e80, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0e90, 0x0ea0,
0x0eb0, 0x0ec0, 0x05b0, 0x0ed0, 0x05b0, 0x0ee0, 0x0eb0, 0x0ef0,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0f00, 0x0f10, 0x0e50,
- 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a50,
+ 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a40,
0x0f30, 0x05b0, 0x0f40, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0f50,
0x05b0, 0x0840, 0x0f60, 0x0f60, 0x0f70, 0x0c20, 0x0f80, 0x0f90,
0x0c20, 0x0c20, 0x0fa0, 0x0c20, 0x0fb0, 0x0fc0, 0x05b0, 0x05b0,
0x05b0, 0x0fd0, 0x0c20, 0x0c20, 0x0c20, 0x0fe0, 0x0c20, 0x0ff0,
- 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0870, 0x0870, 0x0870, 0x0870,
+ 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0860, 0x0860, 0x0860, 0x0860,
0x1010, 0x05b0, 0x05b0, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060,
0x1070, 0x05b0, 0x1080, 0x07b0, 0x05b0, 0x05b0, 0x07f0, 0x1090,
0x05b0, 0x05b0, 0x1020, 0x10a0, 0x10b0, 0x07b0, 0x05b0, 0x10c0,
- 0x0ea0, 0x0870, 0x0870, 0x0870, 0x0a50, 0x10d0, 0x10e0, 0x10f0,
+ 0x0ea0, 0x0860, 0x0860, 0x0860, 0x0a40, 0x10d0, 0x10e0, 0x10f0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0580, 0x0580, 0x0580, 0x1100,
0x05b0, 0x0e60, 0x05b0, 0x05b0, 0x0e60, 0x1110, 0x05b0, 0x1120,
@@ -108,80 +108,80 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x1320, 0x1330, 0x1340, 0x1350, 0x05b0, 0x05b0, 0x1360, 0x05b0,
0x1370, 0x1380, 0x1390, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x13a0,
- 0x05b0, 0x05b0, 0x13b0, 0x0870, 0x0860, 0x0870, 0x13c0, 0x13c0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13d0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x1270, 0x13c0, 0x13c0, 0x13e0,
- 0x13c0, 0x13f0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x05b0,
- 0x1450, 0x1460, 0x05b0, 0x1470, 0x1480, 0x05b0, 0x1490, 0x14a0,
- 0x05b0, 0x14b0, 0x05b0, 0x14c0, 0x14d0, 0x14e0, 0x14f0, 0x1500,
- 0x1510, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1520, 0x1530, 0x1540,
- 0x13c0, 0x1550, 0x05b0, 0x05b0, 0x1560, 0x05b0, 0x1570, 0x05b0,
+ 0x05b0, 0x05b0, 0x13b0, 0x0860, 0x13c0, 0x0860, 0x13d0, 0x13d0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13e0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x1270, 0x13d0, 0x13d0, 0x13f0,
+ 0x13d0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x1450, 0x05b0,
+ 0x1460, 0x1470, 0x05b0, 0x1480, 0x1490, 0x05b0, 0x14a0, 0x14b0,
+ 0x05b0, 0x14c0, 0x05b0, 0x14d0, 0x14e0, 0x14f0, 0x1500, 0x1510,
+ 0x1520, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1530, 0x1540, 0x1550,
+ 0x13d0, 0x1560, 0x05b0, 0x05b0, 0x1570, 0x05b0, 0x1580, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x1580, 0x1590, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15a0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15b0, 0x05b0, 0x15c0,
- 0x05b0, 0x15d0, 0x05b0, 0x15e0, 0x0910, 0x15f0, 0x1600, 0x0870,
+ 0x1590, 0x15a0, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15c0, 0x05b0, 0x15d0,
+ 0x05b0, 0x15e0, 0x05b0, 0x15f0, 0x0900, 0x1600, 0x1610, 0x0860,
0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1610, 0x1620,
- 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1630, 0x1640,
- 0x05b0, 0x13b0, 0x1650, 0x1650, 0x1650, 0x1650, 0x0580, 0x0580,
- 0x1660, 0x1670, 0x1680, 0x1690, 0x16a0, 0x0870, 0x0870, 0x0870,
- 0x16b0, 0x16c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16d0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16e0, 0x0870, 0x16f0,
- 0x1700, 0x1710, 0x1720, 0x1730, 0x1740, 0x16b0, 0x1750, 0x16b0,
- 0x1760, 0x1770, 0x1780, 0x16b0, 0x1750, 0x16b0, 0x1760, 0x1790,
- 0x17a0, 0x16b0, 0x17b0, 0x17c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x17b0, 0x16b0, 0x16b0, 0x17d0, 0x16b0, 0x16b0, 0x16d0, 0x17e0,
- 0x16b0, 0x17b0, 0x16b0, 0x16b0, 0x17f0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x17b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x16b0, 0x1800, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x1810, 0x16b0, 0x16b0, 0x16b0, 0x1820, 0x05b0, 0x05b0, 0x10c0,
- 0x1830, 0x05b0, 0x1840, 0x0870, 0x05b0, 0x05b0, 0x1610, 0x1850,
- 0x05b0, 0x1860, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1870,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1620, 0x1630,
+ 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1640, 0x1650,
+ 0x05b0, 0x13b0, 0x1660, 0x1660, 0x1660, 0x1660, 0x0580, 0x0580,
+ 0x1670, 0x1680, 0x1690, 0x16a0, 0x16b0, 0x0860, 0x0860, 0x0860,
+ 0x16c0, 0x16d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16f0, 0x0860, 0x1700,
+ 0x1710, 0x1720, 0x1730, 0x1740, 0x1750, 0x16c0, 0x1760, 0x16c0,
+ 0x1770, 0x1780, 0x1790, 0x16c0, 0x1760, 0x16c0, 0x1770, 0x17a0,
+ 0x17b0, 0x16c0, 0x17c0, 0x17d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x17e0, 0x16c0, 0x16c0, 0x17f0, 0x16c0, 0x16c0, 0x16e0, 0x1800,
+ 0x16c0, 0x17e0, 0x16c0, 0x16c0, 0x1810, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x17e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
+ 0x16c0, 0x1820, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x1830, 0x16c0, 0x16c0, 0x16c0, 0x1840, 0x05b0, 0x05b0, 0x10c0,
+ 0x1850, 0x05b0, 0x1860, 0x0860, 0x05b0, 0x05b0, 0x1620, 0x1870,
+ 0x05b0, 0x1880, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1890,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x0840, 0x0a50, 0x0870, 0x0870, 0x0870, 0x1880,
- 0x1890, 0x05b0, 0x18a0, 0x18b0, 0x05b0, 0x05b0, 0x05b0, 0x18c0,
- 0x18d0, 0x05b0, 0x05b0, 0x1020, 0x18e0, 0x0f10, 0x0580, 0x18f0,
- 0x07b0, 0x05b0, 0x1900, 0x05b0, 0x1910, 0x1920, 0x0da0, 0x1930,
- 0x08b0, 0x05b0, 0x05b0, 0x1940, 0x1950, 0x1960, 0x0c20, 0x1970,
- 0x05b0, 0x05b0, 0x1980, 0x1990, 0x19a0, 0x19b0, 0x0c20, 0x0c20,
- 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19c0, 0x19d0, 0x0760, 0x19e0,
- 0x19f0, 0x1a00, 0x1650, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a10, 0x0f10,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a70, 0x0db0, 0x1a80, 0x0dd0, 0x0dd0, 0x1a90,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x13b0, 0x1ab0, 0x1ac0, 0x1ad0, 0x1ae0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1af0, 0x1b00, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x1b10, 0x0870, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x1b20, 0x05b0, 0x05b0, 0x0a50, 0x0870, 0x0870, 0x1b30,
- 0x0580, 0x1b40, 0x0580, 0x1b50, 0x1b60, 0x1b70, 0x1b80, 0x1130,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1b90,
- 0x1ba0, 0x1bb0, 0x16b0, 0x1bc0, 0x16b0, 0x1bd0, 0x1be0, 0x1bf0,
- 0x16b0, 0x1c00, 0x16b0, 0x17b0, 0x1c10, 0x1c20, 0x1c30, 0x1c40,
+ 0x05b0, 0x05b0, 0x0840, 0x0a40, 0x0860, 0x0860, 0x0860, 0x18a0,
+ 0x18b0, 0x05b0, 0x18c0, 0x18d0, 0x05b0, 0x05b0, 0x05b0, 0x18e0,
+ 0x18f0, 0x05b0, 0x05b0, 0x1020, 0x1900, 0x0f10, 0x0580, 0x1910,
+ 0x07b0, 0x05b0, 0x1920, 0x05b0, 0x1930, 0x1940, 0x0da0, 0x1950,
+ 0x08a0, 0x05b0, 0x05b0, 0x1960, 0x1970, 0x1980, 0x0c20, 0x1990,
+ 0x05b0, 0x05b0, 0x19a0, 0x19b0, 0x19c0, 0x19d0, 0x0c20, 0x0c20,
+ 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19e0, 0x19f0, 0x0760, 0x1a00,
+ 0x1a10, 0x1a20, 0x1660, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a30, 0x0f10,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a90, 0x0db0, 0x1aa0, 0x0dd0, 0x0dd0, 0x1ab0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x13b0, 0x1ad0, 0x1ae0, 0x1af0, 0x1b00, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1600, 0x1b10, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x1b20, 0x0860, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x1b30, 0x05b0, 0x05b0, 0x0a40, 0x0860, 0x0860, 0x1b40,
+ 0x0580, 0x1b50, 0x0580, 0x1b60, 0x1b70, 0x1b80, 0x1b90, 0x1130,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1ba0,
+ 0x1bb0, 0x1bc0, 0x16c0, 0x1bd0, 0x16c0, 0x1be0, 0x1bf0, 0x1c00,
+ 0x16c0, 0x1c10, 0x16c0, 0x17e0, 0x1c20, 0x1c30, 0x1c40, 0x1c50,
/* values */
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0022, 0x0003, 0x0001, 0x0001, 0x0002, 0x0004, 0x0004,
@@ -277,8 +277,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x001d, 0x0011,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
@@ -310,7 +308,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x0004, 0x0004, 0x0011, 0x0011, 0x001c, 0x001c,
0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c,
0x001d, 0x001d, 0x001b, 0x001b, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001b, 0x001d, 0x001a, 0x001d, 0x001d, 0x0011, 0x0011,
+ 0x001d, 0x001b, 0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d,
0x001d, 0x0011, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d, 0x0011,
@@ -332,7 +330,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x001d, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0011, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x0004,
@@ -375,8 +373,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x0011,
0x0011, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0004, 0x0004, 0x001d, 0x0004, 0x0004,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0004, 0x0004,
0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x0004,
@@ -551,10 +551,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x001d, 0x001d, 0x001d, 0x001d, 0x0004, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0004,
+ 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0011,
0x0004, 0x0004, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -638,9 +638,11 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0012, 0x0013, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001e, 0x001e, 0x001e, 0x001e, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
@@ -711,7 +713,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -733,8 +735,8 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0012, 0x0013, 0x0022, 0x0022, 0x0022, 0x0022, 0x0017, 0x001d,
0x0022, 0x0022, 0x001d, 0x0022, 0x0022, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0025, 0x0025, 0x0022, 0x0022, 0x0022, 0x001d,
- 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
- 0x0022, 0x0022, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -768,10 +770,12 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
- 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011, 0x0011,
0x0011, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
@@ -871,8 +875,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0011, 0x0026, 0x0011,
0x0026, 0x0026, 0x0011, 0x0026, 0x0026, 0x0011, 0x0026, 0x0026,
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026,
- 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
diff --git a/dlls/usp10/mirror.c b/dlls/usp10/mirror.c
index 23dab536c4..daadfa8054 100644
--- a/dlls/usp10/mirror.c
+++ b/dlls/usp10/mirror.c
@@ -1,5 +1,5 @@
/* Unicode BiDi mirroring */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiMirroring.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiMirroring.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/shaping.c b/dlls/usp10/shaping.c
index 82435ff2c3..cf6f3b4a97 100644
--- a/dlls/usp10/shaping.c
+++ b/dlls/usp10/shaping.c
@@ -1,10 +1,10 @@
/* Unicode Arabic shaping */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/ArabicShaping.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/ArabicShaping.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
+const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2864] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160,
@@ -54,64 +54,64 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0410, 0x0420, 0x0430, 0x0440, 0x0450, 0x0460, 0x0470, 0x0480,
0x0490, 0x04a0, 0x04b0, 0x0360, 0x04c0, 0x04d0, 0x04e0, 0x04f0,
0x0340, 0x0340, 0x0500, 0x0510, 0x0520, 0x0530, 0x0540, 0x0550,
- 0x0340, 0x0560, 0x0570, 0x0340, 0x0580, 0x0590, 0x05a0, 0x0340,
- 0x0340, 0x0340, 0x05b0, 0x05c0, 0x0340, 0x05d0, 0x05e0, 0x0360,
- 0x05f0, 0x0340, 0x0340, 0x0600, 0x0610, 0x0620, 0x0630, 0x0340,
- 0x0640, 0x0340, 0x0340, 0x0650, 0x0660, 0x0340, 0x0630, 0x0340,
- 0x0670, 0x0340, 0x0340, 0x0650, 0x0680, 0x0640, 0x0340, 0x0690,
- 0x0670, 0x0340, 0x0340, 0x0650, 0x06a0, 0x0340, 0x0630, 0x06b0,
- 0x0640, 0x0340, 0x0340, 0x06c0, 0x0660, 0x06d0, 0x0630, 0x0340,
- 0x06e0, 0x0340, 0x0340, 0x0340, 0x06f0, 0x0340, 0x0340, 0x0340,
- 0x0510, 0x0340, 0x0340, 0x0700, 0x0710, 0x0720, 0x0630, 0x0340,
- 0x0640, 0x0340, 0x0340, 0x06c0, 0x0730, 0x0340, 0x0630, 0x0340,
- 0x0740, 0x0340, 0x0340, 0x0750, 0x0660, 0x0340, 0x0630, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0760, 0x0770, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0780, 0x0790, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x07a0, 0x07b0, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x07c0, 0x0340, 0x07d0, 0x0340, 0x0340, 0x0340, 0x07e0,
- 0x07f0, 0x0800, 0x0360, 0x0810, 0x06d0, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0820, 0x0830, 0x0340, 0x0840, 0x0510, 0x0850,
- 0x0860, 0x0350, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0820, 0x0340, 0x0340,
+ 0x0340, 0x0560, 0x0570, 0x0340, 0x0580, 0x0590, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x05a0, 0x05b0, 0x0340, 0x05c0, 0x05d0, 0x0360,
+ 0x05e0, 0x0340, 0x0340, 0x05f0, 0x0600, 0x0610, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x0640, 0x0650, 0x0340, 0x0620, 0x0340,
+ 0x0660, 0x0340, 0x0340, 0x0640, 0x0670, 0x0630, 0x0340, 0x0680,
+ 0x0660, 0x0340, 0x0340, 0x0640, 0x0690, 0x0340, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x06a0, 0x0650, 0x06b0, 0x0620, 0x0340,
+ 0x06c0, 0x0340, 0x0340, 0x0340, 0x06d0, 0x0340, 0x0340, 0x0340,
+ 0x0510, 0x0340, 0x0340, 0x06e0, 0x06f0, 0x0700, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x06a0, 0x0710, 0x0340, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x0340, 0x0650, 0x0340, 0x0620, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0720, 0x0730, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0740, 0x0750, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0760, 0x0770, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0780, 0x0340, 0x0790, 0x0340, 0x0340, 0x0340, 0x07a0,
+ 0x07b0, 0x07c0, 0x0360, 0x07d0, 0x06b0, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x07e0, 0x07f0, 0x0340, 0x0800, 0x0510, 0x0810,
+ 0x0820, 0x0350, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x07e0, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0870, 0x0340, 0x0870, 0x0340, 0x0630, 0x0340, 0x0630,
- 0x0340, 0x0340, 0x0340, 0x0880, 0x0890, 0x08a0, 0x0340, 0x0340,
- 0x08b0, 0x0340, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x08c0,
- 0x08d0, 0x0530, 0x08e0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x08f0, 0x0900, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0830, 0x0340, 0x0830, 0x0340, 0x0620, 0x0340, 0x0620,
+ 0x0340, 0x0340, 0x0340, 0x0840, 0x0850, 0x0860, 0x0340, 0x0340,
+ 0x0870, 0x0340, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0880,
+ 0x0890, 0x0530, 0x08a0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x08b0, 0x08c0, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0910, 0x0340, 0x0340, 0x0340, 0x0920, 0x0930, 0x0940,
- 0x0340, 0x0340, 0x0340, 0x0950, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0960, 0x0340, 0x0340, 0x0970, 0x06e0, 0x0340, 0x0980, 0x0960,
- 0x0740, 0x0340, 0x0990, 0x0340, 0x0340, 0x0340, 0x09a0, 0x0740,
- 0x0340, 0x0340, 0x09b0, 0x09c0, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x09d0, 0x09e0, 0x09f0,
+ 0x0340, 0x08d0, 0x0340, 0x0340, 0x0340, 0x08e0, 0x08f0, 0x0900,
+ 0x0340, 0x0340, 0x0340, 0x0910, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0920, 0x0340, 0x0340, 0x0930, 0x06c0, 0x0340, 0x0940, 0x0920,
+ 0x0950, 0x0340, 0x0960, 0x0340, 0x0340, 0x0340, 0x0970, 0x0950,
+ 0x0340, 0x0340, 0x0980, 0x0990, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x09a0, 0x09b0, 0x09c0,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0360, 0x0a00,
- 0x0a10, 0x0340, 0x0a20, 0x0340, 0x0340, 0x0340, 0x0a30, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0360, 0x09d0,
+ 0x09e0, 0x0340, 0x09f0, 0x0340, 0x0340, 0x0340, 0x0a00, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0510,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0740,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0950,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360,
- 0x0340, 0x0340, 0x0a40, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0a50, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0a60,
- 0x0340, 0x0700, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0740,
- 0x0a70, 0x0340, 0x0720, 0x0340, 0x0530, 0x0530, 0x0530, 0x0a80,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0a90, 0x0340, 0x0360, 0x0740,
- 0x0340, 0x0340, 0x0aa0, 0x0340, 0x0ab0, 0x0740, 0x0340, 0x0340,
- 0x05f0, 0x0340, 0x0340, 0x0ac0, 0x0340, 0x0340, 0x0ad0, 0x0340,
- 0x0340, 0x0340, 0x0ae0, 0x0af0, 0x0b00, 0x0340, 0x0340, 0x0650,
- 0x0340, 0x0340, 0x0340, 0x0b10, 0x0640, 0x0340, 0x0b20, 0x06d0,
+ 0x0340, 0x0340, 0x0a10, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0a20, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0a30,
+ 0x0340, 0x06e0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0950,
+ 0x0a40, 0x0340, 0x0700, 0x0340, 0x0530, 0x0530, 0x0530, 0x0a50,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0a60, 0x0340, 0x0360, 0x0950,
+ 0x0340, 0x0340, 0x0a70, 0x0340, 0x0a80, 0x0950, 0x0340, 0x0340,
+ 0x05e0, 0x0340, 0x0340, 0x0a90, 0x0340, 0x0340, 0x0aa0, 0x0340,
+ 0x0340, 0x0340, 0x0ab0, 0x0ac0, 0x0ad0, 0x0340, 0x0340, 0x0640,
+ 0x0340, 0x0340, 0x0340, 0x0ae0, 0x0630, 0x0340, 0x0af0, 0x06b0,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b30, 0x0340,
- 0x0340, 0x0b40, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b00, 0x0340,
+ 0x0340, 0x0b10, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0360, 0x0340, 0x0360, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b50,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b20,
/* values */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -189,12 +189,10 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0004, 0x0002, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0004, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3404, 0x3400, 0x3404, 0x3404, 0x3404, 0x3404, 0x3400, 0x3402,
- 0x3404, 0x3402, 0x3402, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0404, 0x0404, 0x0604, 0x0b04, 0x0f04, 0x1004, 0x1204, 0x1304,
- 0x0104, 0x0104, 0x0802, 0x0302, 0x3502, 0x0000, 0x0702, 0x0a04,
- 0x0d04, 0x3602, 0x0802, 0x0c04, 0x1104, 0x0000, 0x0404, 0x0404,
- 0x0404, 0x0802, 0x0104, 0x3704, 0x3704, 0x3704, 0x0000, 0x0000,
+ 0x0104, 0x0104, 0x0802, 0x0302, 0x3402, 0x0000, 0x0702, 0x0a04,
+ 0x0d04, 0x3502, 0x0802, 0x0c04, 0x1104, 0x0000, 0x0404, 0x0404,
+ 0x0404, 0x0802, 0x0104, 0x3604, 0x3604, 0x3604, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -224,8 +222,6 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -241,10 +237,6 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000,
- 0x0001, 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, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000,
@@ -315,6 +307,8 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
@@ -329,8 +323,8 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
diff --git a/dlls/wineps.drv/vertical.c b/dlls/wineps.drv/vertical.c
index 05737604b8..ca4467911c 100644
--- a/dlls/wineps.drv/vertical.c
+++ b/dlls/wineps.drv/vertical.c
@@ -1,5 +1,5 @@
/* Unicode Vertical Orientation */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/VerticalOrientation.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/VerticalOrientation.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/compose.c b/libs/port/compose.c
index 71589f47c1..06f6062d24 100644
--- a/libs/port/compose.c
+++ b/libs/port/compose.c
@@ -1,5 +1,5 @@
/* Unicode char composition */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index 221d2e0e92..5e6b2214ec 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -1,5 +1,5 @@
/* Unicode char composition */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/digitmap.c b/libs/port/digitmap.c
index 786879a90a..79a86651cc 100644
--- a/libs/port/digitmap.c
+++ b/libs/port/digitmap.c
@@ -1,5 +1,5 @@
/* Unicode digit folding mappings */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/wine/casemap.c b/libs/wine/casemap.c
index bfab3233ee..122f81ff2f 100644
--- a/libs/wine/casemap.c
+++ b/libs/wine/casemap.c
@@ -1,5 +1,5 @@
/* Unicode case mappings */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/wine/wctype.c b/libs/wine/wctype.c
index 8d0a3ed94d..5a79353985 100644
--- a/libs/wine/wctype.c
+++ b/libs/wine/wctype.c
@@ -307,8 +307,8 @@ const unsigned short wine_wctype_table[17152] =
0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300,
0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300,
0x2300, 0xd200, 0xd200, 0xd200, 0x0000, 0x0000, 0x2210, 0x0000,
- 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300,
- 0xc300, 0xc300, 0xc300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -358,7 +358,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0xd200, 0xd200, 0x0000, 0x0000, 0x1204, 0x1204,
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x1300, 0x1300, 0x5200, 0x5200, 0x1200, 0x1200, 0x1200, 0x1200,
- 0x1200, 0x1200, 0x1200, 0x5200, 0x1300, 0x1210, 0x0000, 0x0000,
+ 0x1200, 0x1200, 0x1200, 0x5200, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xd200, 0xd200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x1300,
0x1300, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -390,7 +390,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0xd200, 0xd200, 0x0000, 0x0000, 0x1204, 0x1204,
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x1210, 0x5200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x1300, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
+ 0x0000, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x1300,
0x1300, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -455,14 +455,14 @@ const unsigned short wine_wctype_table[17152] =
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x0000, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0xd200, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
+ 0x0000, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x1300, 0x1300,
0x1300, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0xd200, 0xd200, 0x1300, 0x1200, 0x1200,
+ 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x1300, 0x1200, 0x1200,
0x1200, 0xd200, 0xd200, 0xd200, 0xd200, 0x0000, 0x1200, 0x1200,
0x1200, 0x0000, 0x1200, 0x1200, 0x1200, 0xd200, 0x1300, 0x1200,
0x0000, 0x0000, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1200,
@@ -933,7 +933,7 @@ const unsigned short wine_wctype_table[17152] =
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0x1200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0x1300, 0x1300, 0x1300, 0x1300, 0xd200, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1200, 0x1200, 0xd200, 0x1300, 0x1300, 0x1200,
+ 0x1300, 0x1300, 0x1200, 0x1200, 0xd200, 0x1300, 0x1300, 0x0000,
0xd200, 0xd200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302,
0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302,
@@ -965,8 +965,8 @@ const unsigned short wine_wctype_table[17152] =
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
- 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
- 0xd200, 0xd200, 0x0000, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
+ 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
@@ -1054,7 +1054,7 @@ const unsigned short wine_wctype_table[17152] =
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
- 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
+ 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
@@ -1158,7 +1158,7 @@ const unsigned short wine_wctype_table[17152] =
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
- 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
+ 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0x0000,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
@@ -1377,7 +1377,7 @@ const unsigned short wine_wctype_table[17152] =
0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0x0000, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
- 0xb200, 0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xb200, 0xb200, 0xb200, 0xb200,
@@ -1455,8 +1455,8 @@ const unsigned short wine_wctype_table[17152] =
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb300,
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
- 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
- 0xb210, 0xb210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -1548,7 +1548,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000,
+ 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000,
0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -1697,10 +1697,10 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
diff --git a/tools/make_unicode b/tools/make_unicode
index 92b0b64a94..a22cd044b7 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -23,7 +23,7 @@ use strict;
# base URLs for www.unicode.org files
my $MAPPINGS = "http://www.unicode.org/Public/MAPPINGS";
-my $UNIDATA = "http://www.unicode.org/Public/10.0.0/ucd";
+my $UNIDATA = "http://www.unicode.org/Public/11.0.0/ucd";
my $REPORTS = "http://www.unicode.org/reports";
my $RFCS = "http://www.rfc-editor.org/rfc";
@@ -1462,7 +1462,12 @@ my %scripts =
"Old_Hungarian" => 134,
"Osage" => 135,
"SignWriting" => 136,
- "Tangut" => 137
+ "Tangut" => 137,
+ # Win10 RS4
+ "Masaram_Gondi" => 138,
+ "Nushu" => 139,
+ "Soyombo" => 140,
+ "Zanabazar_Square" => 141
);
################################################################
--
2.18.0
June 30, 2018
Re: [PATCH] tools: Update to Unicode 11.0.0.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39464
Your paranoid android.
=== w7u (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
=== w7pro64 (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
=== w8 (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
=== w8adm (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
=== w864 (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
=== w1064 (32 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 103: { /* Bass */ { 0x73736142, 259, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 104: { /* Aghb */ { 0x62686741, 239, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 105: { /* Dupl */ { 0x6c707544, 755, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 106: { /* Elba */ { 0x61626c45, 226, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 107: { /* Gran */ { 0x6e617247, 343, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 108: { /* Khoj */ { 0x6a6f684b, 322, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 109: { /* Sind */ { 0x646e6953, 318, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 110: { /* Lina */ { 0x616e694c, 400, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 111: { /* Mahj */ { 0x6a68614d, 314, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 112: { /* Mani */ { 0x696e614d, 139, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 113: { /* Mend */ { 0x646e654d, 438, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 114: { /* Modi */ { 0x69646f4d, 324, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 115: { /* Mroo */ { 0x6f6f724d, 199, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 116: { /* Nbat */ { 0x7461624e, 159, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 117: { /* Narb */ { 0x6272614e, 106, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 118: { /* Perm */ { 0x6d726550, 227, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 119: { /* Hmng */ { 0x676e6d48, 450, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 120: { /* Palm */ { 0x6d6c6150, 126, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 121: { /* Pauc */ { 0x63756150, 263, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 122: { /* Phlp */ { 0x706c6850, 132, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 123: { /* Sidd */ { 0x64646953, 302, 8, 0x0020, 1, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 124: { /* Tirh */ { 0x68726954, 326, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 125: { /* Wara */ { 0x61726157, 262, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
=== w7pro64 (64 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
=== w864 (64 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
=== w1064 (64 bit analyzer) ===
analyzer.c:1200: Test failed: 0: { /* Zzzz */ { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 1: { /* Zyyy */ { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 2: { /* Zinh */ { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 3: { /* Arab */ { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 4: { /* Armn */ { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 5: { /* Avst */ { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 6: { /* Bali */ { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 7: { /* Bamu */ { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 8: { /* Batk */ { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 9: { /* Beng */ { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 10: { /* Bopo */ { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 11: { /* Brah */ { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 12: { /* Brai */ { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 13: { /* Bugi */ { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 14: { /* Buhd */ { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 15: { /* Cans */ { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 16: { /* Cari */ { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 17: { /* Cham */ { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 18: { /* Cher */ { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 19: { /* Copt */ { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 20: { /* Xsux */ { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 21: { /* Cprt */ { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 22: { /* Cyrl */ { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 23: { /* Dsrt */ { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 24: { /* Deva */ { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 25: { /* Egyp */ { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 26: { /* Ethi */ { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 27: { /* Geor */ { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 28: { /* Glag */ { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 29: { /* Goth */ { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 30: { /* Grek */ { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 31: { /* Gujr */ { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 32: { /* Guru */ { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 33: { /* Hani */ { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 34: { /* Hang */ { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 35: { /* Hano */ { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 36: { /* Hebr */ { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 37: { /* Hira */ { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 38: { /* Armi */ { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 39: { /* Phli */ { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 40: { /* Prti */ { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 41: { /* Java */ { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 42: { /* Kthi */ { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 43: { /* Knda */ { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 44: { /* Kana */ { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 45: { /* Kali */ { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 46: { /* Khar */ { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 47: { /* Khmr */ { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 48: { /* Laoo */ { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 49: { /* Latn */ { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 50: { /* Lepc */ { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 51: { /* Limb */ { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 52: { /* Linb */ { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 53: { /* Lisu */ { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 54: { /* Lyci */ { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 55: { /* Lydi */ { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 56: { /* Mlym */ { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 57: { /* Mand */ { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 58: { /* Mtei */ { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 59: { /* Mong */ { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 60: { /* Mymr */ { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 61: { /* Talu */ { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 62: { /* Nkoo */ { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 63: { /* Ogam */ { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 64: { /* Olck */ { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 65: { /* Ital */ { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 66: { /* Xpeo */ { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 67: { /* Sarb */ { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 68: { /* Orkh */ { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 69: { /* Orya */ { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 70: { /* Osma */ { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 71: { /* Phag */ { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 72: { /* Phnx */ { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 73: { /* Rjng */ { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 74: { /* Runr */ { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 75: { /* Samr */ { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 76: { /* Saur */ { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 77: { /* Shaw */ { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 78: { /* Sinh */ { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 79: { /* Sund */ { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 80: { /* Sylo */ { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 81: { /* Syrc */ { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 82: { /* Tglg */ { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 83: { /* Tagb */ { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 84: { /* Tale */ { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 85: { /* Lana */ { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 86: { /* Tavt */ { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 87: { /* Taml */ { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 88: { /* Telu */ { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 89: { /* Thaa */ { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 90: { /* Thai */ { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 } },
analyzer.c:1200: Test failed: 91: { /* Tibt */ { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 92: { /* Tfng */ { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 93: { /* Ugar */ { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 94: { /* Vaii */ { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 95: { /* Yiii */ { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 96: { /* Cakm */ { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 97: { /* Merc */ { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 98: { /* Mero */ { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 99: { /* Plrd */ { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 100: { /* Shrd */ { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 101: { /* Sora */ { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 102: { /* Takr */ { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 103: { /* Bass */ { 0x73736142, 259, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 104: { /* Aghb */ { 0x62686741, 239, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 105: { /* Dupl */ { 0x6c707544, 755, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 106: { /* Elba */ { 0x61626c45, 226, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 107: { /* Gran */ { 0x6e617247, 343, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 108: { /* Khoj */ { 0x6a6f684b, 322, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 109: { /* Sind */ { 0x646e6953, 318, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 110: { /* Lina */ { 0x616e694c, 400, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 111: { /* Mahj */ { 0x6a68614d, 314, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 112: { /* Mani */ { 0x696e614d, 139, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 113: { /* Mend */ { 0x646e654d, 438, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 114: { /* Modi */ { 0x69646f4d, 324, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 115: { /* Mroo */ { 0x6f6f724d, 199, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 116: { /* Nbat */ { 0x7461624e, 159, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 117: { /* Narb */ { 0x6272614e, 106, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 118: { /* Perm */ { 0x6d726550, 227, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 119: { /* Hmng */ { 0x676e6d48, 450, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 120: { /* Palm */ { 0x6d6c6150, 126, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 121: { /* Pauc */ { 0x63756150, 263, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
analyzer.c:1200: Test failed: 122: { /* Phlp */ { 0x706c6850, 132, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 } },
analyzer.c:1200: Test failed: 123: { /* Sidd */ { 0x64646953, 302, 8, 0x0020, 1, 0, 1, 1, 0, 0, 0 } },
analyzer.c:1200: Test failed: 124: { /* Tirh */ { 0x68726954, 326, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 } },
analyzer.c:1200: Test failed: 125: { /* Wara */ { 0x61726157, 262, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
June 30, 2018
[PATCH] tools: Update to Unicode 11.0.0.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/analyzer.c | 4 +
dlls/dwrite/bracket.c | 2 +-
dlls/dwrite/linebreak.c | 214 ++++++++++++------------
dlls/dwrite/mirror.c | 2 +-
dlls/dwrite/scripts.c | 308 ++++++++++++++++++-----------------
dlls/dwrite/scripts.h | 8 +-
dlls/dwrite/tests/analyzer.c | 12 ++
dlls/gdi32/vertical.c | 2 +-
dlls/usp10/bracket.c | 2 +-
dlls/usp10/indicsyllable.c | 86 +++++-----
dlls/usp10/linebreak.c | 214 ++++++++++++------------
dlls/usp10/mirror.c | 2 +-
dlls/usp10/shaping.c | 116 +++++++------
dlls/wineps.drv/vertical.c | 2 +-
libs/port/compose.c | 2 +-
libs/port/decompose.c | 2 +-
libs/port/digitmap.c | 2 +-
libs/wine/casemap.c | 2 +-
libs/wine/wctype.c | 38 ++---
tools/make_unicode | 9 +-
20 files changed, 526 insertions(+), 503 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 8d553c6d56..19214ee392 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -184,6 +184,10 @@ static const struct dwritescript_properties dwritescripts_properties[Script_Last
{ /* Osge */ { 0x6567734f, 219, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('o','s','g','e') },
{ /* Sgnw */ { 0x776e6753, 95, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('s','g','n','w') },
{ /* Tang */ { 0x676e6154, 520, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('t','a','n','g') },
+ { /* Gonm */ { 0x6d6e6f47, 313, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('g','o','n','m') },
+ { /* Nshu */ { 0x7568734e, 499, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, _OT('n','s','h','u') },
+ { /* Soyo */ { 0x6f796f53, 329, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('s','o','y','o') },
+ { /* Zanb */ { 0x626e615a, 339, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, _OT('z','a','n','b') },
};
#undef _OT
diff --git a/dlls/dwrite/bracket.c b/dlls/dwrite/bracket.c
index 1509d572c9..16df6381a6 100644
--- a/dlls/dwrite/bracket.c
+++ b/dlls/dwrite/bracket.c
@@ -1,5 +1,5 @@
/* Unicode Bidirectional Bracket table */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiBrackets.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiBrackets.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/dwrite/linebreak.c b/dlls/dwrite/linebreak.c
index 56bde66e9e..cd2ca64952 100644
--- a/dlls/dwrite/linebreak.c
+++ b/dlls/dwrite/linebreak.c
@@ -1,10 +1,10 @@
/* Unicode Line Break Properties */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/LineBreak.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/LineBreak.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
+const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7264] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
@@ -56,22 +56,22 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0790, 0x07a0, 0x07b0,
0x07c0, 0x07d0, 0x05b0, 0x0580, 0x07e0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x07f0, 0x0800, 0x07b0, 0x05b0, 0x0760, 0x0810,
- 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0870,
- 0x0870, 0x0870, 0x05b0, 0x0880, 0x0870, 0x0890, 0x08a0, 0x0580,
- 0x08b0, 0x05b0, 0x05b0, 0x08c0, 0x0580, 0x08d0, 0x08e0, 0x05b0,
- 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950, 0x0960,
- 0x0970, 0x0900, 0x0910, 0x0980, 0x0990, 0x09a0, 0x09b0, 0x09c0,
- 0x09d0, 0x0690, 0x0910, 0x09e0, 0x09f0, 0x0a00, 0x0950, 0x0a10,
- 0x0a20, 0x0900, 0x0910, 0x09e0, 0x0a30, 0x0a40, 0x0950, 0x0a50,
- 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0, 0x09b0, 0x0ac0,
- 0x0ad0, 0x0ae0, 0x0910, 0x0af0, 0x0b00, 0x0b10, 0x0950, 0x0b20,
- 0x0b30, 0x0ae0, 0x0910, 0x0b40, 0x0b00, 0x0b50, 0x0950, 0x0b60,
- 0x0ad0, 0x0ae0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0950, 0x0ba0,
- 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09b0, 0x0c00,
- 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0870, 0x0870,
- 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0870, 0x0870,
+ 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x05b0, 0x0870, 0x0860, 0x0880, 0x0890, 0x0580,
+ 0x08a0, 0x05b0, 0x05b0, 0x08b0, 0x0580, 0x08c0, 0x08d0, 0x05b0,
+ 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950,
+ 0x0960, 0x08f0, 0x0900, 0x0970, 0x0980, 0x0990, 0x09a0, 0x09b0,
+ 0x09c0, 0x0690, 0x0900, 0x09d0, 0x09e0, 0x09f0, 0x0940, 0x0a00,
+ 0x0a10, 0x08f0, 0x0900, 0x09d0, 0x0a20, 0x0a30, 0x0940, 0x0a40,
+ 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x09a0, 0x0ab0,
+ 0x0ac0, 0x0ad0, 0x0900, 0x0ae0, 0x0af0, 0x0b00, 0x0940, 0x0b10,
+ 0x0b20, 0x0ad0, 0x0900, 0x0b30, 0x0af0, 0x0b40, 0x0940, 0x0b50,
+ 0x0b60, 0x0ad0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0940, 0x0ba0,
+ 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09a0, 0x0c00,
+ 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0860, 0x0860,
+ 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0860, 0x0860,
0x0cc0, 0x0cd0, 0x07b0, 0x0ce0, 0x0cf0, 0x05b0, 0x0d00, 0x0d10,
- 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0870, 0x0870,
+ 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0860, 0x0860,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0d70, 0x0c20, 0x0c20, 0x0c20,
0x0c20, 0x0d80, 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0,
0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0db0, 0x0db0,
@@ -86,16 +86,16 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0e70, 0x0e80, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0e90, 0x0ea0,
0x0eb0, 0x0ec0, 0x05b0, 0x0ed0, 0x05b0, 0x0ee0, 0x0eb0, 0x0ef0,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0f00, 0x0f10, 0x0e50,
- 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a50,
+ 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a40,
0x0f30, 0x05b0, 0x0f40, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0f50,
0x05b0, 0x0840, 0x0f60, 0x0f60, 0x0f70, 0x0c20, 0x0f80, 0x0f90,
0x0c20, 0x0c20, 0x0fa0, 0x0c20, 0x0fb0, 0x0fc0, 0x05b0, 0x05b0,
0x05b0, 0x0fd0, 0x0c20, 0x0c20, 0x0c20, 0x0fe0, 0x0c20, 0x0ff0,
- 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0870, 0x0870, 0x0870, 0x0870,
+ 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0860, 0x0860, 0x0860, 0x0860,
0x1010, 0x05b0, 0x05b0, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060,
0x1070, 0x05b0, 0x1080, 0x07b0, 0x05b0, 0x05b0, 0x07f0, 0x1090,
0x05b0, 0x05b0, 0x1020, 0x10a0, 0x10b0, 0x07b0, 0x05b0, 0x10c0,
- 0x0ea0, 0x0870, 0x0870, 0x0870, 0x0a50, 0x10d0, 0x10e0, 0x10f0,
+ 0x0ea0, 0x0860, 0x0860, 0x0860, 0x0a40, 0x10d0, 0x10e0, 0x10f0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0580, 0x0580, 0x0580, 0x1100,
0x05b0, 0x0e60, 0x05b0, 0x05b0, 0x0e60, 0x1110, 0x05b0, 0x1120,
@@ -108,80 +108,80 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x1320, 0x1330, 0x1340, 0x1350, 0x05b0, 0x05b0, 0x1360, 0x05b0,
0x1370, 0x1380, 0x1390, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x13a0,
- 0x05b0, 0x05b0, 0x13b0, 0x0870, 0x0860, 0x0870, 0x13c0, 0x13c0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13d0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x1270, 0x13c0, 0x13c0, 0x13e0,
- 0x13c0, 0x13f0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x05b0,
- 0x1450, 0x1460, 0x05b0, 0x1470, 0x1480, 0x05b0, 0x1490, 0x14a0,
- 0x05b0, 0x14b0, 0x05b0, 0x14c0, 0x14d0, 0x14e0, 0x14f0, 0x1500,
- 0x1510, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1520, 0x1530, 0x1540,
- 0x13c0, 0x1550, 0x05b0, 0x05b0, 0x1560, 0x05b0, 0x1570, 0x05b0,
+ 0x05b0, 0x05b0, 0x13b0, 0x0860, 0x13c0, 0x0860, 0x13d0, 0x13d0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13e0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x1270, 0x13d0, 0x13d0, 0x13f0,
+ 0x13d0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x1450, 0x05b0,
+ 0x1460, 0x1470, 0x05b0, 0x1480, 0x1490, 0x05b0, 0x14a0, 0x14b0,
+ 0x05b0, 0x14c0, 0x05b0, 0x14d0, 0x14e0, 0x14f0, 0x1500, 0x1510,
+ 0x1520, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1530, 0x1540, 0x1550,
+ 0x13d0, 0x1560, 0x05b0, 0x05b0, 0x1570, 0x05b0, 0x1580, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x1580, 0x1590, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15a0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15b0, 0x05b0, 0x15c0,
- 0x05b0, 0x15d0, 0x05b0, 0x15e0, 0x0910, 0x15f0, 0x1600, 0x0870,
+ 0x1590, 0x15a0, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15c0, 0x05b0, 0x15d0,
+ 0x05b0, 0x15e0, 0x05b0, 0x15f0, 0x0900, 0x1600, 0x1610, 0x0860,
0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1610, 0x1620,
- 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1630, 0x1640,
- 0x05b0, 0x13b0, 0x1650, 0x1650, 0x1650, 0x1650, 0x0580, 0x0580,
- 0x1660, 0x1670, 0x1680, 0x1690, 0x16a0, 0x0870, 0x0870, 0x0870,
- 0x16b0, 0x16c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16d0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16e0, 0x0870, 0x16f0,
- 0x1700, 0x1710, 0x1720, 0x1730, 0x1740, 0x16b0, 0x1750, 0x16b0,
- 0x1760, 0x1770, 0x1780, 0x16b0, 0x1750, 0x16b0, 0x1760, 0x1790,
- 0x17a0, 0x16b0, 0x17b0, 0x17c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x17b0, 0x16b0, 0x16b0, 0x17d0, 0x16b0, 0x16b0, 0x16d0, 0x17e0,
- 0x16b0, 0x17b0, 0x16b0, 0x16b0, 0x17f0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x17b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x16b0, 0x1800, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x1810, 0x16b0, 0x16b0, 0x16b0, 0x1820, 0x05b0, 0x05b0, 0x10c0,
- 0x1830, 0x05b0, 0x1840, 0x0870, 0x05b0, 0x05b0, 0x1610, 0x1850,
- 0x05b0, 0x1860, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1870,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1620, 0x1630,
+ 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1640, 0x1650,
+ 0x05b0, 0x13b0, 0x1660, 0x1660, 0x1660, 0x1660, 0x0580, 0x0580,
+ 0x1670, 0x1680, 0x1690, 0x16a0, 0x16b0, 0x0860, 0x0860, 0x0860,
+ 0x16c0, 0x16d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16f0, 0x0860, 0x1700,
+ 0x1710, 0x1720, 0x1730, 0x1740, 0x1750, 0x16c0, 0x1760, 0x16c0,
+ 0x1770, 0x1780, 0x1790, 0x16c0, 0x1760, 0x16c0, 0x1770, 0x17a0,
+ 0x17b0, 0x16c0, 0x17c0, 0x17d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x17e0, 0x16c0, 0x16c0, 0x17f0, 0x16c0, 0x16c0, 0x16e0, 0x1800,
+ 0x16c0, 0x17e0, 0x16c0, 0x16c0, 0x1810, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x17e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
+ 0x16c0, 0x1820, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x1830, 0x16c0, 0x16c0, 0x16c0, 0x1840, 0x05b0, 0x05b0, 0x10c0,
+ 0x1850, 0x05b0, 0x1860, 0x0860, 0x05b0, 0x05b0, 0x1620, 0x1870,
+ 0x05b0, 0x1880, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1890,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x0840, 0x0a50, 0x0870, 0x0870, 0x0870, 0x1880,
- 0x1890, 0x05b0, 0x18a0, 0x18b0, 0x05b0, 0x05b0, 0x05b0, 0x18c0,
- 0x18d0, 0x05b0, 0x05b0, 0x1020, 0x18e0, 0x0f10, 0x0580, 0x18f0,
- 0x07b0, 0x05b0, 0x1900, 0x05b0, 0x1910, 0x1920, 0x0da0, 0x1930,
- 0x08b0, 0x05b0, 0x05b0, 0x1940, 0x1950, 0x1960, 0x0c20, 0x1970,
- 0x05b0, 0x05b0, 0x1980, 0x1990, 0x19a0, 0x19b0, 0x0c20, 0x0c20,
- 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19c0, 0x19d0, 0x0760, 0x19e0,
- 0x19f0, 0x1a00, 0x1650, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a10, 0x0f10,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a70, 0x0db0, 0x1a80, 0x0dd0, 0x0dd0, 0x1a90,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x13b0, 0x1ab0, 0x1ac0, 0x1ad0, 0x1ae0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1af0, 0x1b00, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x1b10, 0x0870, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x1b20, 0x05b0, 0x05b0, 0x0a50, 0x0870, 0x0870, 0x1b30,
- 0x0580, 0x1b40, 0x0580, 0x1b50, 0x1b60, 0x1b70, 0x1b80, 0x1130,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1b90,
- 0x1ba0, 0x1bb0, 0x16b0, 0x1bc0, 0x16b0, 0x1bd0, 0x1be0, 0x1bf0,
- 0x16b0, 0x1c00, 0x16b0, 0x17b0, 0x1c10, 0x1c20, 0x1c30, 0x1c40,
+ 0x05b0, 0x05b0, 0x0840, 0x0a40, 0x0860, 0x0860, 0x0860, 0x18a0,
+ 0x18b0, 0x05b0, 0x18c0, 0x18d0, 0x05b0, 0x05b0, 0x05b0, 0x18e0,
+ 0x18f0, 0x05b0, 0x05b0, 0x1020, 0x1900, 0x0f10, 0x0580, 0x1910,
+ 0x07b0, 0x05b0, 0x1920, 0x05b0, 0x1930, 0x1940, 0x0da0, 0x1950,
+ 0x08a0, 0x05b0, 0x05b0, 0x1960, 0x1970, 0x1980, 0x0c20, 0x1990,
+ 0x05b0, 0x05b0, 0x19a0, 0x19b0, 0x19c0, 0x19d0, 0x0c20, 0x0c20,
+ 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19e0, 0x19f0, 0x0760, 0x1a00,
+ 0x1a10, 0x1a20, 0x1660, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a30, 0x0f10,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a90, 0x0db0, 0x1aa0, 0x0dd0, 0x0dd0, 0x1ab0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x13b0, 0x1ad0, 0x1ae0, 0x1af0, 0x1b00, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1600, 0x1b10, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x1b20, 0x0860, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x1b30, 0x05b0, 0x05b0, 0x0a40, 0x0860, 0x0860, 0x1b40,
+ 0x0580, 0x1b50, 0x0580, 0x1b60, 0x1b70, 0x1b80, 0x1b90, 0x1130,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1ba0,
+ 0x1bb0, 0x1bc0, 0x16c0, 0x1bd0, 0x16c0, 0x1be0, 0x1bf0, 0x1c00,
+ 0x16c0, 0x1c10, 0x16c0, 0x17e0, 0x1c20, 0x1c30, 0x1c40, 0x1c50,
/* values */
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0022, 0x0003, 0x0001, 0x0001, 0x0002, 0x0004, 0x0004,
@@ -277,8 +277,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x001d, 0x0011,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
@@ -310,7 +308,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x0004, 0x0004, 0x0011, 0x0011, 0x001c, 0x001c,
0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c,
0x001d, 0x001d, 0x001b, 0x001b, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001b, 0x001d, 0x001a, 0x001d, 0x001d, 0x0011, 0x0011,
+ 0x001d, 0x001b, 0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d,
0x001d, 0x0011, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d, 0x0011,
@@ -332,7 +330,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x001d, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0011, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x0004,
@@ -375,8 +373,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x0011,
0x0011, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0004, 0x0004, 0x001d, 0x0004, 0x0004,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0004, 0x0004,
0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x0004,
@@ -551,10 +551,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x001d, 0x001d, 0x001d, 0x001d, 0x0004, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0004,
+ 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0011,
0x0004, 0x0004, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -638,9 +638,11 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0012, 0x0013, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001e, 0x001e, 0x001e, 0x001e, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
@@ -711,7 +713,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -733,8 +735,8 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0012, 0x0013, 0x0022, 0x0022, 0x0022, 0x0022, 0x0017, 0x001d,
0x0022, 0x0022, 0x001d, 0x0022, 0x0022, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0025, 0x0025, 0x0022, 0x0022, 0x0022, 0x001d,
- 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
- 0x0022, 0x0022, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -768,10 +770,12 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
- 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011, 0x0011,
0x0011, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
@@ -871,8 +875,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0011, 0x0026, 0x0011,
0x0026, 0x0026, 0x0011, 0x0026, 0x0026, 0x0011, 0x0026, 0x0026,
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026,
- 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
diff --git a/dlls/dwrite/mirror.c b/dlls/dwrite/mirror.c
index 23dab536c4..daadfa8054 100644
--- a/dlls/dwrite/mirror.c
+++ b/dlls/dwrite/mirror.c
@@ -1,5 +1,5 @@
/* Unicode BiDi mirroring */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiMirroring.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiMirroring.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/dwrite/scripts.c b/dlls/dwrite/scripts.c
index ce139f2932..5d7846afdf 100644
--- a/dlls/dwrite/scripts.c
+++ b/dlls/dwrite/scripts.c
@@ -1,63 +1,63 @@
/* Unicode Script IDs */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/Scripts.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/Scripts.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
+const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6880] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
0x0180, 0x0190, 0x01a0, 0x01b0, 0x01c0, 0x01d0, 0x01e0, 0x01f0,
0x0200, 0x0210, 0x0220, 0x0230, 0x0240, 0x0240, 0x0250, 0x0260,
0x0270, 0x0280, 0x0290, 0x02a0, 0x02b0, 0x02c0, 0x0110, 0x02d0,
- 0x02e0, 0x02f0, 0x0300, 0x0300, 0x0310, 0x0300, 0x0300, 0x0300,
- 0x0320, 0x0300, 0x0300, 0x0330, 0x0340, 0x0350, 0x0360, 0x0370,
- 0x0380, 0x0390, 0x03a0, 0x03b0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03d0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0,
- 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03e0,
- 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x0400, 0x0410, 0x0420, 0x0430,
- 0x0440, 0x0450, 0x0460, 0x0470, 0x0210, 0x0210, 0x0210, 0x0210,
+ 0x02e0, 0x02f0, 0x0300, 0x0310, 0x0320, 0x0300, 0x0300, 0x0300,
+ 0x0330, 0x0300, 0x0300, 0x0340, 0x0350, 0x0360, 0x0370, 0x0380,
+ 0x0390, 0x03a0, 0x03b0, 0x03c0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03e0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
+ 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03f0,
+ 0x0400, 0x0400, 0x0400, 0x0400, 0x0410, 0x0420, 0x0430, 0x0440,
+ 0x0450, 0x0460, 0x0470, 0x0480, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210,
- 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0480,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490, 0x0490,
- 0x0490, 0x03c0, 0x04a0, 0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0,
+ 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0490,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0, 0x04a0,
+ 0x04a0, 0x03d0, 0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0, 0x0500,
/* level 2 offsets */
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0510, 0x0520, 0x0510, 0x0520,
- 0x0500, 0x0500, 0x0530, 0x0530, 0x0540, 0x0550, 0x0540, 0x0550,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x0540, 0x0540, 0x0540, 0x0560, 0x0500, 0x0500, 0x0570, 0x0500,
- 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0590,
- 0x05a0, 0x05b0, 0x05c0, 0x05b0, 0x05b0, 0x05b0, 0x05d0, 0x05b0,
- 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05f0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05e0, 0x05e0, 0x05e0, 0x0600, 0x0610, 0x0620, 0x0600, 0x0610,
- 0x0630, 0x0640, 0x0650, 0x0650, 0x0660, 0x0650, 0x0670, 0x0680,
- 0x0690, 0x06a0, 0x06b0, 0x06b0, 0x06c0, 0x06d0, 0x06b0, 0x06e0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06f0, 0x06b0, 0x06b0,
- 0x0700, 0x0710, 0x0710, 0x0710, 0x0720, 0x06b0, 0x06b0, 0x06b0,
- 0x0730, 0x0730, 0x0730, 0x0740, 0x0750, 0x0750, 0x0750, 0x0760,
- 0x0770, 0x0770, 0x0780, 0x0790, 0x07a0, 0x07b0, 0x07c0, 0x07d0,
- 0x07d0, 0x07d0, 0x06b0, 0x07e0, 0x07d0, 0x07f0, 0x0800, 0x06b0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0520, 0x0530, 0x0520, 0x0530,
+ 0x0510, 0x0510, 0x0540, 0x0540, 0x0550, 0x0560, 0x0550, 0x0560,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x0550, 0x0550, 0x0550, 0x0570, 0x0510, 0x0510, 0x0580, 0x0510,
+ 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x05a0,
+ 0x05b0, 0x05c0, 0x05d0, 0x05c0, 0x05c0, 0x05c0, 0x05e0, 0x05c0,
+ 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x0600, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x05f0, 0x05f0, 0x05f0, 0x0610, 0x0620, 0x0630, 0x0610, 0x0620,
+ 0x0640, 0x0650, 0x0660, 0x0660, 0x0670, 0x0660, 0x0680, 0x0690,
+ 0x06a0, 0x06b0, 0x06c0, 0x06c0, 0x06d0, 0x06e0, 0x06c0, 0x06f0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x0700, 0x06c0, 0x06c0,
+ 0x0710, 0x0720, 0x0720, 0x0720, 0x0730, 0x06c0, 0x06c0, 0x06c0,
+ 0x0740, 0x0740, 0x0740, 0x0750, 0x0760, 0x0760, 0x0760, 0x0770,
+ 0x0780, 0x0780, 0x0790, 0x07a0, 0x07b0, 0x07c0, 0x07d0, 0x07d0,
+ 0x07d0, 0x07d0, 0x06c0, 0x07e0, 0x07d0, 0x07f0, 0x0800, 0x06c0,
0x0810, 0x0810, 0x0810, 0x0810, 0x0810, 0x0820, 0x0830, 0x0810,
0x0840, 0x0850, 0x0860, 0x0870, 0x0880, 0x0890, 0x08a0, 0x08b0,
0x08c0, 0x08d0, 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930,
@@ -66,108 +66,110 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0a40, 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0,
0x0ac0, 0x0ad0, 0x0ae0, 0x0af0, 0x0b00, 0x0b10, 0x0b20, 0x0b30,
0x0b40, 0x0b50, 0x0b60, 0x0b70, 0x0b80, 0x0b90, 0x0ba0, 0x0bb0,
- 0x0bc0, 0x0bd0, 0x0be0, 0x0be0, 0x0bf0, 0x0c00, 0x0c10, 0x0be0,
- 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0c60, 0x0c70, 0x0c80, 0x0c90,
- 0x0ca0, 0x0cb0, 0x0cb0, 0x0cc0, 0x0cb0, 0x0cd0, 0x07d0, 0x07d0,
- 0x0ce0, 0x0cf0, 0x0d00, 0x0d10, 0x0d20, 0x0d30, 0x07d0, 0x07d0,
- 0x0d40, 0x0d40, 0x0d40, 0x0d40, 0x0d50, 0x0d40, 0x0d60, 0x0d70,
- 0x0d40, 0x0d50, 0x0d40, 0x0d80, 0x0d80, 0x0d90, 0x07d0, 0x07d0,
- 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0,
- 0x0da0, 0x0da0, 0x0db0, 0x0db0, 0x0dc0, 0x0db0, 0x0db0, 0x0dd0,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0e00, 0x0e10, 0x0df0, 0x0df0,
- 0x0e00, 0x0df0, 0x0df0, 0x0e20, 0x0e30, 0x0e40, 0x0df0, 0x0df0,
- 0x0df0, 0x0e30, 0x0df0, 0x0df0, 0x0df0, 0x0e50, 0x0df0, 0x0e60,
- 0x0df0, 0x0e70, 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x0e90,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0,
- 0x0eb0, 0x0ec0, 0x0ed0, 0x0ed0, 0x0ed0, 0x0ed0, 0x0ee0, 0x0ef0,
- 0x0f00, 0x0f10, 0x0f20, 0x0f30, 0x0f40, 0x0f50, 0x0f60, 0x0f70,
- 0x0f80, 0x0f80, 0x0f80, 0x0f80, 0x0f80, 0x0f90, 0x0fa0, 0x0fa0,
- 0x0fb0, 0x0fc0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fd0, 0x0fe0,
- 0x0fd0, 0x0fd0, 0x0ff0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x1000,
- 0x1010, 0x1020, 0x1030, 0x1030, 0x1040, 0x1050, 0x1060, 0x1070,
- 0x1080, 0x1080, 0x1090, 0x1080, 0x10a0, 0x10b0, 0x0f80, 0x0f80,
- 0x10c0, 0x10d0, 0x10e0, 0x10e0, 0x10e0, 0x10f0, 0x10e0, 0x1100,
- 0x1110, 0x1110, 0x1120, 0x1130, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
- 0x1140, 0x1140, 0x1140, 0x1140, 0x1150, 0x1140, 0x1140, 0x1160,
- 0x1170, 0x1170, 0x1170, 0x1170, 0x1180, 0x1180, 0x1180, 0x1190,
- 0x11a0, 0x11a0, 0x11a0, 0x11b0, 0x11c0, 0x11d0, 0x11d0, 0x11d0,
- 0x11e0, 0x07d0, 0x07d0, 0x07d0, 0x11f0, 0x1200, 0x1210, 0x1220,
- 0x0540, 0x0540, 0x1230, 0x0540, 0x0540, 0x1240, 0x1250, 0x1260,
- 0x0540, 0x0540, 0x0540, 0x1270, 0x0580, 0x0580, 0x0580, 0x1280,
- 0x05b0, 0x1290, 0x05b0, 0x05b0, 0x1290, 0x12a0, 0x05b0, 0x12b0,
- 0x05b0, 0x05b0, 0x05b0, 0x12c0, 0x12c0, 0x12d0, 0x05b0, 0x12e0,
- 0x12f0, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x1300, 0x1310,
- 0x1320, 0x1330, 0x0500, 0x0500, 0x07d0, 0x0580, 0x0580, 0x1340,
- 0x0500, 0x0500, 0x1350, 0x1360, 0x1370, 0x0500, 0x0540, 0x0540,
- 0x1380, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x1390, 0x07d0, 0x13a0, 0x07d0, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0,
- 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0, 0x13b0,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x13c0,
- 0x0500, 0x13d0, 0x0500, 0x13e0, 0x13f0, 0x1400, 0x1410, 0x07d0,
- 0x1420, 0x1420, 0x1430, 0x1420, 0x1420, 0x1430, 0x0540, 0x0540,
- 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1440, 0x1450,
- 0x0db0, 0x0db0, 0x0dc0, 0x1460, 0x1460, 0x1460, 0x1470, 0x1480,
- 0x0df0, 0x1490, 0x14a0, 0x14a0, 0x14a0, 0x14a0, 0x05e0, 0x05e0,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x14b0, 0x07d0, 0x07d0, 0x07d0,
- 0x14c0, 0x14d0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14e0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14f0, 0x07d0, 0x1500,
- 0x1510, 0x0500, 0x1520, 0x1530, 0x1540, 0x1550, 0x1550, 0x1550,
- 0x1550, 0x1560, 0x1570, 0x1580, 0x1580, 0x1580, 0x1580, 0x1590,
- 0x15a0, 0x15b0, 0x15c0, 0x15d0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x15e0, 0x0500, 0x15b0, 0x15f0, 0x0500, 0x0500, 0x1600, 0x1580,
- 0x0de0, 0x15e0, 0x0500, 0x0500, 0x0500, 0x0500, 0x0de0, 0x1610,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x1580, 0x1580, 0x1620,
- 0x1580, 0x1580, 0x1580, 0x1580, 0x1580, 0x1630, 0x0500, 0x0500,
- 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14f0, 0x0500, 0x0500, 0x0500, 0x0500,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1640, 0x07d0,
+ 0x0bc0, 0x0bd0, 0x0be0, 0x0bf0, 0x0c00, 0x0c10, 0x0c20, 0x0be0,
+ 0x0c30, 0x0c40, 0x0c50, 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0,
+ 0x0cb0, 0x0cc0, 0x0cc0, 0x0cd0, 0x0cc0, 0x0ce0, 0x07d0, 0x07d0,
+ 0x0cf0, 0x0d00, 0x0d10, 0x0d20, 0x0d30, 0x0d40, 0x07d0, 0x07d0,
+ 0x0d50, 0x0d50, 0x0d50, 0x0d50, 0x0d60, 0x0d50, 0x0d70, 0x0d80,
+ 0x0d50, 0x0d60, 0x0d50, 0x0d90, 0x0d90, 0x0da0, 0x07d0, 0x07d0,
+ 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0, 0x0db0,
+ 0x0db0, 0x0db0, 0x0dc0, 0x0dc0, 0x0dd0, 0x0dc0, 0x0dc0, 0x0de0,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0e00, 0x0e00, 0x0e00, 0x0e00, 0x0e10, 0x0e20, 0x0e00, 0x0e00,
+ 0x0e10, 0x0e00, 0x0e00, 0x0e30, 0x0e40, 0x0e50, 0x0e00, 0x0e00,
+ 0x0e00, 0x0e40, 0x0e00, 0x0e00, 0x0e00, 0x0e60, 0x0e00, 0x0e70,
+ 0x0e00, 0x0e80, 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0ea0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0,
+ 0x0ec0, 0x0ed0, 0x0ee0, 0x0ee0, 0x0ee0, 0x0ee0, 0x0ef0, 0x0f00,
+ 0x0f10, 0x0f20, 0x0f30, 0x0f40, 0x0f50, 0x0f60, 0x0f70, 0x0f80,
+ 0x0f90, 0x0f90, 0x0f90, 0x0f90, 0x0f90, 0x0fa0, 0x0fb0, 0x0fb0,
+ 0x0fc0, 0x0fd0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0fe0, 0x0ff0,
+ 0x0fe0, 0x0fe0, 0x1000, 0x0eb0, 0x0eb0, 0x0eb0, 0x0eb0, 0x1010,
+ 0x1020, 0x1030, 0x1040, 0x1040, 0x1050, 0x1060, 0x1070, 0x1080,
+ 0x1090, 0x1090, 0x10a0, 0x1090, 0x10b0, 0x10c0, 0x0f90, 0x0f90,
+ 0x10d0, 0x10e0, 0x10f0, 0x10f0, 0x10f0, 0x1100, 0x10f0, 0x1110,
+ 0x1120, 0x1120, 0x1130, 0x1140, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
+ 0x1150, 0x1150, 0x1150, 0x1150, 0x1160, 0x1150, 0x1150, 0x1170,
+ 0x1180, 0x1180, 0x1180, 0x1180, 0x1190, 0x1190, 0x1190, 0x11a0,
+ 0x11b0, 0x11b0, 0x11b0, 0x11c0, 0x11d0, 0x11e0, 0x11e0, 0x11e0,
+ 0x11f0, 0x07d0, 0x07d0, 0x07d0, 0x1200, 0x1210, 0x1220, 0x1230,
+ 0x0550, 0x0550, 0x1240, 0x0550, 0x0550, 0x1250, 0x1260, 0x1270,
+ 0x0550, 0x0550, 0x0550, 0x1280, 0x0590, 0x0590, 0x0590, 0x1290,
+ 0x05c0, 0x12a0, 0x05c0, 0x05c0, 0x12a0, 0x12b0, 0x05c0, 0x12c0,
+ 0x05c0, 0x05c0, 0x05c0, 0x12d0, 0x12d0, 0x12e0, 0x05c0, 0x12f0,
+ 0x1300, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1310, 0x1320,
+ 0x1330, 0x1340, 0x0510, 0x1330, 0x07d0, 0x0590, 0x0590, 0x1350,
+ 0x0510, 0x0510, 0x1360, 0x1370, 0x1380, 0x0510, 0x0550, 0x0550,
+ 0x1390, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1330,
+ 0x0510, 0x0510, 0x13a0, 0x07d0, 0x13b0, 0x07d0, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0,
+ 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x13d0,
+ 0x0510, 0x13e0, 0x0510, 0x13f0, 0x1400, 0x1410, 0x1420, 0x07d0,
+ 0x1430, 0x1430, 0x1440, 0x1430, 0x1430, 0x1440, 0x0550, 0x0550,
+ 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1460,
+ 0x0dc0, 0x0dc0, 0x0dd0, 0x1470, 0x1470, 0x1470, 0x1480, 0x1490,
+ 0x0e00, 0x14a0, 0x14b0, 0x14b0, 0x14b0, 0x14b0, 0x05f0, 0x05f0,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x14c0, 0x07d0, 0x07d0, 0x07d0,
+ 0x14d0, 0x14e0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14f0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x07d0, 0x1510,
+ 0x1520, 0x0510, 0x1530, 0x1540, 0x1550, 0x1560, 0x1560, 0x1560,
+ 0x1560, 0x1570, 0x1580, 0x1590, 0x1590, 0x1590, 0x1590, 0x15a0,
+ 0x15b0, 0x15c0, 0x15d0, 0x15e0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x15f0, 0x0510, 0x15c0, 0x1600, 0x0510, 0x0510, 0x1610, 0x1590,
+ 0x0df0, 0x15f0, 0x0510, 0x0510, 0x0510, 0x0510, 0x0df0, 0x1620,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x1590, 0x1590, 0x1630,
+ 0x1590, 0x1590, 0x1590, 0x1590, 0x1590, 0x1640, 0x0510, 0x0510,
+ 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x0510, 0x0510, 0x0510, 0x0510,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1500, 0x07d0, 0x07d0,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650, 0x1650,
0x1660, 0x1650, 0x1650, 0x1650, 0x1670, 0x1680, 0x1680, 0x1680,
0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690,
0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690, 0x1690,
- 0x1690, 0x1690, 0x16a0, 0x07d0, 0x05e0, 0x05e0, 0x05e0, 0x05e0,
- 0x05e0, 0x05e0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16c0,
- 0x0500, 0x0500, 0x16d0, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
- 0x16e0, 0x0540, 0x16f0, 0x1700, 0x07d0, 0x07d0, 0x07d0, 0x1710,
- 0x1720, 0x1720, 0x1730, 0x14b0, 0x1740, 0x1740, 0x1740, 0x1750,
- 0x1760, 0x1760, 0x1760, 0x1760, 0x1770, 0x1780, 0x0810, 0x1790,
- 0x17a0, 0x17a0, 0x17b0, 0x17c0, 0x17c0, 0x17d0, 0x0de0, 0x17e0,
- 0x17f0, 0x17f0, 0x17f0, 0x17f0, 0x1800, 0x1810, 0x0da0, 0x1820,
- 0x1830, 0x1830, 0x1830, 0x1840, 0x1850, 0x1860, 0x0da0, 0x0da0,
- 0x1870, 0x1870, 0x1870, 0x1870, 0x1880, 0x1890, 0x18a0, 0x18b0,
- 0x18c0, 0x18d0, 0x14a0, 0x0540, 0x0540, 0x18e0, 0x18f0, 0x0e80,
- 0x0e80, 0x0e80, 0x0e80, 0x0e80, 0x18a0, 0x18a0, 0x1900, 0x1910,
- 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0, 0x0de0,
- 0x0de0, 0x0de0, 0x1920, 0x0de0, 0x1930, 0x0de0, 0x0de0, 0x1940,
+ 0x1690, 0x1690, 0x16a0, 0x07d0, 0x05f0, 0x05f0, 0x05f0, 0x05f0,
+ 0x05f0, 0x05f0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16c0,
+ 0x0510, 0x0510, 0x16d0, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550,
+ 0x16e0, 0x0550, 0x16f0, 0x1700, 0x07d0, 0x07d0, 0x07d0, 0x1710,
+ 0x1720, 0x1720, 0x1730, 0x1740, 0x1750, 0x1750, 0x1750, 0x1760,
+ 0x1770, 0x1770, 0x1770, 0x1770, 0x1780, 0x1790, 0x0810, 0x17a0,
+ 0x17b0, 0x17b0, 0x17c0, 0x17d0, 0x17d0, 0x17e0, 0x0df0, 0x17f0,
+ 0x1800, 0x1800, 0x1800, 0x1800, 0x1810, 0x1820, 0x0db0, 0x1830,
+ 0x1840, 0x1840, 0x1840, 0x1850, 0x1860, 0x1870, 0x0db0, 0x0db0,
+ 0x1880, 0x1880, 0x1880, 0x1880, 0x1890, 0x18a0, 0x18b0, 0x18c0,
+ 0x18d0, 0x18e0, 0x14b0, 0x0550, 0x0550, 0x18f0, 0x1900, 0x0e90,
+ 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x18b0, 0x18b0, 0x1910, 0x1920,
+ 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0df0,
+ 0x0df0, 0x0df0, 0x1930, 0x0df0, 0x1940, 0x0df0, 0x0df0, 0x1950,
0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0, 0x07d0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1950, 0x14c0,
- 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x1960, 0x07d0, 0x07d0,
- 0x1970, 0x1980, 0x0650, 0x1990, 0x19a0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x19b0, 0x19c0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x06b0, 0x06b0, 0x19d0, 0x07d0, 0x06b0, 0x06b0, 0x06b0,
- 0x06b0, 0x19e0, 0x06b0, 0x06b0, 0x19f0, 0x07d0, 0x07d0, 0x1a00,
- 0x0580, 0x14b0, 0x1a10, 0x0500, 0x0500, 0x1a20, 0x1a30, 0x1a40,
- 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x1a50,
- 0x1a60, 0x0500, 0x0510, 0x0520, 0x0510, 0x0520, 0x1a70, 0x1570,
- 0x1580, 0x1a80, 0x0de0, 0x15e0, 0x1a90, 0x1aa0, 0x1ab0, 0x1ac0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1960, 0x14d0,
+ 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x14d0, 0x1970, 0x07d0, 0x07d0,
+ 0x1980, 0x1990, 0x0660, 0x19a0, 0x19b0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x19c0, 0x19d0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x06c0, 0x06c0, 0x19e0, 0x07d0, 0x06c0, 0x06c0, 0x06c0,
+ 0x06c0, 0x19f0, 0x06c0, 0x06c0, 0x1a00, 0x07d0, 0x07d0, 0x1a10,
+ 0x0590, 0x1740, 0x1a20, 0x0510, 0x0510, 0x1a30, 0x1a40, 0x1a50,
+ 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x1a60,
+ 0x1a70, 0x0510, 0x0520, 0x0530, 0x0520, 0x0530, 0x1a80, 0x1580,
+ 0x1590, 0x1a90, 0x0df0, 0x15f0, 0x1aa0, 0x1ab0, 0x1ac0, 0x1ad0,
/* values */
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -222,7 +224,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
- 0x0003, 0x0003, 0x0003, 0x0001, 0x0003, 0x0000, 0x0003, 0x0001,
+ 0x0003, 0x0003, 0x0003, 0x0001, 0x0001, 0x0000, 0x0003, 0x0001,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0001, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
@@ -257,8 +259,6 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039,
0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039,
0x0039, 0x0039, 0x0039, 0x0039, 0x0000, 0x0000, 0x0039, 0x0000,
- 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051,
- 0x0051, 0x0051, 0x0051, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003,
@@ -288,7 +288,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
- 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000,
+ 0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020,
0x0020, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
@@ -320,7 +320,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x001f, 0x001f, 0x001f, 0x001f, 0x0000, 0x0000, 0x001f, 0x001f,
0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f,
0x001f, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f,
+ 0x0000, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0045, 0x0045, 0x0045, 0x0000, 0x0045, 0x0045, 0x0045,
0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0000, 0x0000, 0x0045,
0x0045, 0x0000, 0x0000, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045,
@@ -385,12 +385,14 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b,
0x0000, 0x002b, 0x002b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038, 0x0038,
+ 0x0000, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038,
0x0038, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
+ 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
+ 0x0038, 0x0038, 0x0038, 0x0000, 0x0000, 0x0038, 0x0038, 0x0038,
0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0000, 0x0038, 0x0038,
0x0038, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038,
0x0000, 0x0000, 0x0000, 0x0000, 0x0038, 0x0038, 0x0038, 0x0038,
@@ -589,7 +591,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0000,
0x0002, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0016, 0x0031, 0x0031, 0x0031, 0x0031,
@@ -601,8 +603,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0016, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031,
0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x001e,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0000, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0000, 0x0000,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0000, 0x0000,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -649,7 +651,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 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, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -671,8 +673,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0000,
0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0000,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
@@ -706,7 +708,7 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
- 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0000,
+ 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0000, 0x0000,
0x0000, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
@@ -721,8 +723,6 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0000,
0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021,
- 0x0021, 0x0021, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f,
@@ -753,6 +753,8 @@ const unsigned short DECLSPEC_HIDDEN wine_scripts_table[6864] =
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050,
0x0050, 0x0050, 0x0050, 0x0050, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047,
diff --git a/dlls/dwrite/scripts.h b/dlls/dwrite/scripts.h
index 7202f402e6..bf38988b0a 100644
--- a/dlls/dwrite/scripts.h
+++ b/dlls/dwrite/scripts.h
@@ -1,5 +1,5 @@
/* Unicode Script IDs */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/Scripts.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/Scripts.txt */
/* DO NOT EDIT!! */
enum unicode_script_id {
@@ -141,5 +141,9 @@ enum unicode_script_id {
Script_Osage = 135,
Script_SignWriting = 136,
Script_Tangut = 137,
- Script_LastId = 137
+ Script_Masaram_Gondi = 138,
+ Script_Nushu = 139,
+ Script_Soyombo = 140,
+ Script_Zanabazar_Square = 141,
+ Script_LastId = 141
};
diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c
index 77369a7ef9..77ec020cd6 100644
--- a/dlls/dwrite/tests/analyzer.c
+++ b/dlls/dwrite/tests/analyzer.c
@@ -1192,6 +1192,18 @@ static void test_GetScriptProperties(void)
hr = IDWriteTextAnalyzer1_GetScriptProperties(analyzer1, sa, &props);
ok(hr == S_OK, "got 0x%08x\n", hr);
+ for (sa.script = 0;; sa.script++) {
+ hr = IDWriteTextAnalyzer1_GetScriptProperties(analyzer1, sa, &props);
+ if (FAILED(hr))
+ break;
+
+ ok(0, "%u: { /* %.4s */ { 0x%04x, %d, %d, 0x%04x, %d, %d, %d, %d, %d, %d, %d } },\n",
+ sa.script, (char*)&props.isoScriptCode, props.isoScriptCode, props.isoScriptNumber,
+ props.clusterLookahead, props.justificationCharacter, props.restrictCaretToClusters,
+ props.usesWordDividers, props.isDiscreteWriting, props.isBlockWriting, props.isDistributedWithinCluster,
+ props.isConnectedWriting, props.isCursiveWriting);
+ }
+
IDWriteTextAnalyzer1_Release(analyzer1);
}
diff --git a/dlls/gdi32/vertical.c b/dlls/gdi32/vertical.c
index 05737604b8..ca4467911c 100644
--- a/dlls/gdi32/vertical.c
+++ b/dlls/gdi32/vertical.c
@@ -1,5 +1,5 @@
/* Unicode Vertical Orientation */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/VerticalOrientation.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/VerticalOrientation.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/bracket.c b/dlls/usp10/bracket.c
index 1509d572c9..16df6381a6 100644
--- a/dlls/usp10/bracket.c
+++ b/dlls/usp10/bracket.c
@@ -1,5 +1,5 @@
/* Unicode Bidirectional Bracket table */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiBrackets.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiBrackets.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/indicsyllable.c b/dlls/usp10/indicsyllable.c
index dbdac5d4ae..709b1d4ae8 100644
--- a/dlls/usp10/indicsyllable.c
+++ b/dlls/usp10/indicsyllable.c
@@ -1,11 +1,11 @@
/* Unicode Indic Syllabic Category */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/IndicSyllabicCategory.txt */
-/* and from http://www.unicode.org/Public/10.0.0/ucd/IndicPositionalCategory.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/IndicSyllabicCategory.txt */
+/* and from http://www.unicode.org/Public/11.0.0/ucd/IndicPositionalCategory.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
+const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3296] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110,
@@ -53,41 +53,41 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x04b0, 0x04c0, 0x04d0, 0x04e0, 0x04f0, 0x0500, 0x0400, 0x0270,
0x0510, 0x0520, 0x0370, 0x0530, 0x0540, 0x0550, 0x0330, 0x0270,
0x0560, 0x0520, 0x0370, 0x0570, 0x0580, 0x0590, 0x0330, 0x05a0,
- 0x05b0, 0x0520, 0x02f0, 0x05c0, 0x05d0, 0x05e0, 0x0330, 0x05f0,
- 0x0600, 0x0610, 0x02f0, 0x0620, 0x0630, 0x0640, 0x0400, 0x0650,
- 0x0660, 0x02f0, 0x0670, 0x0680, 0x0690, 0x0290, 0x0270, 0x0270,
- 0x06a0, 0x06b0, 0x06c0, 0x06d0, 0x06e0, 0x06f0, 0x0270, 0x0270,
- 0x0270, 0x0700, 0x0710, 0x0720, 0x0730, 0x02f0, 0x0740, 0x0750,
- 0x0760, 0x0770, 0x0780, 0x0790, 0x07a0, 0x0270, 0x0270, 0x0270,
- 0x02f0, 0x02f0, 0x07b0, 0x07c0, 0x07d0, 0x07e0, 0x07f0, 0x0800,
- 0x0810, 0x0820, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0830, 0x0840, 0x0850, 0x0840, 0x0850, 0x0860, 0x0830, 0x0870,
- 0x02f0, 0x02f0, 0x0880, 0x0890, 0x08a0, 0x08b0, 0x0290, 0x0270,
- 0x08c0, 0x0670, 0x08d0, 0x08e0, 0x0400, 0x02f0, 0x08f0, 0x0900,
- 0x02f0, 0x02f0, 0x0910, 0x0920, 0x0930, 0x0290, 0x0270, 0x0270,
- 0x02f0, 0x0940, 0x02f0, 0x02f0, 0x0950, 0x0960, 0x0970, 0x0980,
+ 0x0560, 0x0520, 0x02f0, 0x05b0, 0x05c0, 0x05d0, 0x0330, 0x05e0,
+ 0x05f0, 0x0600, 0x02f0, 0x0610, 0x0620, 0x0630, 0x0400, 0x0640,
+ 0x0650, 0x02f0, 0x0660, 0x0670, 0x0680, 0x0290, 0x0270, 0x0270,
+ 0x0690, 0x06a0, 0x06b0, 0x06c0, 0x06d0, 0x06e0, 0x0270, 0x0270,
+ 0x0270, 0x06f0, 0x0700, 0x0710, 0x0720, 0x02f0, 0x0730, 0x0740,
+ 0x0750, 0x0760, 0x0770, 0x0780, 0x0790, 0x0270, 0x0270, 0x0270,
+ 0x02f0, 0x02f0, 0x07a0, 0x07b0, 0x07c0, 0x07d0, 0x07e0, 0x07f0,
+ 0x0800, 0x0810, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
+ 0x0820, 0x0830, 0x0840, 0x0830, 0x0840, 0x0850, 0x0820, 0x0860,
+ 0x02f0, 0x02f0, 0x0870, 0x0880, 0x0890, 0x08a0, 0x0290, 0x0270,
+ 0x08b0, 0x0660, 0x08c0, 0x08d0, 0x0400, 0x02f0, 0x08e0, 0x08f0,
+ 0x02f0, 0x02f0, 0x0900, 0x0910, 0x0920, 0x0290, 0x0270, 0x0270,
+ 0x02f0, 0x0930, 0x02f0, 0x02f0, 0x0940, 0x0950, 0x0960, 0x0970,
0x0290, 0x0290, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0990, 0x0850, 0x02f0, 0x09a0, 0x09b0, 0x0290, 0x09c0, 0x09d0,
- 0x09e0, 0x02f0, 0x09f0, 0x0a00, 0x02f0, 0x02f0, 0x0a10, 0x0a20,
- 0x02f0, 0x02f0, 0x0a30, 0x0a40, 0x0a50, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a60, 0x0a70, 0x0a80,
+ 0x0980, 0x0840, 0x02f0, 0x0990, 0x09a0, 0x0290, 0x09b0, 0x09c0,
+ 0x09d0, 0x02f0, 0x09e0, 0x09f0, 0x02f0, 0x02f0, 0x0a00, 0x0a10,
+ 0x02f0, 0x02f0, 0x0a20, 0x0a30, 0x0a40, 0x0270, 0x0270, 0x0270,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a50, 0x0a60, 0x0a70,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a90,
- 0x0aa0, 0x0ab0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0ac0,
- 0x0ad0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0a80,
+ 0x0a90, 0x0aa0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0ab0,
+ 0x0ac0, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0ae0, 0x0270, 0x0270, 0x0270,
- 0x0af0, 0x02f0, 0x0b00, 0x0270, 0x02f0, 0x0b10, 0x0b20, 0x0b30,
- 0x0b40, 0x0b50, 0x02f0, 0x0b60, 0x0b70, 0x0290, 0x0b80, 0x0b90,
- 0x0ba0, 0x02f0, 0x0bb0, 0x02f0, 0x0bc0, 0x0bd0, 0x0270, 0x0270,
- 0x0be0, 0x02f0, 0x02f0, 0x0bf0, 0x0c00, 0x0290, 0x0c10, 0x0c20,
- 0x0c30, 0x02f0, 0x0c40, 0x0c50, 0x0c60, 0x0290, 0x02f0, 0x0c70,
- 0x02f0, 0x02f0, 0x02f0, 0x0c80, 0x0c90, 0x0270, 0x0ca0, 0x0cb0,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0ad0, 0x0270, 0x0270, 0x0270,
+ 0x0ae0, 0x02f0, 0x0af0, 0x0270, 0x02f0, 0x0b00, 0x0b10, 0x0b20,
+ 0x0b30, 0x0b40, 0x02f0, 0x0b50, 0x0b60, 0x0290, 0x0b70, 0x0b80,
+ 0x0b90, 0x02f0, 0x0ba0, 0x02f0, 0x0bb0, 0x0bc0, 0x0270, 0x0270,
+ 0x0bd0, 0x02f0, 0x02f0, 0x0be0, 0x0bf0, 0x0290, 0x0c00, 0x0c10,
+ 0x0c20, 0x02f0, 0x0c30, 0x0c40, 0x0c50, 0x0290, 0x02f0, 0x0c60,
+ 0x02f0, 0x02f0, 0x02f0, 0x0c70, 0x0c80, 0x0270, 0x0c90, 0x0ca0,
0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270,
- 0x0270, 0x0270, 0x0270, 0x0270, 0x0cc0, 0x0cd0, 0x0ce0, 0x0290,
+ 0x0270, 0x0270, 0x0270, 0x0270, 0x0cb0, 0x0cc0, 0x0cd0, 0x0290,
/* values */
0x5f00, 0x9c00, 0x9500, 0x9500, 0x8600, 0x8600, 0x8600, 0x8600,
- 0x7e00, 0x6e00, 0x6c00, 0x6000, 0x5100, 0x3c00, 0x2600, 0x1900,
+ 0x7e00, 0x6e00, 0x5d00, 0x5100, 0x4200, 0x2d00, 0x1700, 0x0a00,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -129,7 +129,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0107,
0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a,
0x000a, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0501, 0x0501, 0x0102, 0x0000, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006,
0x000a, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a, 0x000a, 0x0000,
@@ -151,7 +151,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0107, 0x0607, 0x0607, 0x0607, 0x0607, 0x0507, 0x0000, 0x0507,
0x0507, 0x0007, 0x0000, 0x0107, 0x0107, 0x0605, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x000a, 0x0519, 0x0519, 0x0519, 0x0504, 0x0504, 0x0504,
+ 0x0000, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x0000, 0x000a, 0x000a, 0x0000, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x0000, 0x0000, 0x0604, 0x0003, 0x0107, 0x0507,
0x0107, 0x0607, 0x0607, 0x0607, 0x0607, 0x0000, 0x0000, 0x0207,
@@ -192,10 +192,8 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0000,
0x0000, 0x001f, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0501, 0x0501, 0x0101, 0x0102, 0x0000, 0x0006, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0000, 0x0006, 0x0006,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
- 0x000a, 0x000a, 0x000a, 0x0516, 0x0516, 0x0003, 0x0107, 0x0107,
+ 0x000a, 0x000a, 0x000a, 0x0000, 0x0000, 0x0003, 0x0107, 0x0107,
0x0107, 0x0107, 0x0107, 0x0607, 0x0607, 0x0000, 0x0207, 0x0207,
0x0207, 0x0000, 0x0407, 0x0407, 0x0407, 0x0505, 0x0015, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, 0x0107,
@@ -310,12 +308,12 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0607, 0x0207, 0x0107, 0x0507, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0006, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x000a, 0x000a, 0x020e, 0x060e, 0x010d,
- 0x050f, 0x050f, 0x050c, 0x060d, 0x060d, 0x060d, 0x060d, 0x0000,
+ 0x0006, 0x0006, 0x0006, 0x000a, 0x000a, 0x020e, 0x060e, 0x010f,
+ 0x050f, 0x050f, 0x050f, 0x060f, 0x060f, 0x060f, 0x060f, 0x0000,
0x0017, 0x0107, 0x0507, 0x0107, 0x0107, 0x0507, 0x0507, 0x0507,
0x0507, 0x0607, 0x0607, 0x0507, 0x0607, 0x0107, 0x0207, 0x0207,
- 0x0207, 0x0207, 0x0207, 0x0507, 0x0501, 0x0513, 0x0513, 0x0513,
- 0x0513, 0x0513, 0x0516, 0x0521, 0x0521, 0x0000, 0x0000, 0x0621,
+ 0x0207, 0x0207, 0x0207, 0x0507, 0x0507, 0x0513, 0x0513, 0x0513,
+ 0x0513, 0x0513, 0x0521, 0x0521, 0x0521, 0x0000, 0x0000, 0x0621,
0x0501, 0x0501, 0x0501, 0x050c, 0x0102, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x000a, 0x000a, 0x000a, 0x000a, 0x0504, 0x0107, 0x0507, 0x0507,
@@ -346,7 +344,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0619, 0x0619, 0x0519, 0x0519, 0x0619, 0x0619, 0x0619, 0x0619,
0x0519, 0x0119, 0x0d00, 0x0d00, 0x0d00, 0x0d00, 0x0d00, 0x0d00,
0x0d00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0002, 0x0002, 0x0519, 0x0000, 0x0000, 0x0119,
+ 0x0000, 0x0000, 0x0002, 0x0002, 0x0519, 0x0000, 0x0000, 0x0000,
0x0019, 0x0019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0521, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -380,7 +378,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519,
0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519, 0x0519,
- 0x0519, 0x0519, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0519, 0x0519, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
@@ -393,7 +391,7 @@ const unsigned short DECLSPEC_HIDDEN indic_syllabic_table[3312] =
0x0501, 0x0501, 0x050c, 0x0102, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x000a, 0x000a, 0x000a, 0x0006, 0x0006, 0x0006, 0x000a,
0x000a, 0x000a, 0x000a, 0x0504, 0x0107, 0x0107, 0x0507, 0x0507,
- 0x0607, 0x0607, 0x0207, 0x0207, 0x0507, 0x010d, 0x010e, 0x000e,
+ 0x0607, 0x0607, 0x0207, 0x0207, 0x0507, 0x010d, 0x010e, 0x010e,
0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0507, 0x0000, 0x000a,
diff --git a/dlls/usp10/linebreak.c b/dlls/usp10/linebreak.c
index 56bde66e9e..cd2ca64952 100644
--- a/dlls/usp10/linebreak.c
+++ b/dlls/usp10/linebreak.c
@@ -1,10 +1,10 @@
/* Unicode Line Break Properties */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/LineBreak.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/LineBreak.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
+const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7264] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
@@ -56,22 +56,22 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0790, 0x07a0, 0x07b0,
0x07c0, 0x07d0, 0x05b0, 0x0580, 0x07e0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x07f0, 0x0800, 0x07b0, 0x05b0, 0x0760, 0x0810,
- 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0870,
- 0x0870, 0x0870, 0x05b0, 0x0880, 0x0870, 0x0890, 0x08a0, 0x0580,
- 0x08b0, 0x05b0, 0x05b0, 0x08c0, 0x0580, 0x08d0, 0x08e0, 0x05b0,
- 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950, 0x0960,
- 0x0970, 0x0900, 0x0910, 0x0980, 0x0990, 0x09a0, 0x09b0, 0x09c0,
- 0x09d0, 0x0690, 0x0910, 0x09e0, 0x09f0, 0x0a00, 0x0950, 0x0a10,
- 0x0a20, 0x0900, 0x0910, 0x09e0, 0x0a30, 0x0a40, 0x0950, 0x0a50,
- 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x0ab0, 0x09b0, 0x0ac0,
- 0x0ad0, 0x0ae0, 0x0910, 0x0af0, 0x0b00, 0x0b10, 0x0950, 0x0b20,
- 0x0b30, 0x0ae0, 0x0910, 0x0b40, 0x0b00, 0x0b50, 0x0950, 0x0b60,
- 0x0ad0, 0x0ae0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0950, 0x0ba0,
- 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09b0, 0x0c00,
- 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0870, 0x0870,
- 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0870, 0x0870,
+ 0x05b0, 0x0820, 0x0830, 0x0840, 0x05b0, 0x0850, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x05b0, 0x0870, 0x0860, 0x0880, 0x0890, 0x0580,
+ 0x08a0, 0x05b0, 0x05b0, 0x08b0, 0x0580, 0x08c0, 0x08d0, 0x05b0,
+ 0x08e0, 0x08f0, 0x0900, 0x0910, 0x0920, 0x0930, 0x0940, 0x0950,
+ 0x0960, 0x08f0, 0x0900, 0x0970, 0x0980, 0x0990, 0x09a0, 0x09b0,
+ 0x09c0, 0x0690, 0x0900, 0x09d0, 0x09e0, 0x09f0, 0x0940, 0x0a00,
+ 0x0a10, 0x08f0, 0x0900, 0x09d0, 0x0a20, 0x0a30, 0x0940, 0x0a40,
+ 0x0a50, 0x0a60, 0x0a70, 0x0a80, 0x0a90, 0x0aa0, 0x09a0, 0x0ab0,
+ 0x0ac0, 0x0ad0, 0x0900, 0x0ae0, 0x0af0, 0x0b00, 0x0940, 0x0b10,
+ 0x0b20, 0x0ad0, 0x0900, 0x0b30, 0x0af0, 0x0b40, 0x0940, 0x0b50,
+ 0x0b60, 0x0ad0, 0x05b0, 0x0b70, 0x0b80, 0x0b90, 0x0940, 0x0ba0,
+ 0x0bb0, 0x0bc0, 0x05b0, 0x0bd0, 0x0be0, 0x0bf0, 0x09a0, 0x0c00,
+ 0x0c10, 0x0c20, 0x0c20, 0x0c30, 0x0c40, 0x0c50, 0x0860, 0x0860,
+ 0x0c60, 0x0c70, 0x0c80, 0x0c90, 0x0ca0, 0x0cb0, 0x0860, 0x0860,
0x0cc0, 0x0cd0, 0x07b0, 0x0ce0, 0x0cf0, 0x05b0, 0x0d00, 0x0d10,
- 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0870, 0x0870,
+ 0x0d20, 0x0d30, 0x0580, 0x0d40, 0x0d50, 0x0d60, 0x0860, 0x0860,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0d70, 0x0c20, 0x0c20, 0x0c20,
0x0c20, 0x0d80, 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0,
0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0db0, 0x0db0,
@@ -86,16 +86,16 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0e70, 0x0e80, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0e90, 0x0ea0,
0x0eb0, 0x0ec0, 0x05b0, 0x0ed0, 0x05b0, 0x0ee0, 0x0eb0, 0x0ef0,
0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x0f00, 0x0f10, 0x0e50,
- 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a50,
+ 0x0f20, 0x0f10, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0a40,
0x0f30, 0x05b0, 0x0f40, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0f50,
0x05b0, 0x0840, 0x0f60, 0x0f60, 0x0f70, 0x0c20, 0x0f80, 0x0f90,
0x0c20, 0x0c20, 0x0fa0, 0x0c20, 0x0fb0, 0x0fc0, 0x05b0, 0x05b0,
0x05b0, 0x0fd0, 0x0c20, 0x0c20, 0x0c20, 0x0fe0, 0x0c20, 0x0ff0,
- 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0870, 0x0870, 0x0870, 0x0870,
+ 0x0f10, 0x0f10, 0x0f80, 0x1000, 0x0860, 0x0860, 0x0860, 0x0860,
0x1010, 0x05b0, 0x05b0, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060,
0x1070, 0x05b0, 0x1080, 0x07b0, 0x05b0, 0x05b0, 0x07f0, 0x1090,
0x05b0, 0x05b0, 0x1020, 0x10a0, 0x10b0, 0x07b0, 0x05b0, 0x10c0,
- 0x0ea0, 0x0870, 0x0870, 0x0870, 0x0a50, 0x10d0, 0x10e0, 0x10f0,
+ 0x0ea0, 0x0860, 0x0860, 0x0860, 0x0a40, 0x10d0, 0x10e0, 0x10f0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x0580, 0x0580, 0x0580, 0x1100,
0x05b0, 0x0e60, 0x05b0, 0x05b0, 0x0e60, 0x1110, 0x05b0, 0x1120,
@@ -108,80 +108,80 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x1320, 0x1330, 0x1340, 0x1350, 0x05b0, 0x05b0, 0x1360, 0x05b0,
0x1370, 0x1380, 0x1390, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x13a0,
- 0x05b0, 0x05b0, 0x13b0, 0x0870, 0x0860, 0x0870, 0x13c0, 0x13c0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x13d0,
- 0x13c0, 0x13c0, 0x13c0, 0x13c0, 0x1270, 0x13c0, 0x13c0, 0x13e0,
- 0x13c0, 0x13f0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x05b0,
- 0x1450, 0x1460, 0x05b0, 0x1470, 0x1480, 0x05b0, 0x1490, 0x14a0,
- 0x05b0, 0x14b0, 0x05b0, 0x14c0, 0x14d0, 0x14e0, 0x14f0, 0x1500,
- 0x1510, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1520, 0x1530, 0x1540,
- 0x13c0, 0x1550, 0x05b0, 0x05b0, 0x1560, 0x05b0, 0x1570, 0x05b0,
+ 0x05b0, 0x05b0, 0x13b0, 0x0860, 0x13c0, 0x0860, 0x13d0, 0x13d0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13e0,
+ 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x1270, 0x13d0, 0x13d0, 0x13f0,
+ 0x13d0, 0x1400, 0x1410, 0x1420, 0x1430, 0x1440, 0x1450, 0x05b0,
+ 0x1460, 0x1470, 0x05b0, 0x1480, 0x1490, 0x05b0, 0x14a0, 0x14b0,
+ 0x05b0, 0x14c0, 0x05b0, 0x14d0, 0x14e0, 0x14f0, 0x1500, 0x1510,
+ 0x1520, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1530, 0x1540, 0x1550,
+ 0x13d0, 0x1560, 0x05b0, 0x05b0, 0x1570, 0x05b0, 0x1580, 0x05b0,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x1580, 0x1590, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15a0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15b0, 0x05b0, 0x15c0,
- 0x05b0, 0x15d0, 0x05b0, 0x15e0, 0x0910, 0x15f0, 0x1600, 0x0870,
+ 0x1590, 0x15a0, 0x05b0, 0x05b0, 0x05b0, 0x1370, 0x05b0, 0x15b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x15c0, 0x05b0, 0x15d0,
+ 0x05b0, 0x15e0, 0x05b0, 0x15f0, 0x0900, 0x1600, 0x1610, 0x0860,
0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0, 0x0840, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1610, 0x1620,
- 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1630, 0x1640,
- 0x05b0, 0x13b0, 0x1650, 0x1650, 0x1650, 0x1650, 0x0580, 0x0580,
- 0x1660, 0x1670, 0x1680, 0x1690, 0x16a0, 0x0870, 0x0870, 0x0870,
- 0x16b0, 0x16c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16d0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16e0, 0x0870, 0x16f0,
- 0x1700, 0x1710, 0x1720, 0x1730, 0x1740, 0x16b0, 0x1750, 0x16b0,
- 0x1760, 0x1770, 0x1780, 0x16b0, 0x1750, 0x16b0, 0x1760, 0x1790,
- 0x17a0, 0x16b0, 0x17b0, 0x17c0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x17b0, 0x16b0, 0x16b0, 0x17d0, 0x16b0, 0x16b0, 0x16d0, 0x17e0,
- 0x16b0, 0x17b0, 0x16b0, 0x16b0, 0x17f0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x17b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x16b0, 0x1800, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0, 0x16b0,
- 0x1810, 0x16b0, 0x16b0, 0x16b0, 0x1820, 0x05b0, 0x05b0, 0x10c0,
- 0x1830, 0x05b0, 0x1840, 0x0870, 0x05b0, 0x05b0, 0x1610, 0x1850,
- 0x05b0, 0x1860, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1870,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1620, 0x1630,
+ 0x05b0, 0x05b0, 0x0d90, 0x05b0, 0x05b0, 0x05b0, 0x1640, 0x1650,
+ 0x05b0, 0x13b0, 0x1660, 0x1660, 0x1660, 0x1660, 0x0580, 0x0580,
+ 0x1670, 0x1680, 0x1690, 0x16a0, 0x16b0, 0x0860, 0x0860, 0x0860,
+ 0x16c0, 0x16d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16f0, 0x0860, 0x1700,
+ 0x1710, 0x1720, 0x1730, 0x1740, 0x1750, 0x16c0, 0x1760, 0x16c0,
+ 0x1770, 0x1780, 0x1790, 0x16c0, 0x1760, 0x16c0, 0x1770, 0x17a0,
+ 0x17b0, 0x16c0, 0x17c0, 0x17d0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x17e0, 0x16c0, 0x16c0, 0x17f0, 0x16c0, 0x16c0, 0x16e0, 0x1800,
+ 0x16c0, 0x17e0, 0x16c0, 0x16c0, 0x1810, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x17e0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
+ 0x16c0, 0x1820, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0, 0x16c0,
+ 0x1830, 0x16c0, 0x16c0, 0x16c0, 0x1840, 0x05b0, 0x05b0, 0x10c0,
+ 0x1850, 0x05b0, 0x1860, 0x0860, 0x05b0, 0x05b0, 0x1620, 0x1870,
+ 0x05b0, 0x1880, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1890,
0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x0840, 0x0a50, 0x0870, 0x0870, 0x0870, 0x1880,
- 0x1890, 0x05b0, 0x18a0, 0x18b0, 0x05b0, 0x05b0, 0x05b0, 0x18c0,
- 0x18d0, 0x05b0, 0x05b0, 0x1020, 0x18e0, 0x0f10, 0x0580, 0x18f0,
- 0x07b0, 0x05b0, 0x1900, 0x05b0, 0x1910, 0x1920, 0x0da0, 0x1930,
- 0x08b0, 0x05b0, 0x05b0, 0x1940, 0x1950, 0x1960, 0x0c20, 0x1970,
- 0x05b0, 0x05b0, 0x1980, 0x1990, 0x19a0, 0x19b0, 0x0c20, 0x0c20,
- 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19c0, 0x19d0, 0x0760, 0x19e0,
- 0x19f0, 0x1a00, 0x1650, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a10, 0x0f10,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20,
- 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50,
- 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40,
- 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60,
- 0x1a40, 0x1a20, 0x1a30, 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40,
- 0x1a40, 0x1a50, 0x1a40, 0x1a60, 0x1a40, 0x1a20, 0x1a30, 0x1a40,
- 0x1a50, 0x1a40, 0x1a70, 0x0db0, 0x1a80, 0x0dd0, 0x0dd0, 0x1a90,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aa0,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870,
- 0x13b0, 0x1ab0, 0x1ac0, 0x1ad0, 0x1ae0, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1af0, 0x1b00, 0x05b0, 0x05b0,
- 0x05b0, 0x05b0, 0x05b0, 0x1b10, 0x0870, 0x05b0, 0x05b0, 0x05b0,
- 0x05b0, 0x1b20, 0x05b0, 0x05b0, 0x0a50, 0x0870, 0x0870, 0x1b30,
- 0x0580, 0x1b40, 0x0580, 0x1b50, 0x1b60, 0x1b70, 0x1b80, 0x1130,
- 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1b90,
- 0x1ba0, 0x1bb0, 0x16b0, 0x1bc0, 0x16b0, 0x1bd0, 0x1be0, 0x1bf0,
- 0x16b0, 0x1c00, 0x16b0, 0x17b0, 0x1c10, 0x1c20, 0x1c30, 0x1c40,
+ 0x05b0, 0x05b0, 0x0840, 0x0a40, 0x0860, 0x0860, 0x0860, 0x18a0,
+ 0x18b0, 0x05b0, 0x18c0, 0x18d0, 0x05b0, 0x05b0, 0x05b0, 0x18e0,
+ 0x18f0, 0x05b0, 0x05b0, 0x1020, 0x1900, 0x0f10, 0x0580, 0x1910,
+ 0x07b0, 0x05b0, 0x1920, 0x05b0, 0x1930, 0x1940, 0x0da0, 0x1950,
+ 0x08a0, 0x05b0, 0x05b0, 0x1960, 0x1970, 0x1980, 0x0c20, 0x1990,
+ 0x05b0, 0x05b0, 0x19a0, 0x19b0, 0x19c0, 0x19d0, 0x0c20, 0x0c20,
+ 0x0c20, 0x0c20, 0x0c20, 0x0c20, 0x19e0, 0x19f0, 0x0760, 0x1a00,
+ 0x1a10, 0x1a20, 0x1660, 0x05b0, 0x05b0, 0x05b0, 0x0f50, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1a30, 0x0f10,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40,
+ 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70,
+ 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60,
+ 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80,
+ 0x1a60, 0x1a40, 0x1a50, 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60,
+ 0x1a60, 0x1a70, 0x1a60, 0x1a80, 0x1a60, 0x1a40, 0x1a50, 0x1a60,
+ 0x1a70, 0x1a60, 0x1a90, 0x0db0, 0x1aa0, 0x0dd0, 0x0dd0, 0x1ab0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860, 0x0860,
+ 0x13b0, 0x1ad0, 0x1ae0, 0x1af0, 0x1b00, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1600, 0x1b10, 0x05b0, 0x05b0,
+ 0x05b0, 0x05b0, 0x05b0, 0x1b20, 0x0860, 0x05b0, 0x05b0, 0x05b0,
+ 0x05b0, 0x1b30, 0x05b0, 0x05b0, 0x0a40, 0x0860, 0x0860, 0x1b40,
+ 0x0580, 0x1b50, 0x0580, 0x1b60, 0x1b70, 0x1b80, 0x1b90, 0x1130,
+ 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x1ba0,
+ 0x1bb0, 0x1bc0, 0x16c0, 0x1bd0, 0x16c0, 0x1be0, 0x1bf0, 0x1c00,
+ 0x16c0, 0x1c10, 0x16c0, 0x17e0, 0x1c20, 0x1c30, 0x1c40, 0x1c50,
/* values */
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0022, 0x0003, 0x0001, 0x0001, 0x0002, 0x0004, 0x0004,
@@ -277,8 +277,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x001d, 0x0011,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
@@ -310,7 +308,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x0004, 0x0004, 0x0011, 0x0011, 0x001c, 0x001c,
0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c,
0x001d, 0x001d, 0x001b, 0x001b, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001b, 0x001d, 0x001a, 0x001d, 0x001d, 0x0011, 0x0011,
+ 0x001d, 0x001b, 0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d,
0x001d, 0x0011, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d, 0x0011,
@@ -332,7 +330,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001d, 0x001a, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x001d, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0011, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011, 0x0004,
@@ -375,8 +373,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x0011,
0x0011, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0004, 0x0004, 0x0004, 0x0011, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0004, 0x0004, 0x001d, 0x0004, 0x0004,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x001d, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0004, 0x0004,
0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x0004,
@@ -551,10 +551,10 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x001d, 0x001d, 0x001d, 0x001d, 0x0004, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0004,
+ 0x001d, 0x001d, 0x0004, 0x0004, 0x0004, 0x001d, 0x001d, 0x0011,
0x0004, 0x0004, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d, 0x0011, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -638,9 +638,11 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x0012, 0x0013, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001e, 0x001e, 0x001e, 0x001e, 0x001d, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
+ 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
@@ -711,7 +713,7 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d,
- 0x001d, 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d,
@@ -733,8 +735,8 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0012, 0x0013, 0x0022, 0x0022, 0x0022, 0x0022, 0x0017, 0x001d,
0x0022, 0x0022, 0x001d, 0x0022, 0x0022, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x0025, 0x0025, 0x0022, 0x0022, 0x0022, 0x001d,
- 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022,
- 0x0022, 0x0022, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
+ 0x0022, 0x0022, 0x0012, 0x0022, 0x0022, 0x0011, 0x0011, 0x0011,
+ 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
@@ -768,10 +770,12 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
- 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011, 0x0011,
0x0011, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0011,
+ 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
0x001e, 0x001e, 0x001e, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027,
@@ -871,8 +875,6 @@ const unsigned short DECLSPEC_HIDDEN wine_linebreak_table[7248] =
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0011, 0x0026, 0x0011,
0x0026, 0x0026, 0x0011, 0x0026, 0x0026, 0x0011, 0x0026, 0x0026,
0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026,
- 0x001d, 0x001d, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
- 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d,
diff --git a/dlls/usp10/mirror.c b/dlls/usp10/mirror.c
index 23dab536c4..daadfa8054 100644
--- a/dlls/usp10/mirror.c
+++ b/dlls/usp10/mirror.c
@@ -1,5 +1,5 @@
/* Unicode BiDi mirroring */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/BidiMirroring.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/BidiMirroring.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/dlls/usp10/shaping.c b/dlls/usp10/shaping.c
index 82435ff2c3..cf6f3b4a97 100644
--- a/dlls/usp10/shaping.c
+++ b/dlls/usp10/shaping.c
@@ -1,10 +1,10 @@
/* Unicode Arabic shaping */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/ArabicShaping.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/ArabicShaping.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
-const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
+const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2864] =
{
/* level 1 offsets */
0x0100, 0x0110, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160,
@@ -54,64 +54,64 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0410, 0x0420, 0x0430, 0x0440, 0x0450, 0x0460, 0x0470, 0x0480,
0x0490, 0x04a0, 0x04b0, 0x0360, 0x04c0, 0x04d0, 0x04e0, 0x04f0,
0x0340, 0x0340, 0x0500, 0x0510, 0x0520, 0x0530, 0x0540, 0x0550,
- 0x0340, 0x0560, 0x0570, 0x0340, 0x0580, 0x0590, 0x05a0, 0x0340,
- 0x0340, 0x0340, 0x05b0, 0x05c0, 0x0340, 0x05d0, 0x05e0, 0x0360,
- 0x05f0, 0x0340, 0x0340, 0x0600, 0x0610, 0x0620, 0x0630, 0x0340,
- 0x0640, 0x0340, 0x0340, 0x0650, 0x0660, 0x0340, 0x0630, 0x0340,
- 0x0670, 0x0340, 0x0340, 0x0650, 0x0680, 0x0640, 0x0340, 0x0690,
- 0x0670, 0x0340, 0x0340, 0x0650, 0x06a0, 0x0340, 0x0630, 0x06b0,
- 0x0640, 0x0340, 0x0340, 0x06c0, 0x0660, 0x06d0, 0x0630, 0x0340,
- 0x06e0, 0x0340, 0x0340, 0x0340, 0x06f0, 0x0340, 0x0340, 0x0340,
- 0x0510, 0x0340, 0x0340, 0x0700, 0x0710, 0x0720, 0x0630, 0x0340,
- 0x0640, 0x0340, 0x0340, 0x06c0, 0x0730, 0x0340, 0x0630, 0x0340,
- 0x0740, 0x0340, 0x0340, 0x0750, 0x0660, 0x0340, 0x0630, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0760, 0x0770, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0780, 0x0790, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x07a0, 0x07b0, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x07c0, 0x0340, 0x07d0, 0x0340, 0x0340, 0x0340, 0x07e0,
- 0x07f0, 0x0800, 0x0360, 0x0810, 0x06d0, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0820, 0x0830, 0x0340, 0x0840, 0x0510, 0x0850,
- 0x0860, 0x0350, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0820, 0x0340, 0x0340,
+ 0x0340, 0x0560, 0x0570, 0x0340, 0x0580, 0x0590, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x05a0, 0x05b0, 0x0340, 0x05c0, 0x05d0, 0x0360,
+ 0x05e0, 0x0340, 0x0340, 0x05f0, 0x0600, 0x0610, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x0640, 0x0650, 0x0340, 0x0620, 0x0340,
+ 0x0660, 0x0340, 0x0340, 0x0640, 0x0670, 0x0630, 0x0340, 0x0680,
+ 0x0660, 0x0340, 0x0340, 0x0640, 0x0690, 0x0340, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x06a0, 0x0650, 0x06b0, 0x0620, 0x0340,
+ 0x06c0, 0x0340, 0x0340, 0x0340, 0x06d0, 0x0340, 0x0340, 0x0340,
+ 0x0510, 0x0340, 0x0340, 0x06e0, 0x06f0, 0x0700, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x06a0, 0x0710, 0x0340, 0x0620, 0x0340,
+ 0x0630, 0x0340, 0x0340, 0x0340, 0x0650, 0x0340, 0x0620, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0720, 0x0730, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0740, 0x0750, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0760, 0x0770, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0780, 0x0340, 0x0790, 0x0340, 0x0340, 0x0340, 0x07a0,
+ 0x07b0, 0x07c0, 0x0360, 0x07d0, 0x06b0, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x07e0, 0x07f0, 0x0340, 0x0800, 0x0510, 0x0810,
+ 0x0820, 0x0350, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x07e0, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0870, 0x0340, 0x0870, 0x0340, 0x0630, 0x0340, 0x0630,
- 0x0340, 0x0340, 0x0340, 0x0880, 0x0890, 0x08a0, 0x0340, 0x0340,
- 0x08b0, 0x0340, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x08c0,
- 0x08d0, 0x0530, 0x08e0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x08f0, 0x0900, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0830, 0x0340, 0x0830, 0x0340, 0x0620, 0x0340, 0x0620,
+ 0x0340, 0x0340, 0x0340, 0x0840, 0x0850, 0x0860, 0x0340, 0x0340,
+ 0x0870, 0x0340, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0880,
+ 0x0890, 0x0530, 0x08a0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x08b0, 0x08c0, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0910, 0x0340, 0x0340, 0x0340, 0x0920, 0x0930, 0x0940,
- 0x0340, 0x0340, 0x0340, 0x0950, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0960, 0x0340, 0x0340, 0x0970, 0x06e0, 0x0340, 0x0980, 0x0960,
- 0x0740, 0x0340, 0x0990, 0x0340, 0x0340, 0x0340, 0x09a0, 0x0740,
- 0x0340, 0x0340, 0x09b0, 0x09c0, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x09d0, 0x09e0, 0x09f0,
+ 0x0340, 0x08d0, 0x0340, 0x0340, 0x0340, 0x08e0, 0x08f0, 0x0900,
+ 0x0340, 0x0340, 0x0340, 0x0910, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0920, 0x0340, 0x0340, 0x0930, 0x06c0, 0x0340, 0x0940, 0x0920,
+ 0x0950, 0x0340, 0x0960, 0x0340, 0x0340, 0x0340, 0x0970, 0x0950,
+ 0x0340, 0x0340, 0x0980, 0x0990, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x09a0, 0x09b0, 0x09c0,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0360, 0x0a00,
- 0x0a10, 0x0340, 0x0a20, 0x0340, 0x0340, 0x0340, 0x0a30, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0360, 0x09d0,
+ 0x09e0, 0x0340, 0x09f0, 0x0340, 0x0340, 0x0340, 0x0a00, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360, 0x0510,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0740,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0950,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0360, 0x0360,
- 0x0340, 0x0340, 0x0a40, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0a50, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0a60,
- 0x0340, 0x0700, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0740,
- 0x0a70, 0x0340, 0x0720, 0x0340, 0x0530, 0x0530, 0x0530, 0x0a80,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0a90, 0x0340, 0x0360, 0x0740,
- 0x0340, 0x0340, 0x0aa0, 0x0340, 0x0ab0, 0x0740, 0x0340, 0x0340,
- 0x05f0, 0x0340, 0x0340, 0x0ac0, 0x0340, 0x0340, 0x0ad0, 0x0340,
- 0x0340, 0x0340, 0x0ae0, 0x0af0, 0x0b00, 0x0340, 0x0340, 0x0650,
- 0x0340, 0x0340, 0x0340, 0x0b10, 0x0640, 0x0340, 0x0b20, 0x06d0,
+ 0x0340, 0x0340, 0x0a10, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0a20, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490, 0x0a30,
+ 0x0340, 0x06e0, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0950,
+ 0x0a40, 0x0340, 0x0700, 0x0340, 0x0530, 0x0530, 0x0530, 0x0a50,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0a60, 0x0340, 0x0360, 0x0950,
+ 0x0340, 0x0340, 0x0a70, 0x0340, 0x0a80, 0x0950, 0x0340, 0x0340,
+ 0x05e0, 0x0340, 0x0340, 0x0a90, 0x0340, 0x0340, 0x0aa0, 0x0340,
+ 0x0340, 0x0340, 0x0ab0, 0x0ac0, 0x0ad0, 0x0340, 0x0340, 0x0640,
+ 0x0340, 0x0340, 0x0340, 0x0ae0, 0x0630, 0x0340, 0x0af0, 0x06b0,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b30, 0x0340,
- 0x0340, 0x0b40, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b00, 0x0340,
+ 0x0340, 0x0b10, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0360, 0x0340, 0x0360, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0490,
0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
- 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b50,
+ 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0b20,
/* values */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -189,12 +189,10 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0004, 0x0002, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0004, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3404, 0x3400, 0x3404, 0x3404, 0x3404, 0x3404, 0x3400, 0x3402,
- 0x3404, 0x3402, 0x3402, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0404, 0x0404, 0x0604, 0x0b04, 0x0f04, 0x1004, 0x1204, 0x1304,
- 0x0104, 0x0104, 0x0802, 0x0302, 0x3502, 0x0000, 0x0702, 0x0a04,
- 0x0d04, 0x3602, 0x0802, 0x0c04, 0x1104, 0x0000, 0x0404, 0x0404,
- 0x0404, 0x0802, 0x0104, 0x3704, 0x3704, 0x3704, 0x0000, 0x0000,
+ 0x0104, 0x0104, 0x0802, 0x0302, 0x3402, 0x0000, 0x0702, 0x0a04,
+ 0x0d04, 0x3502, 0x0802, 0x0c04, 0x1104, 0x0000, 0x0404, 0x0404,
+ 0x0404, 0x0802, 0x0104, 0x3604, 0x3604, 0x3604, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
@@ -224,8 +222,6 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -241,10 +237,6 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000,
- 0x0001, 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, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000,
@@ -315,6 +307,8 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
@@ -329,8 +323,8 @@ const unsigned short DECLSPEC_HIDDEN wine_shaping_table[2912] =
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
diff --git a/dlls/wineps.drv/vertical.c b/dlls/wineps.drv/vertical.c
index 05737604b8..ca4467911c 100644
--- a/dlls/wineps.drv/vertical.c
+++ b/dlls/wineps.drv/vertical.c
@@ -1,5 +1,5 @@
/* Unicode Vertical Orientation */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/VerticalOrientation.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/VerticalOrientation.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/compose.c b/libs/port/compose.c
index 71589f47c1..06f6062d24 100644
--- a/libs/port/compose.c
+++ b/libs/port/compose.c
@@ -1,5 +1,5 @@
/* Unicode char composition */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index 221d2e0e92..5e6b2214ec 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -1,5 +1,5 @@
/* Unicode char composition */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/port/digitmap.c b/libs/port/digitmap.c
index 786879a90a..79a86651cc 100644
--- a/libs/port/digitmap.c
+++ b/libs/port/digitmap.c
@@ -1,5 +1,5 @@
/* Unicode digit folding mappings */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/wine/casemap.c b/libs/wine/casemap.c
index bfab3233ee..122f81ff2f 100644
--- a/libs/wine/casemap.c
+++ b/libs/wine/casemap.c
@@ -1,5 +1,5 @@
/* Unicode case mappings */
-/* generated from http://www.unicode.org/Public/10.0.0/ucd/UnicodeData.txt */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
/* DO NOT EDIT!! */
#include "wine/unicode.h"
diff --git a/libs/wine/wctype.c b/libs/wine/wctype.c
index 8d0a3ed94d..5a79353985 100644
--- a/libs/wine/wctype.c
+++ b/libs/wine/wctype.c
@@ -307,8 +307,8 @@ const unsigned short wine_wctype_table[17152] =
0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300,
0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2300,
0x2300, 0xd200, 0xd200, 0xd200, 0x0000, 0x0000, 0x2210, 0x0000,
- 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300,
- 0xc300, 0xc300, 0xc300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -358,7 +358,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0xd200, 0xd200, 0x0000, 0x0000, 0x1204, 0x1204,
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x1300, 0x1300, 0x5200, 0x5200, 0x1200, 0x1200, 0x1200, 0x1200,
- 0x1200, 0x1200, 0x1200, 0x5200, 0x1300, 0x1210, 0x0000, 0x0000,
+ 0x1200, 0x1200, 0x1200, 0x5200, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xd200, 0xd200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x1300,
0x1300, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -390,7 +390,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0xd200, 0xd200, 0x0000, 0x0000, 0x1204, 0x1204,
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x1210, 0x5200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x1300, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
+ 0x0000, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x1300,
0x1300, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -455,14 +455,14 @@ const unsigned short wine_wctype_table[17152] =
0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204, 0x1204,
0x0000, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0xd200, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
+ 0x0000, 0xd200, 0x1200, 0x1200, 0x0000, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x1300, 0x1300,
0x1300, 0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0xd200, 0xd200, 0x1300, 0x1200, 0x1200,
+ 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x1300, 0x1200, 0x1200,
0x1200, 0xd200, 0xd200, 0xd200, 0xd200, 0x0000, 0x1200, 0x1200,
0x1200, 0x0000, 0x1200, 0x1200, 0x1200, 0xd200, 0x1300, 0x1200,
0x0000, 0x0000, 0x0000, 0x0000, 0x1300, 0x1300, 0x1300, 0x1200,
@@ -933,7 +933,7 @@ const unsigned short wine_wctype_table[17152] =
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0x1200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0x1300, 0x1300, 0x1300, 0x1300, 0xd200, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1200, 0x1200, 0xd200, 0x1300, 0x1300, 0x1200,
+ 0x1300, 0x1300, 0x1200, 0x1200, 0xd200, 0x1300, 0x1300, 0x0000,
0xd200, 0xd200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302,
0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302, 0x1302,
@@ -965,8 +965,8 @@ const unsigned short wine_wctype_table[17152] =
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
- 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
- 0xd200, 0xd200, 0x0000, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
+ 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302, 0x1301, 0x1302,
@@ -1054,7 +1054,7 @@ const unsigned short wine_wctype_table[17152] =
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
- 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200,
+ 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200,
@@ -1158,7 +1158,7 @@ const unsigned short wine_wctype_table[17152] =
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
- 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
+ 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0x0000,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
@@ -1377,7 +1377,7 @@ const unsigned short wine_wctype_table[17152] =
0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0xb200, 0xb200, 0xb200,
0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
0xb200, 0x0000, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200, 0xb200,
- 0xb200, 0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xb200, 0xb200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xb200, 0xb200, 0xb200, 0xb200,
@@ -1455,8 +1455,8 @@ const unsigned short wine_wctype_table[17152] =
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb300,
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
- 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0xb210,
- 0xb210, 0xb210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xb210, 0xb210, 0xb210, 0xb210, 0xb210, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -1548,7 +1548,7 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000,
+ 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000,
0x0000, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
@@ -1697,10 +1697,10 @@ const unsigned short wine_wctype_table[17152] =
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
- 0x1300, 0x1300, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300,
diff --git a/tools/make_unicode b/tools/make_unicode
index 92b0b64a94..a22cd044b7 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -23,7 +23,7 @@ use strict;
# base URLs for www.unicode.org files
my $MAPPINGS = "http://www.unicode.org/Public/MAPPINGS";
-my $UNIDATA = "http://www.unicode.org/Public/10.0.0/ucd";
+my $UNIDATA = "http://www.unicode.org/Public/11.0.0/ucd";
my $REPORTS = "http://www.unicode.org/reports";
my $RFCS = "http://www.rfc-editor.org/rfc";
@@ -1462,7 +1462,12 @@ my %scripts =
"Old_Hungarian" => 134,
"Osage" => 135,
"SignWriting" => 136,
- "Tangut" => 137
+ "Tangut" => 137,
+ # Win10 RS4
+ "Masaram_Gondi" => 138,
+ "Nushu" => 139,
+ "Soyombo" => 140,
+ "Zanabazar_Square" => 141
);
################################################################
--
2.18.0
June 30, 2018
Re: [PATCH] gdi32: Add DECLSPEC_HOTPATCH to GetDIBits
by Stefan Dösinger
> Am 28.06.2018 um 17:28 schrieb Alex Henrie <alexhenrie24(a)gmail.com>:
>
> Although this patch fixes the bug in question, Zeb and I would like to
> know: Since all exported Windows API functions support hotpatching,[1]
> why do we add __attribute__((__ms_hook_prologue__)) attribute to
> functions ad hoc instead of making it part of the definitions of
> __stdcall and __cdecl in windef.h?
Alex asked me at Wineconf to comment on this.
When I added __ms_hook_prologue__ to gcc a long time ago we did not anticipate a high number of functions to need it. In 32 bit x86 code it adds minor overhead - there is a 2 byte nop at the start of every function that uses it. Having it on all functions was considered unnecessary and wasteful. On x64 this nop is 8 bytes long.
At the time I worked on this Windows only made regular exported functions hotpatchable (what we have in our .spec files), but not e.g. COM methods. But Windows applications hook COM methods too, we wanted to be able to make static functions hotpatchable. On Windows this is a compiler option: https://docs.microsoft.com/en-us/cpp/build/reference/hotpatch-create-hotpat… <https://docs.microsoft.com/en-us/cpp/build/reference/hotpatch-create-hotpat…> . Doing the same thing would not work for us because we still have to make sure that e.g. IDirect3DDevice9::Present does not contain code that Steam et all cannot handle.
June 30, 2018
[PATCH] msvcr120: Add stub for _SetWinRTOutOfMemoryExceptionCallback.
by Alex Henrie
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
Patch from Wine Staging.
Fixes https://bugs.winehq.org/show_bug.cgi?id=45394
dlls/msvcr120/msvcr120.spec | 2 +-
dlls/msvcr120_app/msvcr120_app.spec | 2 +-
dlls/msvcrt/misc.c | 8 ++++++++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 00f622b944..585353ccc8 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -844,7 +844,7 @@
@ stub -arch=i386 _NLG_Return
@ stub -arch=i386 _NLG_Return2
@ stub -arch=arm,win64 __NLG_Return2
-@ stub _SetWinRTOutOfMemoryExceptionCallback
+@ cdecl -arch=i386,x86_64,arm _SetWinRTOutOfMemoryExceptionCallback(ptr) MSVCR120__SetWinRTOutOfMemoryExceptionCallback
@ stub -arch=win64 _SetImageBase
@ stub -arch=win64 _SetThrowImageBase
@ cdecl _Strftime(ptr long str ptr ptr)
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index af1b12957f..ceb8d10306 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -838,7 +838,7 @@
@ stub -arch=i386 _NLG_Return
@ stub -arch=i386 _NLG_Return2
@ stub -arch=arm,win64 __NLG_Return2
-@ stub _SetWinRTOutOfMemoryExceptionCallback
+@ cdecl -arch=i386,x86_64,arm _SetWinRTOutOfMemoryExceptionCallback(ptr) msvcr120._SetWinRTOutOfMemoryExceptionCallback
@ stub -arch=win64 _SetImageBase
@ stub -arch=win64 _SetThrowImageBase
@ cdecl _Strftime(ptr long str ptr ptr) msvcr120._Strftime
diff --git a/dlls/msvcrt/misc.c b/dlls/msvcrt/misc.c
index d760e171bd..5a4e77b098 100644
--- a/dlls/msvcrt/misc.c
+++ b/dlls/msvcrt/misc.c
@@ -580,4 +580,12 @@ void CDECL MSVCRT__crtSleep(DWORD timeout)
TRACE("(%u)\n", timeout);
Sleep(timeout);
}
+
+/*********************************************************************
+ * _SetWinRTOutOfMemoryExceptionCallback (MSVCR120.@)
+ */
+void CDECL MSVCR120__SetWinRTOutOfMemoryExceptionCallback(void *callback)
+{
+ FIXME("(%p): stub\n", callback);
+}
#endif
--
2.18.0
June 29, 2018
Re: [PATCH] user32/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39453
Your paranoid android.
=== wvistau64 (32 bit listbox) ===
listbox.c:740: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY, *) filled with 7 entries, expected > 7
listbox.c:975: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err 18
=== wvistau64_zh_CN (32 bit listbox) ===
listbox.c:740: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY, *) filled with 7 entries, expected > 7
listbox.c:975: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err 18
=== wvistau64_fr (32 bit listbox) ===
listbox.c:740: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY, *) filled with 7 entries, expected > 7
listbox.c:975: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err 18
=== wvistau64_he (32 bit listbox) ===
listbox.c:740: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY, *) filled with 7 entries, expected > 7
listbox.c:975: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err 18
=== wvistau64 (64 bit listbox) ===
listbox.c:740: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY, *) filled with 7 entries, expected > 7
listbox.c:975: Test failed: SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err 18
=== wvistau64_zh_CN (32 bit msg) ===
msg.c:5084: Test failed: ShowWindow(SW_RESTORE):overlapped: 18: the msg sequence is not complete: expected 0000 - actual 0088
=== w8 (32 bit sysparams) ===
sysparams.c:2511: Test failed: Waiting for the WM_DISPLAYCHANGE message timed out
sysparams.c:2522: Test failed: Set bpp 32, but WM_DISPLAYCHANGE reported bpp -1
=== w8adm (32 bit sysparams) ===
sysparams.c:961: testing SPI_{GET,SET}SCREENSAVETIMEOUT
sysparams.c:2511: Test failed: Waiting for the WM_DISPLAYCHANGE message timed out
sysparams.c:2522: Test failed: Set bpp 32, but WM_DISPLAYCHANGE reported bpp -1
=== w864 (32 bit sysparams) ===
sysparams.c:2511: Test failed: Waiting for the WM_DISPLAYCHANGE message timed out
sysparams.c:2522: Test failed: Set bpp 32, but WM_DISPLAYCHANGE reported bpp -1
=== w1064 (32 bit sysparams) ===
sysparams.c:225: Test failed: Unexpected WM_DISPLAYCHANGE message
June 28, 2018
[PATCH] dbghelp: Map SIMD dwarf registers on ARM64
by André Hentschel
Signed-off-by: André Hentschel <nerv(a)dawncrow.de>
---
dlls/dbghelp/cpu_arm64.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/dbghelp/cpu_arm64.c b/dlls/dbghelp/cpu_arm64.c
index dea19f8..f50b325 100644
--- a/dlls/dbghelp/cpu_arm64.c
+++ b/dlls/dbghelp/cpu_arm64.c
@@ -158,6 +158,7 @@ static unsigned arm64_map_dwarf_register(unsigned regno, BOOL eh_frame)
if (regno == 29) return CV_ARM64_FP;
if (regno == 30) return CV_ARM64_LR;
if (regno == 31) return CV_ARM64_SP;
+ if (regno >= 64 && regno <= 95) return CV_ARM64_Q0 + regno - 64;
FIXME("Don't know how to map register %d\n", regno);
return CV_ARM64_NOREG;
--
2.7.4
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by John Found
OK, continuing the bug #45385 investigation, I found out that it is somehow related to the window manager and its focus policies.
I am working and testing in XFCE and in the window manager settings there are two checkboxes:
[ ] Activate focus stealing protection
[ ] Honor ICCCM focus hint
So, the buggy behavior happens when and only when both these options are checked.
When only one of the is checked or both are unchecked, the bug does not manifests itself.
The big question here is whether the bug is in the WM/X11 or in the WINE itself.
I can't judge by myself, simply because I don't know how this "stealing prevention" works and
what is "ICCCM focus hint".
While this finding allows to workaround the problem, I am still curious about the actual reason for the wrong behavior.
Any considerations?
Regards
On Wed, 27 Jun 2018 08:50:22 +0300
John Found <johnfound(a)asm32.info> wrote:
> I just reported bug #45385 (https://bugs.winehq.org/show_bug.cgi?id=45385) and want to try to fix it.
>
> So I want to ask about some preliminary directions - where to check the code,
> what is the general structure of the code related to the bug subject, possible suspicious places.
>
> Here is the full bug report in order to save you a visit to the bug tracker:
>
> > I noticed that the state of the keys sometimes sticks in pressed state.
> >
> > This happens when cycling windows with some shortcut key combination.
> >
> > For example if cycling with Alt+Tab, on pressing Alt, the program gets WM_KEYDOWN and the state of the VK_MENU becomes pressed. But after cycling windows, the program does not get WM_KEYUP because the window is not focused and VK_MENU (and the respective VK_LMENU or VK_RMENU) remain in pressed state.
> >
> > When cycling back to the program window, the window get focused only after releasing Alt key, so it does not get this event as well.
> >
> > If cycling windows with another shortcut key combination (for example Alt+Shift+Tab - for backward cycling) both VK_MENU and VK_SHIFT keys stick.
> >
> > In the same time, GetAsyncKeyState returns the proper state of the keys.
> >
> > Note1: The problem is obviously in the wineserver code, because it handles the key state tables for the different threads.
> >
> > Note2: The effect happens only sometimes. It seems the code for proper processing is already there, but some racing conditions have place.
> >
> > Note3: There is some probability that the effect is in result of my application code, but it never happens on real Windows, so I considered it a bug.
> >
> > Note4: I tried to workaround this problem by reading the whole table by GetAsyncKeyState and setting it then with SetKeyboardState on WM_ACTIVATE message of the main window. This workaround actually works, but is too ugly IMO.
> > The same trick on WM_ACTIVATEAPP does not work.
>
> --
> John Found <johnfound(a)asm32.info>
>
>
--
John Found <johnfound(a)asm32.info>
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by John Found
On Thu, 28 Jun 2018 14:04:31 +0200
Kai Krakow <kai(a)kaishome.de> wrote:
>
> But this should answer the OPs question why it is done in this way.
>
Well, for me the code is still entangled, and not very legible.
Nevertheless I understood how it works and it seems to be correct.
Thank you and all thread contributors above. :)
Regards.
P.S. Actually I found another possible reason for the researched bug, but will ask about it in another post below.
--
John Found <johnfound(a)asm32.info>
June 28, 2018
[PATCH] user32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/user32/tests/class.c | 16 ++++++-------
dlls/user32/tests/clipboard.c | 4 ++--
dlls/user32/tests/combo.c | 4 ++--
dlls/user32/tests/cursoricon.c | 2 +-
dlls/user32/tests/dde.c | 12 +++++-----
dlls/user32/tests/dialog.c | 8 +++----
dlls/user32/tests/edit.c | 6 ++---
dlls/user32/tests/input.c | 13 +++++------
dlls/user32/tests/listbox.c | 2 +-
dlls/user32/tests/menu.c | 19 ++++++++-------
dlls/user32/tests/monitor.c | 6 ++---
dlls/user32/tests/msg.c | 26 ++++++++++-----------
dlls/user32/tests/resource.c | 4 ++--
dlls/user32/tests/scroll.c | 2 +-
dlls/user32/tests/sysparams.c | 50 ++++++++++++++++++++--------------------
dlls/user32/tests/text.c | 8 +++----
dlls/user32/tests/uitools.c | 2 +-
dlls/user32/tests/win.c | 52 +++++++++++++++++++++---------------------
dlls/user32/tests/wsprintf.c | 8 +++----
19 files changed, 121 insertions(+), 123 deletions(-)
diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c
index 9b3b2b30f3..53fa2f12e3 100644
--- a/dlls/user32/tests/class.c
+++ b/dlls/user32/tests/class.c
@@ -169,7 +169,7 @@ static void ClassTest(HINSTANCE hInstance, BOOL global)
}
/* check GetClassName */
- i = GetClassNameW(hTestWnd, str, sizeof(str)/sizeof(str[0]));
+ i = GetClassNameW(hTestWnd, str, ARRAY_SIZE(str));
ok(i == lstrlenW(className),
"GetClassName returned incorrect length\n");
ok(!lstrcmpW(className,str),
@@ -725,7 +725,7 @@ static void test_builtinproc(void)
ok(IsWindowUnicode(hwnd) ||
broken(!IsWindowUnicode(hwnd)) /* Windows 8 and 10 */,
"Windows should be Unicode\n");
- SendMessageW(hwnd, WM_GETTEXT, sizeof(buf) / sizeof(buf[0]), (LPARAM)buf);
+ SendMessageW(hwnd, WM_GETTEXT, ARRAY_SIZE(buf), (LPARAM)buf);
if (IsWindowUnicode(hwnd))
ok(memcmp(buf, unistring, sizeof(unistring)) == 0, "WM_GETTEXT invalid return\n");
else
@@ -939,7 +939,7 @@ static const struct
static void test_extra_values(void)
{
int i;
- for(i=0; i< sizeof(extra_values)/sizeof(extra_values[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(extra_values); i++)
{
WNDCLASSEXA wcx;
BOOL ret = GetClassInfoExA(NULL,extra_values[i].name,&wcx);
@@ -1133,7 +1133,7 @@ static void test_comctl32_class( const char *name )
name++;
- GetTempPathA(sizeof(path)/sizeof(path[0]), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, "comctl32_class.manifest");
create_manifest_file(path, comctl32_manifest);
@@ -1161,7 +1161,7 @@ static void test_comctl32_class( const char *name )
if (!ret)
goto skiptest;
- MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, sizeof(nameW)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, ARRAY_SIZE(nameW));
ret = GetClassInfoW( 0, nameW, &wcW );
ok( ret, "GetClassInfoW failed for %s\n", name );
module = GetModuleHandleA( "comctl32" );
@@ -1187,7 +1187,7 @@ static void test_comctl32_class( const char *name )
ret = GetClassInfoA( 0, name, &wcA );
ok( ret || broken(!ret) /* <= winxp */, "GetClassInfoA failed for %s\n", name );
if (!ret) return;
- MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, sizeof(nameW)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, ARRAY_SIZE(nameW));
ret = GetClassInfoW( 0, nameW, &wcW );
ok( ret, "GetClassInfoW failed for %s\n", name );
module = GetModuleHandleA( "comctl32" );
@@ -1243,7 +1243,7 @@ static void test_comctl32_classes(void)
};
winetest_get_mainargs( &argv );
- for (i = 0; i < sizeof(classes) / sizeof(classes[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(classes); i++)
{
memset( &startup, 0, sizeof(startup) );
startup.cb = sizeof( startup );
@@ -1322,7 +1322,7 @@ static void test_actctx_classes(void)
HWND hwnd;
char path[MAX_PATH];
- GetTempPathA(sizeof(path)/sizeof(path[0]), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, "actctx_classes.manifest");
create_manifest_file(path, main_manifest);
diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c
index 3d3ef8b4c1..4436ece70d 100644
--- a/dlls/user32/tests/clipboard.c
+++ b/dlls/user32/tests/clipboard.c
@@ -711,7 +711,7 @@ static void test_synthesized(void)
r = CloseClipboard();
ok(r, "gle %d\n", GetLastError());
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
r = OpenClipboard(NULL);
ok(r, "%u: gle %d\n", i, GetLastError());
@@ -2044,7 +2044,7 @@ static void test_string_data(void)
char bufferA[12];
WCHAR bufferW[12];
- for (i = 0; i < sizeof(test_data) / sizeof(test_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_data); i++)
{
/* 1-byte Unicode strings crash on Win64 */
#ifdef _WIN64
diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c
index ad706ea754..3358e846a0 100644
--- a/dlls/user32/tests/combo.c
+++ b/dlls/user32/tests/combo.c
@@ -291,7 +291,7 @@ static void test_WM_LBUTTONDOWN(void)
hCombo = CreateWindowA("ComboBox", "Combo", WS_VISIBLE|WS_CHILD|CBS_DROPDOWN,
0, 0, 200, 150, hMainWnd, (HMENU)COMBO_ID, NULL, 0);
- for (i = 0; i < sizeof(choices)/sizeof(UINT); i++){
+ for (i = 0; i < ARRAY_SIZE(choices); i++){
sprintf(buffer, stringFormat, choices[i]);
result = SendMessageA(hCombo, CB_ADDSTRING, 0, (LPARAM)buffer);
ok(result == i,
@@ -709,7 +709,7 @@ static void test_listbox_size(DWORD style)
{10, 100, TRUE},
};
- for(test = 0; test < sizeof(info_height) / sizeof(info_height[0]); test++)
+ for(test = 0; test < ARRAY_SIZE(info_height); test++)
{
const struct list_size_info *info_test = &info_height[test];
int height_item; /* Height of a list item */
diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index 3d56815848..8404ee71ab 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -2533,7 +2533,7 @@ static void test_PrivateExtractIcons(void)
static const test_icon_entries_t icon_desc[] = {{0,0,TRUE}, {16,16,TRUE}, {32,32}, {64,64,TRUE}};
- create_ico_file("extract.ico", icon_desc, sizeof(icon_desc)/sizeof(*icon_desc));
+ create_ico_file("extract.ico", icon_desc, ARRAY_SIZE(icon_desc));
ret = PrivateExtractIconsA("extract.ico", 0, 32, 32, &icon, NULL, 1, 0);
ok(ret == 1, "PrivateExtractIconsA returned %u\n", ret);
diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index d63a0f65aa..eed2ac437e 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -2396,7 +2396,7 @@ static WCHAR test_cmd_w_to_w[][32] = {
{ 0x4efa, 0x4efc, 0x0061, 0x4efe, 0 }, /* some Chinese chars */
{ 0x0061, 0x0062, 0x0063, 0x9152, 0 }, /* Chinese with latin characters begin */
};
-static const int nb_callbacks = 5 + sizeof(test_cmd_w_to_w)/sizeof(test_cmd_w_to_w[0]);
+static const int nb_callbacks = 5 + ARRAY_SIZE(test_cmd_w_to_w);
static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV hconv,
HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
@@ -2480,7 +2480,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
size_a = strlen(test_cmd_a_to_a) + 1;
size_w = (lstrlenW(cmd_w) + 1) * sizeof(WCHAR);
size_a_to_w = MultiByteToWideChar( CP_ACP, 0, test_cmd_a_to_a, -1, test_cmd_a_to_w,
- sizeof(test_cmd_a_to_w)/sizeof(WCHAR) ) * sizeof(WCHAR);
+ ARRAY_SIZE(test_cmd_a_to_w)) * sizeof(WCHAR);
size_w_to_a = WideCharToMultiByte( CP_ACP, 0, cmd_w, -1,
test_cmd_w_to_a, sizeof(test_cmd_w_to_a), NULL, NULL );
switch (str_index)
@@ -2528,7 +2528,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
/* double A->W mapping */
/* NT uses the full size, XP+ only until the first null */
DWORD nt_size = MultiByteToWideChar( CP_ACP, 0, (char *)cmd_w, size_w, test_cmd_a_to_w,
- sizeof(test_cmd_a_to_w)/sizeof(WCHAR) ) * sizeof(WCHAR);
+ ARRAY_SIZE(test_cmd_a_to_w)) * sizeof(WCHAR);
DWORD xp_size = MultiByteToWideChar( CP_ACP, 0, (char *)cmd_w, -1, NULL, 0 ) * sizeof(WCHAR);
ok(size == xp_size || broken(size == nt_size) ||
broken(str_index == 4 && IsDBCSLeadByte(cmd_w[0])) /* East Asian */,
@@ -2554,7 +2554,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
{
todo_wine ok(size == size_w, "Wrong size %d expected %d, msg_index=%d\n", size, size_w, msg_index);
MultiByteToWideChar(CP_ACP, 0, test_cmd_w_to_a, size_w, test_cmd_a_to_w,
- sizeof(test_cmd_a_to_w)/sizeof(WCHAR));
+ ARRAY_SIZE(test_cmd_a_to_w));
todo_wine ok(!lstrcmpW((WCHAR*)buffer, cmd_w),
"Expected %s got %s, msg_index=%d\n", wine_dbgstr_w(cmd_w), wine_dbgstr_w((WCHAR *)buffer), msg_index);
}
@@ -2562,7 +2562,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
{
todo_wine ok(size == size_w, "Wrong size %d expected %d, msg_index=%d\n", size, size_w, msg_index);
MultiByteToWideChar(CP_ACP, 0, test_cmd_w_to_a, size_w, test_cmd_a_to_w,
- sizeof(test_cmd_a_to_w)/sizeof(WCHAR));
+ ARRAY_SIZE(test_cmd_a_to_w));
if (!is_cjk())
todo_wine ok(!lstrcmpW((WCHAR*)buffer, test_cmd_a_to_w), "Expected %s, got %s, msg_index=%d\n",
wine_dbgstr_w(test_cmd_a_to_w), wine_dbgstr_w((WCHAR*)buffer), msg_index);
@@ -2663,7 +2663,7 @@ static void test_end_to_end_client(BOOL type_a)
err = DdeGetLastError(client_pid);
ok(err == DMLERR_NO_ERROR, "wrong dde error %x\n", err);
- for (i = 0; i < sizeof(test_cmd_w_to_w)/sizeof(test_cmd_w_to_w[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_cmd_w_to_w); i++)
{
hdata = DdeClientTransaction((LPBYTE)test_cmd_w_to_w[i],
(lstrlenW(test_cmd_w_to_w[i]) + 1) * sizeof(WCHAR),
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index ab3eec88bc..807a85b4ea 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -161,7 +161,7 @@ static BOOL CreateWindows (HINSTANCE hinst)
*/
if (p->id >= numwnds)
{
- if (p->id >= sizeof(hwnd)/sizeof(hwnd[0]))
+ if (p->id >= ARRAY_SIZE(hwnd))
{
trace ("Control %ld is out of range\n", p->id);
return FALSE;
@@ -1045,7 +1045,7 @@ static void test_GetDlgItemText(void)
BOOL ret;
strcpy(string, "Overwrite Me");
- ret = GetDlgItemTextA(NULL, 0, string, sizeof(string)/sizeof(string[0]));
+ ret = GetDlgItemTextA(NULL, 0, string, ARRAY_SIZE(string));
ok(!ret, "GetDlgItemText(NULL) shouldn't have succeeded\n");
ok(string[0] == '\0' || broken(!strcmp(string, "Overwrite Me")),
@@ -1461,7 +1461,7 @@ static INT_PTR CALLBACK test_aw_conversion_dlgproc(HWND hdlg, UINT msg, WPARAM w
(BYTE)buff[0], (BYTE)buff[1], len);
memset(buffW, 0xff, sizeof(buffW));
- len = GetWindowTextW(hdlg, buffW, sizeof(buffW)/sizeof(buffW[0]));
+ len = GetWindowTextW(hdlg, buffW, ARRAY_SIZE(buffW));
ok(buffW[0] == 'W' && buffW[1] == 0xffff && len == 0, "Unexpected window text %#x, %#x, len %d\n",
buffW[0], buffW[1], len);
@@ -1567,7 +1567,7 @@ static INT_PTR CALLBACK test_aw_conversion_dlgproc2(HWND hdlg, UINT msg, WPARAM
ok(!strcmp(buff, testtext) && len == 0, "Unexpected window text %s, len %d\n", buff, len);
memset(buffW, 0xff, sizeof(buffW));
- len = GetWindowTextW(hdlg, buffW, sizeof(buffW)/sizeof(buffW[0]));
+ len = GetWindowTextW(hdlg, buffW, ARRAY_SIZE(buffW));
ok(buffW[0] == 0 && buffW[1] == 0xffff && len == 0, "Unexpected window text %#x, %#x, len %d\n",
buffW[0], buffW[1], len);
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index 01418bf551..00c05fdef0 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -2956,7 +2956,7 @@ static void test_EM_GETLINE(void)
hwnd[0] = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
hwnd[1] = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
- for (i = 0; i < sizeof(hwnd)/sizeof(hwnd[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(hwnd); i++)
{
static const WCHAR strW[] = {'t','e','x','t',0};
static const char *str = "text";
@@ -2984,13 +2984,13 @@ static void test_EM_GETLINE(void)
ok(!strcmp(buff, str), "Unexpected line data %s.\n", buff);
memset(buffW, 0, sizeof(buffW));
- *(WORD *)buffW = sizeof(buffW)/sizeof(buffW[0]);
+ *(WORD *)buffW = ARRAY_SIZE(buffW);
r = SendMessageW(hwnd[i], EM_GETLINE, 0, (LPARAM)buffW);
ok(r == lstrlenW(strW), "Failed to get a line %d.\n", r);
ok(!lstrcmpW(buffW, strW), "Unexpected line data %s.\n", wine_dbgstr_w(buffW));
memset(buffW, 0, sizeof(buffW));
- *(WORD *)buffW = sizeof(buffW)/sizeof(buffW[0]);
+ *(WORD *)buffW = ARRAY_SIZE(buffW);
r = SendMessageW(hwnd[i], EM_GETLINE, 1, (LPARAM)buffW);
ok(r == lstrlenW(strW), "Failed to get a line %d.\n", r);
ok(!lstrcmpW(buffW, strW), "Unexpected line data %s.\n", wine_dbgstr_w(buffW));
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 8fa1de23e1..03b84007b1 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -943,8 +943,7 @@ static void test_Input_blackbox(void)
i.u.ki.time = 0;
i.u.ki.dwExtraInfo = 0;
- for (ii = 0; ii < sizeof(sendinput_test)/sizeof(struct sendinput_test_s)-1;
- ii++) {
+ for (ii = 0; ii < ARRAY_SIZE(sendinput_test)-1; ii++) {
GetKeyboardState(ks1);
i.u.ki.wScan = ii+1 /* useful for debugging */;
i.u.ki.dwFlags = sendinput_test[ii].dwFlags;
@@ -1520,12 +1519,12 @@ static void test_GetRawInputDeviceList(void)
ok(ret > 0, "expected non-zero\n");
/* check if variable changes from larger to smaller value */
- devcount = odevcount = sizeof(devices) / sizeof(devices[0]);
+ devcount = odevcount = ARRAY_SIZE(devices);
oret = ret = pGetRawInputDeviceList(devices, &odevcount, sizeof(devices[0]));
ok(ret > 0, "expected non-zero\n");
ok(devcount == odevcount, "expected %d, got %d\n", devcount, odevcount);
devcount = odevcount;
- odevcount = sizeof(devices) / sizeof(devices[0]);
+ odevcount = ARRAY_SIZE(devices);
ret = pGetRawInputDeviceList(NULL, &odevcount, sizeof(devices[0]));
ok(ret == 0, "expected 0, got %d\n", ret);
ok(odevcount == oret, "expected %d, got %d\n", oret, odevcount);
@@ -1567,7 +1566,7 @@ static void test_key_map(void)
"Scan code -> vKey = %x (not VK_RSHIFT)\n", kR);
/* test that MAPVK_VSC_TO_VK prefers the non-numpad vkey if there's ambiguity */
- for (i = 0; i < sizeof(numpad_collisions)/sizeof(numpad_collisions[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(numpad_collisions); i++)
{
UINT numpad_scan = MapVirtualKeyExA(numpad_collisions[i][0], MAPVK_VK_TO_VSC, kl);
UINT other_scan = MapVirtualKeyExA(numpad_collisions[i][1], MAPVK_VK_TO_VSC, kl);
@@ -1665,7 +1664,7 @@ static void test_ToUnicode(void)
"ToUnicode didn't null-terminate the buffer when there was room.\n");
}
- for (i = 0; i < sizeof(utests) / sizeof(utests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(utests); i++)
{
UINT vk = utests[i].vk, mod = utests[i].modifiers, scan;
@@ -1808,7 +1807,7 @@ static void test_key_names(void)
ok( buffer[0] == 0, "wrong string '%s'\n", buffer );
memset( bufferW, 0xcc, sizeof(bufferW) );
- ret = GetKeyNameTextW( lparam, bufferW, sizeof(bufferW)/sizeof(WCHAR) );
+ ret = GetKeyNameTextW( lparam, bufferW, ARRAY_SIZE(bufferW));
ok( ret > 0, "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
ok( ret == lstrlenW(bufferW), "wrong len %u for %s\n", ret, wine_dbgstr_w(bufferW) );
diff --git a/dlls/user32/tests/listbox.c b/dlls/user32/tests/listbox.c
index 88d3adb728..c6edc76ea2 100644
--- a/dlls/user32/tests/listbox.c
+++ b/dlls/user32/tests/listbox.c
@@ -51,7 +51,7 @@ static int strcmp_aw(LPCWSTR strw, const char *stra)
WCHAR buf[1024];
if (!stra) return 1;
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index 0f6e8618a6..7f338ce9b1 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -668,7 +668,7 @@ static void test_menu_ownerdraw(void)
ok( ret, "AppendMenu failed for %d\n", k-1);
}
MOD_maxid = k-1;
- assert( k <= sizeof(MOD_rc)/sizeof(RECT));
+ assert( k <= ARRAY_SIZE(MOD_rc));
/* display the menu */
TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
@@ -986,14 +986,14 @@ static void test_menu_bmp_and_string(void)
for( ispop=1; ispop >= 0; ispop--){
static SIZE bmsizes[]= {
{10,10},{38,38},{1,30},{55,5}};
- for( szidx=0; szidx < sizeof( bmsizes) / sizeof( SIZE); szidx++) {
+ for( szidx=0; szidx < ARRAY_SIZE(bmsizes); szidx++) {
HBITMAP hbm = CreateBitmap( bmsizes[szidx].cx, bmsizes[szidx].cy,1,1,bmfill);
HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, HBMMENU_POPUP_CLOSE, NULL };
ok( hbm != 0, "CreateBitmap failed err %d\n", GetLastError());
- for( txtidx = 0; txtidx < sizeof(MOD_txtsizes)/sizeof(MOD_txtsizes[0]); txtidx++) {
+ for( txtidx = 0; txtidx < ARRAY_SIZE(MOD_txtsizes); txtidx++) {
for( hassub = 0; hassub < 2 ; hassub++) { /* add submenu item */
for( mnuopt = 0; mnuopt < 3 ; mnuopt++){ /* test MNS_NOCHECK/MNS_CHECKORBMP */
- for( bmpidx = 0; bmpidx <sizeof(bitmaps)/sizeof(HBITMAP); bmpidx++) {
+ for( bmpidx = 0; bmpidx <ARRAY_SIZE(bitmaps); bmpidx++) {
/* no need to test NULL bitmaps of several sizes */
if( !bitmaps[bmpidx] && szidx > 0) continue;
/* the HBMMENU_POPUP not to test for menu bars */
@@ -2757,9 +2757,8 @@ static void test_menu_resource_layout(void)
ok(ret, "AppendMenu failed\n");
count = GetMenuItemCount(hmenu);
- ok(count == sizeof(menu_data)/sizeof(menu_data[0]),
- "expected %u menu items, got %u\n",
- (UINT)(sizeof(menu_data)/sizeof(menu_data[0])), count);
+ ok(count == ARRAY_SIZE(menu_data), "expected %u menu items, got %u\n",
+ (UINT) ARRAY_SIZE(menu_data), count);
for (i = 0; i < count; i++)
{
@@ -2978,9 +2977,9 @@ static void test_InsertMenu(void)
};
HMENU hmenu;
-#define create_menu(a) create_menu_from_data((a), sizeof(a)/sizeof((a)[0]))
-#define create_menuitem(a) create_menuitem_from_data((a), sizeof(a)/sizeof((a)[0]))
-#define compare_menu(h, a) compare_menu_data((h), (a), sizeof(a)/sizeof((a)[0]))
+#define create_menu(a) create_menu_from_data((a), ARRAY_SIZE(a))
+#define create_menuitem(a) create_menuitem_from_data((a), ARRAY_SIZE(a))
+#define compare_menu(h, a) compare_menu_data((h), (a), ARRAY_SIZE(a))
hmenu = create_menu(in1);
compare_menu(hmenu, out1);
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 4d7b020e14..f4c1a4b17c 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -398,7 +398,7 @@ static void test_monitors(void)
/* tests for cbSize in MONITORINFO */
monitor = pMonitorFromWindow( 0, MONITOR_DEFAULTTOPRIMARY );
- for (i = 0; i < (sizeof(testdatami) / sizeof(testdatami[0])); i++)
+ for (i = 0; i < ARRAY_SIZE(testdatami); i++)
{
memset( &mi, 0, sizeof(mi) );
mi.cbSize = testdatami[i].cbSize;
@@ -420,7 +420,7 @@ static void test_monitors(void)
}
/* tests for cbSize in MONITORINFOEXA */
- for (i = 0; i < (sizeof(testdatamiexa) / sizeof(testdatamiexa[0])); i++)
+ for (i = 0; i < ARRAY_SIZE(testdatamiexa); i++)
{
memset( &miexa, 0, sizeof(miexa) );
miexa.cbSize = testdatamiexa[i].cbSize;
@@ -433,7 +433,7 @@ static void test_monitors(void)
}
/* tests for cbSize in MONITORINFOEXW */
- for (i = 0; i < (sizeof(testdatamiexw) / sizeof(testdatamiexw[0])); i++)
+ for (i = 0; i < ARRAY_SIZE(testdatamiexw); i++)
{
memset( &miexw, 0, sizeof(miexw) );
miexw.cbSize = testdatamiexw[i].cbSize;
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index a0f2cbeef0..1f2c0dd1f7 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -4966,7 +4966,7 @@ static void test_WM_DEVICECHANGE(HWND hwnd)
DBT_DEVICETYPESPECIFIC,
DBT_CUSTOMEVENT};
- for (i = 0; i < sizeof(wparams)/sizeof(wparams[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(wparams); i++)
{
SetLastError(0xdeadbeef);
ret = PostMessageA(hwnd, WM_DEVICECHANGE, wparams[i], 0);
@@ -6273,7 +6273,7 @@ static void test_button_messages(void)
hfont2 = CreateFontIndirectA(&logfont);
ok(hfont2 != NULL, "Failed to create Tahoma font\n");
- for (i = 0; i < sizeof(button)/sizeof(button[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(button); i++)
{
MSG msg;
DWORD style, state;
@@ -6686,7 +6686,7 @@ static void test_static_messages(void)
subclass_static();
- for (i = 0; i < sizeof(static_ctrl)/sizeof(static_ctrl[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(static_ctrl); i++)
{
hwnd = CreateWindowExA(0, "my_static_class", "test", static_ctrl[i].style | WS_POPUP,
0, 0, 50, 14, 0, 0, 0, NULL);
@@ -9729,13 +9729,13 @@ static void test_timers_no_wnd(void)
win_skip("SetCoalescableTimer not available.\n");
/* Check what happens when we're running out of timers */
- for (i=0; i<sizeof(ids)/sizeof(ids[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(ids); i++)
{
SetLastError(0xdeadbeef);
ids[i] = SetTimer(NULL, 0, USER_TIMER_MAXIMUM, tfunc);
if (!ids[i]) break;
}
- ok(i != sizeof(ids)/sizeof(ids[0]), "all timers were created successfully\n");
+ ok(i != ARRAY_SIZE(ids), "all timers were created successfully\n");
ok(GetLastError()==ERROR_NO_MORE_USER_HANDLES || broken(GetLastError()==0xdeadbeef),
"GetLastError() = %d\n", GetLastError());
while (i > 0) KillTimer(NULL, ids[--i]);
@@ -10113,7 +10113,7 @@ static void test_winevents(void)
ok_sequence(WmEmptySeq, "empty notify winevents", FALSE);
}
- for (i = 0; i < sizeof(WmWinEventsSeq)/sizeof(WmWinEventsSeq[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(WmWinEventsSeq); i++)
pNotifyWinEvent(events[i].message, hwnd, events[i].wParam, events[i].lParam);
ok_sequence(WmWinEventsSeq, "notify winevents", FALSE);
@@ -12797,7 +12797,7 @@ static void test_ShowWindow(void)
ok(EqualRect(&win_rc, &wp.rcNormalPosition), "expected %s got %s\n", wine_dbgstr_rect(&win_rc),
wine_dbgstr_rect(&wp.rcNormalPosition));
- for (i = 0; i < sizeof(sw)/sizeof(sw[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(sw); i++)
{
static const char * const sw_cmd_name[13] =
{
@@ -14660,20 +14660,20 @@ static void test_defwinproc(void)
flush_events();
buffA[0] = 0;
- GetWindowTextA(hwnd, buffA, sizeof(buffA)/sizeof(*buffA));
+ GetWindowTextA(hwnd, buffA, ARRAY_SIZE(buffA));
ok(!strcmp(buffA, "test_defwndproc"), "unexpected window text, %s\n", buffA);
/* Zero high word of the lParam */
res = DefWindowProcA(hwnd, WM_SETTEXT, 0, 0x1234);
ok(res == 0, "WM_SETTEXT was expected to fail, %ld\n", res);
- GetWindowTextA(hwnd, buffA, sizeof(buffA)/sizeof(*buffA));
+ GetWindowTextA(hwnd, buffA, ARRAY_SIZE(buffA));
ok(!strcmp(buffA, "test_defwndproc"), "unexpected window text, %s\n", buffA);
res = DefWindowProcW(hwnd, WM_SETTEXT, 0, 0x1234);
ok(res == 0, "WM_SETTEXT was expected to fail, %ld\n", res);
- GetWindowTextA(hwnd, buffA, sizeof(buffA)/sizeof(*buffA));
+ GetWindowTextA(hwnd, buffA, ARRAY_SIZE(buffA));
ok(!strcmp(buffA, "test_defwndproc"), "unexpected window text, %s\n", buffA);
GetCursorPos(&pos);
@@ -14933,7 +14933,7 @@ static void test_PostMessage(void)
PostMessageA(hwnd, WM_USER+1, 0x1234, 0x5678);
PostMessageA(0, WM_USER+2, 0x5678, 0x1234);
- for (i = 0; i < sizeof(data)/sizeof(data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(data); i++)
{
memset(&msg, 0xab, sizeof(msg));
ret = PeekMessageA(&msg, data[i].hwnd, 0, 0, PM_NOREMOVE);
@@ -14991,7 +14991,7 @@ static void test_broadcast(void)
oldproc = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)broadcast_test_proc);
SetWindowLongPtrA(hwnd, GWLP_USERDATA, (LONG_PTR)oldproc);
- for (i = 0; i < sizeof(messages)/sizeof(messages[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(messages); i++)
{
BOOL ret;
MSG msg;
@@ -15321,7 +15321,7 @@ static void test_WaitForInputIdle( char *argv0 )
thread = CreateThread( NULL, 0, wait_idle_thread, NULL, 0, &id );
- for (i = 0; i < sizeof(wait_idle_expect)/sizeof(wait_idle_expect[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(wait_idle_expect); i++)
{
ResetEvent( start_event );
ResetEvent( end_event );
diff --git a/dlls/user32/tests/resource.c b/dlls/user32/tests/resource.c
index 2388adb64f..5d4c4e2f96 100644
--- a/dlls/user32/tests/resource.c
+++ b/dlls/user32/tests/resource.c
@@ -50,7 +50,7 @@ static void test_LoadStringW(void)
win_skip( "LoadStringW does not return a pointer to the resource\n" );
return;
}
- length2 = LoadStringW(hInst, 2, returnedstringw, sizeof(returnedstringw) /sizeof(WCHAR)); /* get resource string */
+ length2 = LoadStringW(hInst, 2, returnedstringw, ARRAY_SIZE(returnedstringw)); /* get resource string */
ok(length2 > 0, "LoadStringW failed to load resource 2, ret %d, err %d\n", length2, GetLastError());
ok(length1 == length2, "LoadStringW returned different values dependent on buflen. ret1 %d, ret2 %d\n",
length1, length2);
@@ -93,7 +93,7 @@ static void test_LoadStringA (void)
int ret, ret2;
assert (sizeof str < sizeof buf);
- for (i = 0; i < sizeof tests / sizeof tests[0]; i++) {
+ for (i = 0; i < ARRAY_SIZE(tests); i++) {
const unsigned int bufsiz = tests[i].bufsiz;
const unsigned int expected = tests[i].expected;
const int len = LoadStringA (hInst, 0, buf, bufsiz);
diff --git a/dlls/user32/tests/scroll.c b/dlls/user32/tests/scroll.c
index 0bda5dd0f4..291d11af0f 100644
--- a/dlls/user32/tests/scroll.c
+++ b/dlls/user32/tests/scroll.c
@@ -514,7 +514,7 @@ static void scrollbar_test_init(void)
wc.lpfnWndProc = scroll_init_proc;
RegisterClassExA(&wc);
- for(i = 0; i < sizeof style / sizeof style[0]; i++)
+ for(i = 0; i < ARRAY_SIZE(style); i++)
{
/* need not to destroy these windows due creation abort */
CreateWindowExA(0, cls_name, NULL, style[i],
diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index ce056e9160..3db058f950 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -710,7 +710,7 @@ static void test_SPI_SETMOUSE( void ) /* 4 */
POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
- int nchange = sizeof( req_change ) / sizeof( POINT );
+ int nchange = ARRAY_SIZE(req_change);
trace("testing SPI_{GET,SET}MOUSE\n");
SetLastError(0xdeadbeef);
@@ -875,7 +875,7 @@ static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -964,7 +964,7 @@ static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -1001,7 +1001,7 @@ static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -1042,7 +1042,7 @@ static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT delay;
char buf[10];
@@ -1143,7 +1143,7 @@ static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
UINT regval;
@@ -1187,7 +1187,7 @@ static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -1223,7 +1223,7 @@ static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
old_width = GetSystemMetrics( SM_CXDOUBLECLK );
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
char buf[10];
@@ -1257,7 +1257,7 @@ static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
old_height = GetSystemMetrics( SM_CYDOUBLECLK );
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
char buf[10];
@@ -1347,7 +1347,7 @@ static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
old_b = GetSystemMetrics( SM_SWAPBUTTON );
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
SetLastError(0xdeadbeef);
rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
@@ -1402,7 +1402,7 @@ static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -1925,7 +1925,7 @@ static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -1962,7 +1962,7 @@ static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
BOOL v;
@@ -1997,7 +1997,7 @@ static void test_SPI_SETSCREENREADER( void ) /* 71 */
if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
BOOL v;
@@ -2036,7 +2036,7 @@ static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &old_contrast, 0 );
SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &old_orient, 0 );
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -2113,7 +2113,7 @@ static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -2151,7 +2151,7 @@ static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -2189,7 +2189,7 @@ static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
@@ -2224,7 +2224,7 @@ static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2261,7 +2261,7 @@ static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2302,7 +2302,7 @@ static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2341,7 +2341,7 @@ static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2380,7 +2380,7 @@ static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2419,7 +2419,7 @@ static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
return;
- for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+ for (i=0;i<ARRAY_SIZE(vals);i++)
{
UINT v;
char buf[10];
@@ -2489,7 +2489,7 @@ static void test_WM_DISPLAYCHANGE(void)
displaychange_sem = CreateSemaphoreW(NULL, 0, 1, NULL);
- for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(test_bpps); i++) {
last_bpp = -1;
memset(&mode, 0, sizeof(mode));
diff --git a/dlls/user32/tests/text.c b/dlls/user32/tests/text.c
index c5bcd50716..359721fcd9 100644
--- a/dlls/user32/tests/text.c
+++ b/dlls/user32/tests/text.c
@@ -765,7 +765,7 @@ static void test_CharToOem_OemToChar(void)
char oem;
WCHAR uni, expect;
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
const char *expected = tests[i].ret ? helloWorld : "";
const char *src = tests[i].src ? helloWorld : NULL;
@@ -792,7 +792,7 @@ static void test_CharToOem_OemToChar(void)
ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
}
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
const char *expected = tests[i].ret ? helloWorld : "";
const WCHAR *src = tests[i].src ? helloWorldW : NULL;
@@ -804,12 +804,12 @@ static void test_CharToOem_OemToChar(void)
ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
memset(buf, 0, sizeof(buf));
- ret = CharToOemBuffW(src, dst, sizeof(helloWorldW)/sizeof(WCHAR));
+ ret = CharToOemBuffW(src, dst, ARRAY_SIZE(helloWorldW));
ok(ret == tests[i].ret, "test %d: expected %d, got %d\n", i, tests[i].ret, ret);
ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
}
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
const WCHAR *expected = tests[i].ret ? helloWorldW : emptyW;
const char *src = tests[i].src ? helloWorld : NULL;
diff --git a/dlls/user32/tests/uitools.c b/dlls/user32/tests/uitools.c
index b52fe3a03a..07cf776a95 100644
--- a/dlls/user32/tests/uitools.c
+++ b/dlls/user32/tests/uitools.c
@@ -175,7 +175,7 @@ static void test_IsRectEmpty(void)
{{-109, -107, -103, -101}, FALSE},
};
- for (i = 0; i < sizeof(rtest)/sizeof(rtest[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(rtest); i++) {
ret = IsRectEmpty(&rtest[i].rect);
ok(ret == rtest[i].ret, "Test %d: IsRectEmpty returned %s for %s\n", i,
ret ? "TRUE" : "FALSE", wine_dbgstr_rect(&rtest[i].rect));
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 1f10d66dcd..d7f8843c98 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -2158,7 +2158,7 @@ static void test_mdi(void)
client_cs.hWindowMenu = 0;
client_cs.idFirstChild = 1;
- for (i = 0; i < sizeof(style)/sizeof(style[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(style); i++)
{
SCROLLINFO si;
BOOL ret, gotit;
@@ -6390,7 +6390,7 @@ static void test_set_window_style(void)
cls.lpszClassName = "TestSetWindowStylesClass";
ok(RegisterClassA(&cls), "RegisterClass failed\n");
- for (i = 0; i < sizeof(tests) / sizeof(*tests); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
expected_style = tests[i].style;
if (tests[i].creation_style & WS_MINIMIZE)
@@ -6857,7 +6857,7 @@ static void test_gettext(void)
num_gettext_msgs = 0;
memset( bufW, 0xcc, sizeof(bufW) );
g_wm_gettext_override.buffW = bufW;
- buf_len = GetWindowTextW( hwnd2, bufW, sizeof(bufW)/sizeof(WCHAR) );
+ buf_len = GetWindowTextW( hwnd2, bufW, ARRAY_SIZE(bufW));
ok( buf_len == 0, "got %d\n", buf_len );
ok( *bufW == 0, "got %x\n", *bufW );
ok( num_gettext_msgs == 1, "got %u WM_GETTEXT messages\n", num_gettext_msgs );
@@ -6955,7 +6955,7 @@ static void test_gettext(void)
memset( bufW, 0x1c, sizeof(bufW) );
g_wm_gettext_override.dont_terminate = TRUE;
- buf_len = GetWindowTextW( hwnd, bufW, sizeof(bufW)/sizeof(bufW[0]) );
+ buf_len = GetWindowTextW( hwnd, bufW, ARRAY_SIZE(bufW));
ok( buf_len == 4, "Unexpected text length, %d\n", buf_len );
ok( !memcmp(bufW, textW, 4 * sizeof(WCHAR)), "Unexpected window text, %s\n", wine_dbgstr_w(bufW) );
ok( bufW[4] == 0, "Unexpected buffer contents, %#x\n", bufW[4] );
@@ -6974,7 +6974,7 @@ static void test_gettext(void)
memset( bufW, 0x1c, sizeof(bufW) );
g_wm_gettext_override.dont_terminate = TRUE;
- buf_len = GetWindowTextW( hwnd2, bufW, sizeof(bufW)/sizeof(bufW[0]) );
+ buf_len = GetWindowTextW( hwnd2, bufW, ARRAY_SIZE(bufW));
ok( buf_len == 4, "Unexpected text length, %d\n", buf_len );
ok( !memcmp(bufW, textW, 4 * sizeof(WCHAR)), "Unexpected window text, %s\n", wine_dbgstr_w(bufW) );
ok( bufW[4] == 0x1c1c, "Unexpected buffer contents, %#x\n", bufW[4] );
@@ -7399,7 +7399,7 @@ static void test_hwnd_message(void)
if (parent) ok( !IsWindowVisible( parent ), "HWND_MESSAGE parent is visible\n" );
/* GetWindowLong */
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
SetLastError( 0xdeadbeef );
result = GetWindowLongPtrW( parent, tests[i].offset );
@@ -7679,14 +7679,14 @@ static void test_fullscreen(void)
cls.lpszClassName = "fullscreen_class";
RegisterClassA(&cls);
- for (i = 0; i < sizeof(t_style)/sizeof(t_style[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(t_style); i++)
{
DWORD style, ex_style;
/* avoid a WM interaction */
assert(!(t_style[i] & WS_VISIBLE));
- for (j = 0; j < sizeof(t_ex_style)/sizeof(t_ex_style[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(t_ex_style); j++)
{
int fixup;
@@ -8430,7 +8430,7 @@ static void create_window_tree(HWND parent, HWND *window, int size)
memset(window, 0, size * sizeof(window[0]));
pos = 0;
- for (i = 0; i < sizeof(style)/sizeof(style[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(style); i++)
{
assert(pos < size);
window[pos] = CreateWindowExA(0, "my_window", NULL, style[i] | WS_CHILD,
@@ -8577,7 +8577,7 @@ static void test_child_window_from_point(void)
ok(parent != 0, "CreateWindowEx failed\n");
trace("parent %p\n", parent);
- create_window_tree(parent, window, sizeof(window)/sizeof(window[0]));
+ create_window_tree(parent, window, ARRAY_SIZE(window));
found_invisible = 0;
found_disabled = 0;
@@ -8586,14 +8586,14 @@ static void test_child_window_from_point(void)
found_extransparent = 0;
/* FIXME: also test WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx */
- for (i = 0; i < sizeof(real_child_pos)/sizeof(real_child_pos[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(real_child_pos); i++)
{
struct window_attributes attrs;
pt.x = pt.y = 50;
hwnd = RealChildWindowFromPoint(parent, pt);
ok(hwnd != 0, "RealChildWindowFromPoint failed\n");
- ret = window_to_index(hwnd, window, sizeof(window)/sizeof(window[0]));
+ ret = window_to_index(hwnd, window, ARRAY_SIZE(window));
/* FIXME: remove once Wine is fixed */
todo_wine_if (ret != real_child_pos[i])
ok(ret == real_child_pos[i], "expected %d, got %d\n", real_child_pos[i], ret);
@@ -9782,7 +9782,7 @@ static void test_LockWindowUpdate(HWND parent)
UpdateWindow(parent);
flush_events(TRUE);
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
HDC hdc;
POINT p = {10, 10};
@@ -10047,7 +10047,7 @@ static void test_desktop( void )
DWORD_PTR result;
int i;
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
SetLastError( 0xdeadbeef );
result = GetWindowLongPtrW( desktop, tests[i].offset );
@@ -10143,7 +10143,7 @@ static void test_topmost(void)
ok(!is_topmost(hwnd), "hwnd %p topmost state is wrong\n", hwnd);
ok(!is_topmost(hwnd2), "hwnd %p topmost state is wrong\n", hwnd2);
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10183,7 +10183,7 @@ todo_wine
ok(!is_topmost(hwnd2), "hwnd %p topmost state is wrong\n", hwnd2);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, 0, hwnd2, owner, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10197,7 +10197,7 @@ todo_wine
ok(!is_topmost(hwnd2), "hwnd %p topmost state is wrong\n", hwnd2);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, 0, hwnd2, owner, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10218,7 +10218,7 @@ if (!is_wine) /* FIXME: remove once Wine is fixed */
ok(!is_topmost(hwnd2), "hwnd %p topmost state is wrong\n", hwnd2);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, 0, hwnd2, owner, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
hwnd_child2 = create_tool_window(WS_VISIBLE|WS_POPUP, hwnd);
ok(hwnd_child2 != 0, "Failed to create popup window (%d)\n", GetLastError());
@@ -10268,7 +10268,7 @@ todo_wine
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
check_z_order(hwnd_child, hwnd_child2, 0, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10292,7 +10292,7 @@ todo_wine
ok(!is_topmost(hwnd_grandchild), "hwnd %p topmost state is wrong\n", hwnd_grandchild);
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
check_z_order(hwnd_child, hwnd_child2, 0, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10316,7 +10316,7 @@ todo_wine
ok(!is_topmost(hwnd_grandchild), "hwnd %p topmost state is wrong\n", hwnd_grandchild);
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
check_z_order(hwnd_child, hwnd_child2, 0, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd_child, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10350,7 +10350,7 @@ todo_wine
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
check_z_order(hwnd_child, hwnd_child2, 0, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd_child, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10373,7 +10373,7 @@ todo_wine
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
check_z_order(hwnd_child, hwnd_child2, 0, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd_grandchild, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10394,7 +10394,7 @@ if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd_child, 0, hwnd_child2, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd_child, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10418,7 +10418,7 @@ if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, 0, hwnd2, owner, FALSE);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd_child, 0, hwnd_child2, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
swp_after(hwnd_child, HWND_TOPMOST);
ok(!is_topmost(owner), "hwnd %p topmost state is wrong\n", owner);
@@ -10442,7 +10442,7 @@ if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd, hwnd2, 0, owner, FALSE);
if (!is_wine) /* FIXME: remove once Wine is fixed */
check_z_order(hwnd_child, 0, hwnd_child2, hwnd, FALSE);
- reset_window_state(state, sizeof(state)/sizeof(state[0]));
+ reset_window_state(state, ARRAY_SIZE(state));
DestroyWindow(hwnd_grandchild);
DestroyWindow(hwnd_child);
diff --git a/dlls/user32/tests/wsprintf.c b/dlls/user32/tests/wsprintf.c
index f0e80b2ad6..f79b6306a7 100644
--- a/dlls/user32/tests/wsprintf.c
+++ b/dlls/user32/tests/wsprintf.c
@@ -66,7 +66,7 @@ static void wsprintfATest(void)
win_skip( "I64 formats not supported\n" );
return;
}
- for (i = 0; i < sizeof(i64_formats)/sizeof(i64_formats[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(i64_formats); i++)
{
rc = wsprintfA(buf, i64_formats[i].fmt, i64_formats[i].value);
ok(rc == strlen(i64_formats[i].res), "%u: wsprintfA length failure: rc=%d\n", i, rc);
@@ -98,10 +98,10 @@ static void wsprintfWTest(void)
win_skip( "I64 formats not supported\n" );
return;
}
- for (i = 0; i < sizeof(i64_formats)/sizeof(i64_formats[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(i64_formats); i++)
{
- MultiByteToWideChar( CP_ACP, 0, i64_formats[i].fmt, -1, fmt, sizeof(fmt)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, i64_formats[i].res, -1, res, sizeof(res)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, i64_formats[i].fmt, -1, fmt, ARRAY_SIZE(fmt));
+ MultiByteToWideChar( CP_ACP, 0, i64_formats[i].res, -1, res, ARRAY_SIZE(res));
rc = wsprintfW(buf, fmt, i64_formats[i].value);
ok(rc == lstrlenW(res), "%u: wsprintfW length failure: rc=%d\n", i, rc);
ok(!lstrcmpW(buf, res), "%u: wrong result [%s]\n", i, wine_dbgstr_w(buf));
--
2.14.4
June 28, 2018
[PATCH] user32/tests: Avoid ARRAY_SIZE-like macros
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/user32/tests/monitor.c | 3 +--
dlls/user32/tests/win.c | 15 ++++++---------
2 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index dfdca49e79..4d7b020e14 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -150,7 +150,6 @@ static const struct vid_mode vid_modes_test[] = {
{0, 0, 0, 0, DM_DISPLAYFREQUENCY, 0}
*/
};
-#define vid_modes_cnt (sizeof(vid_modes_test) / sizeof(vid_modes_test[0]))
static void test_ChangeDisplaySettingsEx(void)
{
@@ -237,7 +236,7 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
- for (i = 0; i < vid_modes_cnt; i++)
+ for (i = 0; i < ARRAY_SIZE(vid_modes_test); i++)
{
dm.dmPelsWidth = vid_modes_test[i].w;
dm.dmPelsHeight = vid_modes_test[i].h;
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index ac706aa4bf..1f10d66dcd 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -84,8 +84,6 @@ static const char* szAWRClass = "Winsize";
static HMENU hmenu;
static DWORD our_pid;
-#define COUNTOF(arr) (sizeof(arr)/sizeof(arr[0]))
-
static void dump_minmax_info( const MINMAXINFO *minmax )
{
trace("Reserved=%d,%d MaxSize=%d,%d MaxPos=%d,%d MinTrack=%d,%d MaxTrack=%d,%d\n",
@@ -5289,9 +5287,9 @@ static void test_AWR_window_size(BOOL menu)
/* A exhaustive check of all the styles takes too long
* so just do a (hopefully representative) sample
*/
- for (i = 0; i < COUNTOF(styles); ++i)
+ for (i = 0; i < ARRAY_SIZE(styles); ++i)
test_AWRwindow(szAWRClass, styles[i], 0, menu);
- for (i = 0; i < COUNTOF(exStyles); ++i) {
+ for (i = 0; i < ARRAY_SIZE(exStyles); ++i) {
test_AWRwindow(szAWRClass, WS_POPUP, exStyles[i], menu);
test_AWRwindow(szAWRClass, WS_THICKFRAME, exStyles[i], menu);
}
@@ -5306,13 +5304,13 @@ static void test_AWR_flags(void)
DWORD i, j, k, style, exstyle;
RECT rect, rect2;
- for (i = 0; i < (1 << COUNTOF(styles)); i++)
+ for (i = 0; i < (1 << ARRAY_SIZE(styles)); i++)
{
- for (k = style = 0; k < COUNTOF(styles); k++) if (i & (1 << k)) style |= styles[k];
+ for (k = style = 0; k < ARRAY_SIZE(styles); k++) if (i & (1 << k)) style |= styles[k];
- for (j = 0; j < (1 << COUNTOF(exStyles)); j++)
+ for (j = 0; j < (1 << ARRAY_SIZE(exStyles)); j++)
{
- for (k = exstyle = 0; k < COUNTOF(exStyles); k++) if (j & (1 << k)) exstyle |= exStyles[k];
+ for (k = exstyle = 0; k < ARRAY_SIZE(exStyles); k++) if (j & (1 << k)) exstyle |= exStyles[k];
SetRect( &rect, 100, 100, 200, 200 );
rect2 = rect;
AdjustWindowRectEx( &rect, style, FALSE, exstyle );
@@ -5329,7 +5327,6 @@ static void test_AWR_flags(void)
}
}
}
-#undef COUNTOF
#define SHOWSYSMETRIC(SM) trace(#SM "=%d\n", GetSystemMetrics(SM))
--
2.14.4
June 28, 2018
Re: [PATCH v2 1/4] explorer: Add a private message to notify the graphics driver when activity occurs.
by Zebediah Figura
On 27/06/18 19:43, Alexandre Julliard wrote:
> Zebediah Figura <zfigura(a)codeweavers.com> writes:
>
>> @@ -661,6 +665,11 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
>> }
>> return 0;
>>
>> + case WM_WINE_NOTIFY_ACTIVITY:
>> + if (wine_notify_activity)
>> + wine_notify_activity();
>> + return 0;
>> +
>> default:
>> return DefWindowProcW( hwnd, message, wp, lp );
>> }
>
> I think it would be cleaner to have the drivers wrap the desktop winproc
> so that we don't need to define new driver functions. The Android driver
> already does this.
>
Thanks; I'll look into this.
June 28, 2018
[PATCH] hnetcfg: Store the long path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/apps.c | 14 ++++++++++++--
dlls/hnetcfg/tests/policy.c | 1 +
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
index 69eabd6..21e1007 100644
--- a/dlls/hnetcfg/apps.c
+++ b/dlls/hnetcfg/apps.c
@@ -268,9 +268,9 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
{
fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
UNIVERSAL_NAME_INFOW *info;
+ DWORD sz, longsz;
WCHAR *path;
DWORD res;
- DWORD sz;
FIXME("%p, %s\n", This, debugstr_w(image));
@@ -298,9 +298,19 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
sz = GetFullPathNameW(image, 0, NULL, NULL);
if (!(path = heap_alloc(++sz * sizeof(WCHAR))))
return E_OUTOFMEMORY;
-
GetFullPathNameW(image, sz, path, NULL);
+ longsz = GetLongPathNameW(path, path, sz);
+ if (longsz > sz)
+ {
+ if (!(path = heap_realloc(path, longsz * sizeof(WCHAR))))
+ {
+ heap_free(path);
+ return E_OUTOFMEMORY;
+ }
+ GetLongPathNameW(path, path, longsz);
+ }
+
SysFreeString( This->filename );
This->filename = SysAllocString(path);
heap_free(path);
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index 389be16..4e90ceb 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -140,6 +140,7 @@ static void test_NetFwAuthorizedApplication(void)
SysFreeString(bstr);
GetFullPathNameW(image, ARRAY_SIZE(fullpath), fullpath, NULL);
+ GetLongPathNameW(fullpath, fullpath, ARRAY_SIZE(fullpath));
info = (UNIVERSAL_NAME_INFOW *)&netpath;
sz = sizeof(netpath);
--
2.7.4
June 28, 2018
[PATCH] gdi32: Add DECLSPEC_HOTPATCH to GetDIBits
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
Fixes https://bugs.winehq.org/show_bug.cgi?id=45346
Although this patch fixes the bug in question, Zeb and I would like to
know: Since all exported Windows API functions support hotpatching,[1]
why do we add __attribute__((__ms_hook_prologue__)) attribute to
functions ad hoc instead of making it part of the definitions of
__stdcall and __cdecl in windef.h?
[1] https://blogs.msdn.microsoft.com/oldnewthing/20110921-00/?p=9583
---
dlls/gdi32/dib.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index c7dcdb122c..1312bf0533 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -1208,7 +1208,7 @@ BITMAPINFO *copy_packed_dib( const BITMAPINFO *src_info, UINT usage )
* Success: Number of scan lines copied from bitmap
* Failure: 0
*/
-INT WINAPI GetDIBits(
+INT WINAPI DECLSPEC_HOTPATCH GetDIBits(
HDC hdc, /* [in] Handle to device context */
HBITMAP hbitmap, /* [in] Handle to bitmap */
UINT startscan, /* [in] First scan line to set in dest bitmap */
--
2.18.0
June 28, 2018
[PATCH] configure: Allow building bcrypt with GnuTLS support on macOS.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
configure.ac | 1 -
1 file changed, 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 9c38cfb376..d10acde146 100644
--- a/configure.ac
+++ b/configure.ac
@@ -789,7 +789,6 @@ case $host_os in
LIBS="$LIBS $SECURITY_LIBS"
AC_CHECK_FUNCS(SSLCopyPeerCertificates)
LIBS="$ac_save_LIBS"
- with_gnutls=${with_gnutls:-no}
fi
if test "$ac_cv_header_CoreAudio_CoreAudio_h" = "yes" -a "$ac_cv_header_AudioUnit_AudioUnit_h" = "yes"
then
--
2.11.0
June 28, 2018
Seeking for future maintainer of Tea CI
by Qian Hong
Dear folks,
(Long time no see, hey!)
I know many Wine contributors are in WineConf, some of you might even
be missing me <grin>, so it's the perfect time to raise this topic :)
And I know new Wine contributors join the community every year, so I
should introduce a bit about myself ^_^
I'm Qian Hong, a former Wine contributor since 2012. In 2016, I move
my focus from upstream Wine to Tea CI https://tea-ci.org
Tea CI is a *C*ontinuous *I*ntegration platform which supports
building both Linux application and Windows application, it's the only
platform which supports building Windows application without depending
on any Windows License because of the utilizing of Wine. For people
who aren't familiar with fashion words like CI, think about it like
our Wine TestBot, which builds and tests software automatically.
Here are some examples of how people use Tea CI:
https://tea-ci.org/mamedev/mame
https://tea-ci.org/concurrencykit/ck
https://tea-ci.org/Alexpux/MINGW-packages
There are currently 200 registered users of Tea CI, while only a few
of them are active.
I (co)founded Tea CI as a non-profit project for some ambitious goals,
which I'm shy to tell anymore because it doesn't work out. I admit it
is not very successful, it wasn't updated for more than one year,
Msys2/MinGW packages are outdated, Wine compatibility issues are
remaining unfixed, Web UI is not friendly enough, documentation is not
complete, the future is unclear, etc... However, I do appreciate lots
of people who helped Tea CI in many different ways, including but not
limited to Wine/Wine Staging developers, Cygwin/Msys2/GDB developers,
Drone CI developers, Mozilla RR developer, Arch developer, and many
many more.
I was considering shutting down Tea CI because lacking maintenance and
other reasons, however, I received positive feedback from some users:
>>>
XXX (A startup) is happy to cover your server costs as a sponsor. If
it is 98 EUR per month we can cover full cost. Would that help towards
keeping it active?
<<<
>>>
it is very convenient to do windows builds and I would use it
more if it were updated and taken care of. I do have (and had) a few
projects that could use it, some of them were commercial.
<<<
>>>
I think this is one of a few projects providing windows builds
without actual windows server. This alone makes it worth the while.
<<<
>>>
I would be willing to support the project financially (though not the
full amount), if someone would be maintaining and improving it (perhaps
under your supervision?).
<<<
>>>
It's been a solid platform, and even though we only build 'tiny'
builds on a single platform, and not most of the components, we've
done it for practically every commit these last 18 months.
It will be a shame to lose it, and I'm not sure what out-of-the-box
solution would replace it for Msys2/MinGW.
<<<
>>>
We are currently using Tea CI in a major project, ConcurrencyKit. CK
is a very UNIX oriented library, so Tea CI made things very easy.
<<<
To be fair, I should also share negative feedback like:
>>>
I last used TeaCI for about a year starting ~2 years ago, using it
once to twice a week. ultimately, various bugs from ancient Cygwin
versions led me move most of my infrastructure to MSVC and use
AppVeyor. I appreciate all the money and hard work you have put in,
but ultimately, I have no issue if TeaCI shuts down.
<<<
As one might see, it could be a pity if no one maintains Tea CI.
However, due to personal reasons, I'm not able to spend enough time
and energy to improve Tea CI, that's why I am hoping to transfer the
owner of Tea CI. The most challenging part of Tea CI is keeping Wine
compatible with Cygwin/Msys2, which requires experienced Wine
development skills, and most people who have the skill are subscribing
to this list :)
I know looking for future maintainers of Tea CI is much harder than
looking for a job, people who have the skill are likely to have no
time. However, I am still very keen to ask: by any chance, would
anyone be interested in taking a look, or at least raise a discussion
during/after WineConf?
If anyone is interested in a follow up of the discussion, I'm glad to
answer any questions about Tea CI.
Looking forward to hearing from you!
--
Regards,
Qian Hong
June 28, 2018
[PATCH 2/2] inetcpl.cpl: Add partial support for writing DefaultConnectionSettings registry setting
by Piotr Caban
IE 10+ saves connection information in this key. .NET 4.6.2 is using the
key to read proxy settings.
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/inetcpl.cpl/connections.c | 83
+++++++++++++++++++++++++++++++++++++++++-
1 file changed, 81 insertions(+), 2 deletions(-)
June 28, 2018
[PATCH 1/2] inetcpl.cpl: Add proxy server settings dialog
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/inetcpl.cpl/Makefile.in | 1 +
dlls/inetcpl.cpl/connections.c | 178
+++++++++++++++++++++++++++++++++++++++++
dlls/inetcpl.cpl/inetcpl.c | 6 ++
dlls/inetcpl.cpl/inetcpl.h | 6 ++
dlls/inetcpl.cpl/inetcpl.rc | 14 ++++
5 files changed, 205 insertions(+)
create mode 100644 dlls/inetcpl.cpl/connections.c
June 28, 2018
Re: [PATCH] iphlpapi: Cast caddr_t to char* before doing pointer arithmetic
by Simon Richter
Hi,
On Thu, Jun 28, 2018 at 01:54:45PM +0200, Alex Henrie wrote:
> - while (ifPtr && ifPtr < ifc->ifc_buf + ifc->ifc_len) {
> + while (ifPtr && (char *)ifPtr < ifc->ifc_buf + ifc->ifc_len) {
Quick question: what if ifc->ifc_len == 1 ?
In this case, can I read the length field of the record, or would that
bring me out of bounds here?
Simon
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by Kai Krakow
2018-06-28 12:39 GMT+02:00 Matteo Bruni <matteo.mystral(a)gmail.com>:
> 2018-06-28 9:05 GMT+02:00 Kai Krakow <kai(a)kaishome.de>:
>> Hello again!
>>
>> 2018-06-28 8:56 GMT+02:00 Kai Krakow <kai(a)kaishome.de>:
>>> Hello!
>>>
>>> 2018-06-27 21:14 GMT+02:00 Alex Henrie <alexhenrie24(a)gmail.com>:
>>>> On Wed, Jun 27, 2018 at 11:24 AM John Found <johnfound(a)asm32.info> wrote:
>>>>>
>>>>> While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
>>>>>
>>>>> for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
>>>>> {
>>>>> int m = vkey - VK_LSHIFT;
>>>>> >>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
>>>>> {
>>>>> TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
>>>>> modifiers[m].vkey, keystate[vkey]);
>>>>>
>>>>> update_key_state( keystate, vkey, modifiers[m].pressed );
>>>>> changed = TRUE;
>>>>> }
>>>>> }
>>>>>
>>>>> Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
>>>>>
>>>>> Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
>>>>
>>>> I don't immediately know what this if statement is for, but I can tell
>>>> you that the ! operator converts a value of zero to 1 and a nonzero
>>>> value to 0. So, if keystate[vkey] & 0x80 is 0 then
>>>> modifiers[m].pressed must be nonzero and vice versa.
>>>
>>> I always was under the impression that the bang operator does a binary
>>> inversion of the value. Thus, it would convert 0x7F to 0x80. This also
>>> means it would convert 0x00 (signed) to 0xFF (signed) which turns 0
>>> into -1, not 1.
>>>
>>> But however it works, this code is not working in any obvious way and
>>> should maybe be rewritten.
>>>
>>> Just my two cents.
>>
>> I just looked it up, the bang operator seems to be a logical (not
>> binary) operator in C99:
>> https://stackoverflow.com/questions/3661751/what-is-0-in-c
>>
>> According to this, I question how the code above is supposed to work
>> in the first place because "!modifiers[m].pressed" would always be 0
>> or 1, and it is compared to 0 or 0x80.
>
> No, it's compared to 0 or 1 (there is a ! on the left hand side of the == too)
Oh *facepalm*, you're right. I didn't notice the opening and closing
parentheses in the correct position.
>> This is exploiting implicit
>> behavior which is almost always a bad thing to do if you need to
>> understand code later.
>
> It's pretty clear and explicit I'd say.
Maybe but still not very visible...
But this should answer the OPs question why it is done in this way.
Thanks for clarification,
Kai
June 28, 2018
[PATCH] iphlpapi: Cast caddr_t to char* before doing pointer arithmetic
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
Fixes https://bugs.winehq.org/show_bug.cgi?id=18164
dlls/iphlpapi/ifenum.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/iphlpapi/ifenum.c b/dlls/iphlpapi/ifenum.c
index eed1be15d1..c3abdf0e53 100644
--- a/dlls/iphlpapi/ifenum.c
+++ b/dlls/iphlpapi/ifenum.c
@@ -1013,13 +1013,13 @@ static DWORD enumIPAddresses(PDWORD pcAddresses, struct ifconf *ifc)
if (ioctlRet == 0) {
ifPtr = ifc->ifc_buf;
- while (ifPtr && ifPtr < ifc->ifc_buf + ifc->ifc_len) {
+ while (ifPtr && (char *)ifPtr < ifc->ifc_buf + ifc->ifc_len) {
struct ifreq *ifr = (struct ifreq *)ifPtr;
if (ifr->ifr_addr.sa_family == AF_INET)
numAddresses++;
- ifPtr += ifreq_len((struct ifreq *)ifPtr);
+ ifPtr = (char *)ifPtr + ifreq_len((struct ifreq *)ifPtr);
}
}
else
@@ -1074,10 +1074,10 @@ DWORD getIPAddrTable(PMIB_IPADDRTABLE *ppIpAddrTable, HANDLE heap, DWORD flags)
ret = NO_ERROR;
(*ppIpAddrTable)->dwNumEntries = numAddresses;
ifPtr = ifc.ifc_buf;
- while (!ret && ifPtr && ifPtr < ifc.ifc_buf + ifc.ifc_len) {
+ while (!ret && ifPtr && (char *)ifPtr < ifc.ifc_buf + ifc.ifc_len) {
struct ifreq *ifr = (struct ifreq *)ifPtr;
- ifPtr += ifreq_len(ifr);
+ ifPtr = (char *)ifPtr + ifreq_len(ifr);
if (ifr->ifr_addr.sa_family != AF_INET)
continue;
--
2.18.0
June 28, 2018
Re: [PATCH 6/6] user32: For an owner-drawn listbox without strings WM_MEASUREITEM still needs correct itemData.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39445
Your paranoid android.
=== wvistau64_zh_CN (32 bit msg) ===
msg.c:5180: Test failed: ShowWindow(SW_RESTORE):overlapped: 18: the msg sequence is not complete: expected 0000 - actual 0088
June 28, 2018
Re: [PATCH 4/6] user32: Fix order of items passed in WM_COMPAREITEM data.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39443
Your paranoid android.
=== wvistau64_zh_CN (32 bit msg) ===
msg.c:5180: Test failed: ShowWindow(SW_RESTORE):overlapped: 18: the msg sequence is not complete: expected 0000 - actual 0088
June 28, 2018
Re: [PATCH 2/6] user32/tests: Add a message test for an owner-drawn sorted listbox.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39441
Your paranoid android.
=== wvistau64_zh_CN (32 bit msg) ===
msg.c:5182: Test failed: ShowWindow(SW_RESTORE):overlapped: 18: the msg sequence is not complete: expected 0000 - actual 0088
June 28, 2018
Re: [PATCH 1/6] user32/tests: Add a test for WM_MEASUREITEM when inserting an item to an owner-drawn listbox.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39440
Your paranoid android.
=== wvistau64_zh_CN (32 bit msg) ===
msg.c:5139: Test failed: ShowWindow(SW_RESTORE):overlapped: 18: the msg sequence is not complete: expected 0000 - actual 0088
June 28, 2018
[PATCH 6/6] user32: For an owner-drawn listbox without strings WM_MEASUREITEM still needs correct itemData.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/listbox.c | 2 +-
dlls/user32/tests/msg.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c
index 9caccf6097..af8ee40311 100644
--- a/dlls/user32/listbox.c
+++ b/dlls/user32/listbox.c
@@ -1554,7 +1554,7 @@ static LRESULT LISTBOX_InsertItem( LB_DESCR *descr, INT index,
mis.CtlType = ODT_LISTBOX;
mis.CtlID = id;
mis.itemID = index;
- mis.itemData = data;
+ mis.itemData = str ? (ULONG_PTR)str : data;
mis.itemHeight = descr->item_height;
SendMessageW( descr->owner, WM_MEASUREITEM, id, (LPARAM)&mis );
item->height = mis.itemHeight ? mis.itemHeight : 1;
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index da017667e0..052b9b9aae 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -14387,7 +14387,7 @@ static void test_listbox_messages(void)
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
ok(ret == 2, "expected 2, got %ld\n", ret);
- ok_sequence(wm_lb_addstring_sort_ownerdraw, "LB_ADDSTRING", TRUE);
+ ok_sequence(wm_lb_addstring_sort_ownerdraw, "LB_ADDSTRING", FALSE);
check_lb_state(listbox, 3, LB_ERR, 0, 0);
log_all_parent_messages--;
--
2.16.3
June 28, 2018
[PATCH 5/6] user32: Fix the listbox sorting algorithm.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/listbox.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c
index 490033902c..9caccf6097 100644
--- a/dlls/user32/listbox.c
+++ b/dlls/user32/listbox.c
@@ -828,10 +828,11 @@ static INT LISTBOX_FindStringPos( LB_DESCR *descr, LPCWSTR str, BOOL exact )
{
INT index, min, max, res;
- if (!(descr->style & LBS_SORT)) return -1; /* Add it at the end */
+ if (!descr->nb_items || !(descr->style & LBS_SORT)) return -1; /* Add it at the end */
+
min = 0;
- max = descr->nb_items;
- while (min != max)
+ max = descr->nb_items - 1;
+ while (min <= max)
{
index = (min + max) / 2;
if (HAS_STRINGS(descr))
@@ -854,10 +855,10 @@ static INT LISTBOX_FindStringPos( LB_DESCR *descr, LPCWSTR str, BOOL exact )
res = SendMessageW( descr->owner, WM_COMPAREITEM, id, (LPARAM)&cis );
}
if (!res) return index;
- if (res > 0) max = index;
+ if (res > 0) max = index - 1;
else min = index + 1;
}
- return exact ? -1 : max;
+ return exact ? -1 : min;
}
--
2.16.3
June 28, 2018
[PATCH 4/6] user32: Fix order of items passed in WM_COMPAREITEM data.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/listbox.c | 12 ++++++------
dlls/user32/tests/msg.c | 4 ----
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c
index 8df67634d3..490033902c 100644
--- a/dlls/user32/listbox.c
+++ b/dlls/user32/listbox.c
@@ -835,7 +835,7 @@ static INT LISTBOX_FindStringPos( LB_DESCR *descr, LPCWSTR str, BOOL exact )
{
index = (min + max) / 2;
if (HAS_STRINGS(descr))
- res = LISTBOX_lstrcmpiW( descr->locale, str, descr->items[index].str);
+ res = LISTBOX_lstrcmpiW( descr->locale, descr->items[index].str, str );
else
{
COMPAREITEMSTRUCT cis;
@@ -846,15 +846,15 @@ static INT LISTBOX_FindStringPos( LB_DESCR *descr, LPCWSTR str, BOOL exact )
cis.hwndItem = descr->self;
/* note that some application (MetaStock) expects the second item
* to be in the listbox */
- cis.itemID1 = -1;
- cis.itemData1 = (ULONG_PTR)str;
- cis.itemID2 = index;
- cis.itemData2 = descr->items[index].data;
+ cis.itemID1 = index;
+ cis.itemData1 = descr->items[index].data;
+ cis.itemID2 = -1;
+ cis.itemData2 = (ULONG_PTR)str;
cis.dwLocaleId = descr->locale;
res = SendMessageW( descr->owner, WM_COMPAREITEM, id, (LPARAM)&cis );
}
if (!res) return index;
- if (res < 0) max = index;
+ if (res > 0) max = index;
else min = index + 1;
}
return exact ? -1 : max;
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 5a5d5ed5fe..da017667e0 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -2276,9 +2276,7 @@ static void add_message_(int line, const struct recvd_message *msg)
ok(msg->wParam == cis->CtlID, "expected %#x, got %#lx\n", cis->CtlID, msg->wParam);
ok(cis->hwndItem == ctrl, "expected %p, got %p\n", ctrl, cis->hwndItem);
-todo_wine
ok((int)cis->itemID1 >= 0, "expected >= 0, got %d\n", cis->itemID1);
-todo_wine
ok((int)cis->itemID2 == -1, "expected -1, got %d\n", cis->itemID2);
sprintf( seq->output, "%s: %p WM_COMPAREITEM: CtlType %#x, CtlID %#x, itemID1 %#x, itemData1 %#lx, itemID2 %#x, itemData2 %#lx",
@@ -14385,10 +14383,8 @@ static void test_listbox_messages(void)
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
ok(ret == 0, "expected 0, got %ld\n", ret);
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
-todo_wine
ok(ret == 1, "expected 1, got %ld\n", ret);
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
-todo_wine
ok(ret == 2, "expected 2, got %ld\n", ret);
ok_sequence(wm_lb_addstring_sort_ownerdraw, "LB_ADDSTRING", TRUE);
--
2.16.3
June 28, 2018
[PATCH 3/6] user32/tests: Add some message tests for not an owner-drawn listbox.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/tests/msg.c | 69 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 64 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 0df9687ae2..5a5d5ed5fe 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -14193,6 +14193,13 @@ static const struct message wm_lb_deletestring_reset[] =
{ 0 }
};
static const struct message wm_lb_addstring[] =
+{
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ef },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ee },
+ { 0 }
+};
+static const struct message wm_lb_addstring_ownerdraw[] =
{
{ LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed },
{ WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf0f2, 0xf30604ed },
@@ -14202,7 +14209,7 @@ static const struct message wm_lb_addstring[] =
{ WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf2f2, 0xf30604ef },
{ 0 }
};
-static const struct message wm_lb_addstring_sort[] =
+static const struct message wm_lb_addstring_sort_ownerdraw[] =
{
{ LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed },
{ WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf0f2, 0xf30604ed },
@@ -14290,6 +14297,8 @@ static void test_listbox_messages(void)
flush_sequence();
+ log_all_parent_messages++;
+
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
ok(ret == 0, "expected 0, got %ld\n", ret);
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
@@ -14297,13 +14306,11 @@ static void test_listbox_messages(void)
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
ok(ret == 2, "expected 2, got %ld\n", ret);
- ok_sequence(wm_lb_addstring, "LB_ADDSTRING", FALSE);
+ ok_sequence(wm_lb_addstring_ownerdraw, "LB_ADDSTRING", FALSE);
check_lb_state(listbox, 3, LB_ERR, 0, 0);
flush_sequence();
- log_all_parent_messages++;
-
trace("selecting item 0\n");
ret = SendMessageA(listbox, LB_SETCURSEL, 0, 0);
ok(ret == 0, "expected 0, got %ld\n", ret);
@@ -14384,7 +14391,59 @@ todo_wine
todo_wine
ok(ret == 2, "expected 2, got %ld\n", ret);
- ok_sequence(wm_lb_addstring_sort, "LB_ADDSTRING", TRUE);
+ ok_sequence(wm_lb_addstring_sort_ownerdraw, "LB_ADDSTRING", TRUE);
+ check_lb_state(listbox, 3, LB_ERR, 0, 0);
+
+ log_all_parent_messages--;
+
+ DestroyWindow(listbox);
+
+ /* with LBS_HASSTRINGS */
+ listbox = CreateWindowExA(WS_EX_NOPARENTNOTIFY, "ListBox", NULL,
+ WS_CHILD | LBS_NOTIFY | LBS_HASSTRINGS | WS_VISIBLE,
+ 10, 10, 80, 80, parent, (HMENU)ID_LISTBOX, 0, NULL);
+ listbox_orig_proc = (WNDPROC)SetWindowLongPtrA(listbox, GWLP_WNDPROC, (ULONG_PTR)listbox_hook_proc);
+
+ check_lb_state(listbox, 0, LB_ERR, 0, 0);
+
+ flush_sequence();
+
+ log_all_parent_messages++;
+
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
+ ok(ret == 0, "expected 0, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
+ ok(ret == 1, "expected 1, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
+ ok(ret == 2, "expected 2, got %ld\n", ret);
+
+ ok_sequence(wm_lb_addstring, "LB_ADDSTRING", FALSE);
+ check_lb_state(listbox, 3, LB_ERR, 0, 0);
+
+ log_all_parent_messages--;
+
+ DestroyWindow(listbox);
+
+ /* with LBS_HASSTRINGS and LBS_SORT */
+ listbox = CreateWindowExA(WS_EX_NOPARENTNOTIFY, "ListBox", NULL,
+ WS_CHILD | LBS_NOTIFY | LBS_HASSTRINGS | LBS_SORT | WS_VISIBLE,
+ 10, 10, 80, 80, parent, (HMENU)ID_LISTBOX, 0, NULL);
+ listbox_orig_proc = (WNDPROC)SetWindowLongPtrA(listbox, GWLP_WNDPROC, (ULONG_PTR)listbox_hook_proc);
+
+ check_lb_state(listbox, 0, LB_ERR, 0, 0);
+
+ flush_sequence();
+
+ log_all_parent_messages++;
+
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
+ ok(ret == 0, "expected 0, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
+ ok(ret == 0, "expected 0, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
+ ok(ret == 1, "expected 1, got %ld\n", ret);
+
+ ok_sequence(wm_lb_addstring, "LB_ADDSTRING", FALSE);
check_lb_state(listbox, 3, LB_ERR, 0, 0);
log_all_parent_messages--;
--
2.16.3
June 28, 2018
[PATCH 2/6] user32/tests: Add a message test for an owner-drawn sorted listbox.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/tests/msg.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 88 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 1c3b639aa0..0df9687ae2 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -2243,18 +2243,61 @@ static void add_message_(int line, const struct recvd_message *msg)
{
MEASURE_ITEM_STRUCT mi;
MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)msg->lParam;
+ BOOL is_unicode_data = TRUE;
sprintf( seq->output, "%s: %p WM_MEASUREITEM: CtlType %#x, CtlID %#x, itemID %#x, itemData %#lx",
msg->descr, msg->hwnd, mis->CtlType, mis->CtlID,
mis->itemID, mis->itemData);
+ if (mis->CtlType == ODT_LISTBOX)
+ {
+ HWND ctrl = GetDlgItem(msg->hwnd, mis->CtlID);
+ is_unicode_data = GetWindowLongA(ctrl, GWL_STYLE) & LBS_HASSTRINGS;
+ }
+
mi.u.wp = 0;
mi.u.item.CtlType = mis->CtlType;
mi.u.item.CtlID = mis->CtlID;
mi.u.item.itemID = mis->itemID;
mi.u.item.wParam = msg->wParam;
seq->wParam = mi.u.wp;
- seq->lParam = mis->itemData ? hash_Ly_W((const WCHAR *)mis->itemData) : 0;
+ if (is_unicode_data)
+ seq->lParam = mis->itemData ? hash_Ly_W((const WCHAR *)mis->itemData) : 0;
+ else
+ seq->lParam = mis->itemData ? hash_Ly((const char *)mis->itemData) : 0;
+ break;
+ }
+
+ case WM_COMPAREITEM:
+ {
+ COMPAREITEMSTRUCT *cis = (COMPAREITEMSTRUCT *)msg->lParam;
+ HWND ctrl = GetDlgItem(msg->hwnd, cis->CtlID);
+ BOOL is_unicode_data = TRUE;
+
+ ok(msg->wParam == cis->CtlID, "expected %#x, got %#lx\n", cis->CtlID, msg->wParam);
+ ok(cis->hwndItem == ctrl, "expected %p, got %p\n", ctrl, cis->hwndItem);
+todo_wine
+ ok((int)cis->itemID1 >= 0, "expected >= 0, got %d\n", cis->itemID1);
+todo_wine
+ ok((int)cis->itemID2 == -1, "expected -1, got %d\n", cis->itemID2);
+
+ sprintf( seq->output, "%s: %p WM_COMPAREITEM: CtlType %#x, CtlID %#x, itemID1 %#x, itemData1 %#lx, itemID2 %#x, itemData2 %#lx",
+ msg->descr, msg->hwnd, cis->CtlType, cis->CtlID,
+ cis->itemID1, cis->itemData1, cis->itemID2, cis->itemData2);
+
+ if (cis->CtlType == ODT_LISTBOX)
+ is_unicode_data = GetWindowLongA(ctrl, GWL_STYLE) & LBS_HASSTRINGS;
+
+ if (is_unicode_data)
+ {
+ seq->wParam = cis->itemData1 ? hash_Ly_W((const WCHAR *)cis->itemData1) : 0;
+ seq->lParam = cis->itemData2 ? hash_Ly_W((const WCHAR *)cis->itemData2) : 0;
+ }
+ else
+ {
+ seq->wParam = cis->itemData1 ? hash_Ly((const char *)cis->itemData1) : 0;
+ seq->lParam = cis->itemData2 ? hash_Ly((const char *)cis->itemData2) : 0;
+ }
break;
}
@@ -9044,7 +9087,7 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam
message == WM_PARENTNOTIFY || message == WM_CANCELMODE ||
message == WM_SETFOCUS || message == WM_KILLFOCUS ||
message == WM_ENABLE || message == WM_ENTERIDLE ||
- message == WM_DRAWITEM || message == WM_MEASUREITEM ||
+ message == WM_DRAWITEM || message == WM_MEASUREITEM || message == WM_COMPAREITEM ||
message == WM_COMMAND || message == WM_IME_SETCONTEXT)
{
switch (message)
@@ -9092,7 +9135,7 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam
ret = DefWindowProcA(hwnd, message, wParam, lParam);
defwndproc_counter--;
- return ret;
+ return message == WM_COMPAREITEM ? -1 : ret;
}
static INT_PTR CALLBACK StopQuitMsgCheckProcA(HWND hwnd, UINT message, WPARAM wp, LPARAM lp)
@@ -14159,6 +14202,19 @@ static const struct message wm_lb_addstring[] =
{ WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf2f2, 0xf30604ef },
{ 0 }
};
+static const struct message wm_lb_addstring_sort[] =
+{
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf0f2, 0xf30604ed },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ee },
+ { WM_COMPAREITEM, sent|wparam|lparam|parent, 0xf30604ed, 0xf30604ee },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf1f2, 0xf30604ee },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ef },
+ { WM_COMPAREITEM, sent|wparam|lparam|parent, 0xf30604ed, 0xf30604ef },
+ { WM_COMPAREITEM, sent|wparam|lparam|parent, 0xf30604ee, 0xf30604ef },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf2f2, 0xf30604ef },
+ { 0 }
+};
#define check_lb_state(a1, a2, a3, a4, a5) check_lb_state_dbg(a1, a2, a3, a4, a5, __LINE__)
@@ -14224,6 +14280,7 @@ static void test_listbox_messages(void)
parent = CreateWindowExA(0, "TestParentClass", NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 200, 200, 0, 0, 0, NULL);
+ /* with LBS_HASSTRINGS */
listbox = CreateWindowExA(WS_EX_NOPARENTNOTIFY, "ListBox", NULL,
WS_CHILD | LBS_NOTIFY | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | WS_VISIBLE,
10, 10, 80, 80, parent, (HMENU)ID_LISTBOX, 0, NULL);
@@ -14304,6 +14361,34 @@ static void test_listbox_messages(void)
log_all_parent_messages--;
+ DestroyWindow(listbox);
+
+ /* with LBS_SORT and without LBS_HASSTRINGS */
+ listbox = CreateWindowExA(WS_EX_NOPARENTNOTIFY, "ListBox", NULL,
+ WS_CHILD | LBS_NOTIFY | LBS_OWNERDRAWVARIABLE | LBS_SORT | WS_VISIBLE,
+ 10, 10, 80, 80, parent, (HMENU)ID_LISTBOX, 0, NULL);
+ listbox_orig_proc = (WNDPROC)SetWindowLongPtrA(listbox, GWLP_WNDPROC, (ULONG_PTR)listbox_hook_proc);
+
+ check_lb_state(listbox, 0, LB_ERR, 0, 0);
+
+ flush_sequence();
+
+ log_all_parent_messages++;
+
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
+ ok(ret == 0, "expected 0, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
+todo_wine
+ ok(ret == 1, "expected 1, got %ld\n", ret);
+ ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
+todo_wine
+ ok(ret == 2, "expected 2, got %ld\n", ret);
+
+ ok_sequence(wm_lb_addstring_sort, "LB_ADDSTRING", TRUE);
+ check_lb_state(listbox, 3, LB_ERR, 0, 0);
+
+ log_all_parent_messages--;
+
DestroyWindow(listbox);
DestroyWindow(parent);
}
--
2.16.3
June 28, 2018
[PATCH 1/6] user32/tests: Add a test for WM_MEASUREITEM when inserting an item to an owner-drawn listbox.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/user32/tests/msg.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 75 insertions(+), 4 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index a0f2cbeef0..1c3b639aa0 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -3,7 +3,7 @@
*
* Copyright 1999 Ove Kaaven
* Copyright 2003 Dimitrie O. Paun
- * Copyright 2004, 2005 Dmitry Timoshkov
+ * Copyright 2004,2005,2016 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -98,6 +98,22 @@ typedef struct
} u;
} DRAW_ITEM_STRUCT;
+/* encoded MEASUREITEMSTRUCT into a WPARAM */
+typedef struct
+{
+ union
+ {
+ struct
+ {
+ UINT CtlType : 4;
+ UINT CtlID : 4;
+ UINT itemID : 4;
+ UINT wParam : 20;
+ } item;
+ WPARAM wp;
+ } u;
+} MEASURE_ITEM_STRUCT;
+
static BOOL test_DestroyWindow_flag;
static HWINEVENTHOOK hEvent_hook;
static HHOOK hKBD_hook;
@@ -2099,6 +2115,25 @@ static BOOL ignore_message( UINT message )
message == WM_DWMNCRENDERINGCHANGED);
}
+static unsigned hash_Ly_W(const WCHAR *str)
+{
+ unsigned hash = 0;
+
+ for (; *str; str++)
+ hash = hash * 1664525u + (unsigned char)(*str) + 1013904223u;
+
+ return hash;
+}
+
+static unsigned hash_Ly(const char *str)
+{
+ unsigned hash = 0;
+
+ for (; *str; str++)
+ hash = hash * 1664525u + (unsigned char)(*str) + 1013904223u;
+
+ return hash;
+}
#define add_message(msg) add_message_(__LINE__,msg);
static void add_message_(int line, const struct recvd_message *msg)
@@ -2203,6 +2238,26 @@ static void add_message_(int line, const struct recvd_message *msg)
seq->lParam = di.u.lp;
break;
}
+
+ case WM_MEASUREITEM:
+ {
+ MEASURE_ITEM_STRUCT mi;
+ MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)msg->lParam;
+
+ sprintf( seq->output, "%s: %p WM_MEASUREITEM: CtlType %#x, CtlID %#x, itemID %#x, itemData %#lx",
+ msg->descr, msg->hwnd, mis->CtlType, mis->CtlID,
+ mis->itemID, mis->itemData);
+
+ mi.u.wp = 0;
+ mi.u.item.CtlType = mis->CtlType;
+ mi.u.item.CtlID = mis->CtlID;
+ mi.u.item.itemID = mis->itemID;
+ mi.u.item.wParam = msg->wParam;
+ seq->wParam = mi.u.wp;
+ seq->lParam = mis->itemData ? hash_Ly_W((const WCHAR *)mis->itemData) : 0;
+ break;
+ }
+
default:
if (msg->message >= 0xc000) return; /* ignore registered messages */
sprintf( seq->output, "%s: %p %04x wp %08lx lp %08lx",
@@ -8989,8 +9044,8 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam
message == WM_PARENTNOTIFY || message == WM_CANCELMODE ||
message == WM_SETFOCUS || message == WM_KILLFOCUS ||
message == WM_ENABLE || message == WM_ENTERIDLE ||
- message == WM_DRAWITEM || message == WM_COMMAND ||
- message == WM_IME_SETCONTEXT)
+ message == WM_DRAWITEM || message == WM_MEASUREITEM ||
+ message == WM_COMMAND || message == WM_IME_SETCONTEXT)
{
switch (message)
{
@@ -14094,6 +14149,16 @@ static const struct message wm_lb_deletestring_reset[] =
{ WM_DRAWITEM, sent|wparam|parent|optional, ID_LISTBOX },
{ 0 }
};
+static const struct message wm_lb_addstring[] =
+{
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf0f2, 0xf30604ed },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ee },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf1f2, 0xf30604ee },
+ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ef },
+ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf2f2, 0xf30604ef },
+ { 0 }
+};
#define check_lb_state(a1, a2, a3, a4, a5) check_lb_state_dbg(a1, a2, a3, a4, a5, __LINE__)
@@ -14119,7 +14184,10 @@ static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPAR
msg.flags = sent|wparam|lparam;
if (defwndproc_counter) msg.flags |= defwinproc;
msg.wParam = wp;
- msg.lParam = lp;
+ if (message == LB_ADDSTRING)
+ msg.lParam = lp ? hash_Ly((const char *)lp) : 0;
+ else
+ msg.lParam = lp;
msg.descr = "listbox";
add_message(&msg);
}
@@ -14163,6 +14231,8 @@ static void test_listbox_messages(void)
check_lb_state(listbox, 0, LB_ERR, 0, 0);
+ flush_sequence();
+
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0");
ok(ret == 0, "expected 0, got %ld\n", ret);
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1");
@@ -14170,6 +14240,7 @@ static void test_listbox_messages(void)
ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2");
ok(ret == 2, "expected 2, got %ld\n", ret);
+ ok_sequence(wm_lb_addstring, "LB_ADDSTRING", FALSE);
check_lb_state(listbox, 3, LB_ERR, 0, 0);
flush_sequence();
--
2.16.3
June 28, 2018
Re: [PATCH 1/2] msctf/tests: Set requestedExecutionLevel to asInvoker to prevent virtualization.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39437
Your paranoid android.
=== w8adm (32 bit inputprocessor) ===
inputprocessor.c:983: Test failed: Unable to register text service(80004005)
inputprocessor.c:986: Test failed: Unable to add Language Profile (80004005)
inputprocessor.c:1048: Test failed: ITfCategoryMgr_RegisterCategory failed
inputprocessor.c:1050: Test failed: ITfCategoryMgr_RegisterCategory failed
inputprocessor.c:1041: Test failed: Registered text service not found
inputprocessor.c:1013: Test failed: Did not find registered text service
inputprocessor.c:1371: Test failed: Failed to Activate text service
inputprocessor.c:1799: Test failed: ITfCategoryMgr_IsEqualTfGuidAtom failed
inputprocessor.c:1800: Test failed: Equal value invalid
inputprocessor.c:1826: Test failed: Id for CLSID_FakeService not matching tid
inputprocessor.c:1327: Test failed: ITfKeystrokeMgr_AdviseKeyEventSink failed
inputprocessor.c:1328: Test failed: KeyEventSink_OnSetFocus not fired as expected, in state 1
inputprocessor.c:1330: Test failed: Wrong return, expected CONNECT_E_ADVISELIMIT
inputprocessor.c:1338: Test failed: ITfKeystrokeMgr_PreserveKey failed
inputprocessor.c:1341: Test failed: ITfKeystrokeMgr_PreserveKey improperly succeeded
inputprocessor.c:1345: Test failed: ITfKeystrokeMgr_IsPreservedKey failed
inputprocessor.c:1349: Test failed: ITfKeystrokeMgr_UnpreserveKey failed
inputprocessor.c:1359: Test failed: ITfKeystrokeMgr_UnadviseKeyEventSink failed
inputprocessor.c:544: Test failed: Unexpected ThreadMgrEventSink_OnSetFocus sink
inputprocessor.c:555: Test failed: Sink reports wrong previous focus
inputprocessor.c:1070: Test failed: Wrong GUID
inputprocessor.c:1078: Test failed: Wrong GUID
inputprocessor.c:1057: Test failed: ITfCategoryMgr_UnregisterCategory failed
inputprocessor.c:1059: Test failed: ITfCategoryMgr_UnregisterCategory failed
inputprocessor.c:993: Test failed: Unable to unregister text service(80004005)
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by Matteo Bruni
2018-06-28 9:05 GMT+02:00 Kai Krakow <kai(a)kaishome.de>:
> Hello again!
>
> 2018-06-28 8:56 GMT+02:00 Kai Krakow <kai(a)kaishome.de>:
>> Hello!
>>
>> 2018-06-27 21:14 GMT+02:00 Alex Henrie <alexhenrie24(a)gmail.com>:
>>> On Wed, Jun 27, 2018 at 11:24 AM John Found <johnfound(a)asm32.info> wrote:
>>>>
>>>> While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
>>>>
>>>> for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
>>>> {
>>>> int m = vkey - VK_LSHIFT;
>>>> >>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
>>>> {
>>>> TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
>>>> modifiers[m].vkey, keystate[vkey]);
>>>>
>>>> update_key_state( keystate, vkey, modifiers[m].pressed );
>>>> changed = TRUE;
>>>> }
>>>> }
>>>>
>>>> Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
>>>>
>>>> Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
>>>
>>> I don't immediately know what this if statement is for, but I can tell
>>> you that the ! operator converts a value of zero to 1 and a nonzero
>>> value to 0. So, if keystate[vkey] & 0x80 is 0 then
>>> modifiers[m].pressed must be nonzero and vice versa.
>>
>> I always was under the impression that the bang operator does a binary
>> inversion of the value. Thus, it would convert 0x7F to 0x80. This also
>> means it would convert 0x00 (signed) to 0xFF (signed) which turns 0
>> into -1, not 1.
>>
>> But however it works, this code is not working in any obvious way and
>> should maybe be rewritten.
>>
>> Just my two cents.
>
> I just looked it up, the bang operator seems to be a logical (not
> binary) operator in C99:
> https://stackoverflow.com/questions/3661751/what-is-0-in-c
>
> According to this, I question how the code above is supposed to work
> in the first place because "!modifiers[m].pressed" would always be 0
> or 1, and it is compared to 0 or 0x80.
No, it's compared to 0 or 1 (there is a ! on the left hand side of the == too)
> This is exploiting implicit
> behavior which is almost always a bad thing to do if you need to
> understand code later.
It's pretty clear and explicit I'd say.
June 28, 2018
[PATCH 2/2] msctf/tests: Skip tests if limited.
by Zebediah Figura
Fixes https://bugs.winehq.org/show_bug.cgi?id=39238
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/msctf/tests/Makefile.in | 2 +-
dlls/msctf/tests/inputprocessor.c | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/msctf/tests/Makefile.in b/dlls/msctf/tests/Makefile.in
index 2cb119a..4f699af 100644
--- a/dlls/msctf/tests/Makefile.in
+++ b/dlls/msctf/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = msctf.dll
-IMPORTS = ole32 user32
+IMPORTS = ole32 user32 advapi32
C_SRCS = \
inputprocessor.c
diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c
index 4a52432..0d03ce3 100644
--- a/dlls/msctf/tests/inputprocessor.c
+++ b/dlls/msctf/tests/inputprocessor.c
@@ -943,7 +943,18 @@ DEFINE_GUID(GUID_COMPARTMENT_TIPUISTATUS, 0x148ca3ec,0x0366,0x401c,0x8
static HRESULT initialize(void)
{
HRESULT hr;
+ HKEY hkey;
+
CoInitialize(NULL);
+
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\CTF\\TIP", 0,
+ KEY_READ|KEY_WRITE, &hkey) != ERROR_SUCCESS)
+ {
+ skip("Not enough permission to register input processor\n");
+ return E_FAIL;
+ }
+ RegCloseKey(hkey);
+
hr = CoCreateInstance (&CLSID_TF_InputProcessorProfiles, NULL,
CLSCTX_INPROC_SERVER, &IID_ITfInputProcessorProfiles, (void**)&g_ipp);
if (SUCCEEDED(hr))
--
2.7.4
June 28, 2018
[PATCH 1/2] msctf/tests: Set requestedExecutionLevel to asInvoker to prevent virtualization.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/msctf/tests/Makefile.in | 3 +++
dlls/msctf/tests/msctf.manifest | 16 ++++++++++++++++
dlls/msctf/tests/msctf.rc | 4 ++++
3 files changed, 23 insertions(+)
create mode 100644 dlls/msctf/tests/msctf.manifest
create mode 100644 dlls/msctf/tests/msctf.rc
diff --git a/dlls/msctf/tests/Makefile.in b/dlls/msctf/tests/Makefile.in
index b3df05c..2cb119a 100644
--- a/dlls/msctf/tests/Makefile.in
+++ b/dlls/msctf/tests/Makefile.in
@@ -3,3 +3,6 @@ IMPORTS = ole32 user32
C_SRCS = \
inputprocessor.c
+
+RC_SRCS = \
+ msctf.rc
diff --git a/dlls/msctf/tests/msctf.manifest b/dlls/msctf/tests/msctf.manifest
new file mode 100644
index 0000000..fc23c29
--- /dev/null
+++ b/dlls/msctf/tests/msctf.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity
+ type="win32"
+ name="Wine.msctf.Test"
+ version="1.0.0.0"
+ processorArchitecture="*"
+ />
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" />
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+</assembly>
diff --git a/dlls/msctf/tests/msctf.rc b/dlls/msctf/tests/msctf.rc
new file mode 100644
index 0000000..51b4021
--- /dev/null
+++ b/dlls/msctf/tests/msctf.rc
@@ -0,0 +1,4 @@
+#include "winuser.h"
+
+/* @makedep: msctf.manifest */
+1 RT_MANIFEST msctf.manifest
--
2.7.4
June 28, 2018
[PATCH 2/2] odbccp32/tests: Set requestedExecutionLevel to asInvoker to prevent virtualization.
by Zebediah Figura
Fixes additional test failures observed on my machine.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/odbccp32/tests/Makefile.in | 3 +++
dlls/odbccp32/tests/odbccp32.manifest | 18 ++++++++++++++++++
dlls/odbccp32/tests/odbccp32.rc | 4 ++++
3 files changed, 25 insertions(+)
create mode 100644 dlls/odbccp32/tests/odbccp32.manifest
create mode 100644 dlls/odbccp32/tests/odbccp32.rc
diff --git a/dlls/odbccp32/tests/Makefile.in b/dlls/odbccp32/tests/Makefile.in
index 912f511..c65292e 100644
--- a/dlls/odbccp32/tests/Makefile.in
+++ b/dlls/odbccp32/tests/Makefile.in
@@ -3,3 +3,6 @@ IMPORTS = odbccp32 advapi32
C_SRCS = \
misc.c
+
+RC_SRCS = \
+ odbccp32.rc
diff --git a/dlls/odbccp32/tests/odbccp32.manifest b/dlls/odbccp32/tests/odbccp32.manifest
new file mode 100644
index 0000000..cd879cc
--- /dev/null
+++ b/dlls/odbccp32/tests/odbccp32.manifest
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity
+ type="win32"
+ name="Wine.odbccp32.Test"
+ version="1.0.0.0"
+ processorArchitecture="*"
+ />
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel
+ level="asInvoker"
+ />
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+</assembly>
diff --git a/dlls/odbccp32/tests/odbccp32.rc b/dlls/odbccp32/tests/odbccp32.rc
new file mode 100644
index 0000000..1e953d2
--- /dev/null
+++ b/dlls/odbccp32/tests/odbccp32.rc
@@ -0,0 +1,4 @@
+#include "winuser.h"
+
+/* @makedep: odbccp32.manifest */
+1 RT_MANIFEST odbccp32.manifest
--
2.7.4
June 28, 2018
[PATCH 1/2] odbccp32/tests: Skip SQLGetInstalledDrivers() test if limited.
by Zebediah Figura
Fixes https://bugs.winehq.org/show_bug.cgi?id=45389
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/odbccp32/tests/misc.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c
index c12ff49..8a16a9e 100644
--- a/dlls/odbccp32/tests/misc.c
+++ b/dlls/odbccp32/tests/misc.c
@@ -618,11 +618,19 @@ static void test_SQLGetInstalledDrivers(void)
{
char buffer[1000], *p;
WORD written, len;
+ BOOL ret, sql_ret;
+ DWORD error_code;
int found = 0;
- BOOL ret;
- SQLInstallDriverEx("Wine test\0Driver=test.dll\0\0", NULL, buffer,
- sizeof(buffer), &written, ODBC_INSTALL_COMPLETE, NULL);
+ ret = SQLInstallDriverEx("Wine test\0Driver=test.dll\0\0", NULL, buffer,
+ sizeof(buffer), &written, ODBC_INSTALL_COMPLETE, NULL);
+ ok(ret, "SQLInstallDriverEx failed: %d\n", ret);
+ sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
+ if (sql_ret && error_code == ODBC_ERROR_WRITING_SYSINFO_FAILED)
+ {
+ skip("not enough privileges\n");
+ return;
+ }
ret = SQLGetInstalledDrivers(NULL, sizeof(buffer), &written);
ok(!ret, "got %d\n", ret);
--
2.7.4
June 28, 2018
[PATCH 2/2] msdmo: DMORegister() returns E_FAIL if unable to access the registry.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/msdmo/dmoreg.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/msdmo/dmoreg.c b/dlls/msdmo/dmoreg.c
index 2161d40..e4766d7 100644
--- a/dlls/msdmo/dmoreg.c
+++ b/dlls/msdmo/dmoreg.c
@@ -208,7 +208,7 @@ HRESULT WINAPI DMORegister(
ret = RegCreateKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hrkey, NULL);
if (ret)
- return HRESULT_FROM_WIN32(ret);
+ return E_FAIL;
/* Create clsidDMO key under MediaObjects */
ret = RegCreateKeyExW(hrkey, GUIDToString(szguid, clsidDMO), 0, NULL,
--
2.7.4
June 28, 2018
[PATCH 1/2] devenum/tests: DMORegister() returns E_FAIL if unable to access the registry.
by Zebediah Figura
Fixes https://bugs.winehq.org/show_bug.cgi?id=45390
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/tests/devenum.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c
index 6d4ce2d..bc3d105 100644
--- a/dlls/devenum/tests/devenum.c
+++ b/dlls/devenum/tests/devenum.c
@@ -521,7 +521,7 @@ static void test_dmo(void)
ok(hr == E_ACCESSDENIED, "Write failed: %#x\n", hr);
hr = DMORegister(name, &CLSID_TestFilter, &CLSID_AudioRendererCategory, 0, 0, NULL, 0, NULL);
- if (hr != E_ACCESSDENIED)
+ if (hr != E_FAIL)
{
ok(hr == S_OK, "got %#x\n", hr);
--
2.7.4
June 28, 2018
[PATCH vkd3d] tests: Get rid of create_texture().
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 80 ++++++++++++++++++++++++------------------------
tests/vkd3d_d3d12_test.h | 1 -
2 files changed, 40 insertions(+), 41 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 217b4368a6b2..6128a402d3a6 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -8552,8 +8552,8 @@ static void test_texture(void)
for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
- texture = create_texture(context.device,
- tests[i].width, tests[i].height, tests[i].format, D3D12_RESOURCE_STATE_COPY_DEST);
+ texture = create_default_texture(context.device,
+ tests[i].width, tests[i].height, tests[i].format, 0, D3D12_RESOURCE_STATE_COPY_DEST);
upload_texture_data(texture, &tests[i].data, 1, queue, command_list);
reset_command_list(command_list, context.allocator);
@@ -8773,8 +8773,8 @@ static void test_gather(void)
cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap);
gpu_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(heap);
- texture = create_texture(context.device, 4, 4, DXGI_FORMAT_R32G32B32A32_FLOAT,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ texture = create_default_texture(context.device, 4, 4, DXGI_FORMAT_R32G32B32A32_FLOAT,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
ID3D12Device_CreateShaderResourceView(context.device, texture, NULL, cpu_handle);
upload_texture_data(texture, &resource_data, 1, queue, command_list);
reset_command_list(command_list, context.allocator);
@@ -9412,8 +9412,8 @@ static void test_descriptor_tables(void)
for (i = 0; i < ARRAY_SIZE(textures); ++i)
{
- textures[i] = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM, D3D12_RESOURCE_STATE_COPY_DEST);
+ textures[i] = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &texture_data[i];
data.RowPitch = sizeof(texture_data[i]);
data.SlicePitch = data.RowPitch;
@@ -9887,8 +9887,8 @@ static void test_update_descriptor_tables(void)
for (i = 0; i < ARRAY_SIZE(textures); ++i)
{
- textures[i] = create_texture(context.device, 1, 1, DXGI_FORMAT_R32_FLOAT,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ textures[i] = create_default_texture(context.device, 1, 1, DXGI_FORMAT_R32_FLOAT,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &texture_data[i];
data.RowPitch = sizeof(texture_data[i]);
data.SlicePitch = data.RowPitch;
@@ -10020,8 +10020,8 @@ static void test_update_descriptor_heap_after_closing_command_list(void)
cpu_heap = create_cpu_descriptor_heap(context.device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
- red_texture = create_texture(context.device, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ red_texture = create_default_texture(context.device, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
texture_data.pData = red_data;
texture_data.RowPitch = sizeof(*red_data);
texture_data.SlicePitch = texture_data.RowPitch;
@@ -10030,8 +10030,8 @@ static void test_update_descriptor_heap_after_closing_command_list(void)
transition_resource_state(command_list, red_texture,
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
- green_texture = create_texture(context.device, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ green_texture = create_default_texture(context.device, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
texture_data.pData = green_data;
upload_texture_data(green_texture, &texture_data, 1, queue, command_list);
reset_command_list(command_list, context.allocator);
@@ -10425,8 +10425,8 @@ static void test_update_compute_descriptor_tables(void)
transition_resource_state(command_list, input_buffers[4],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- textures[0] = create_texture(context.device,
- 4, 4, DXGI_FORMAT_R32_UINT, D3D12_RESOURCE_STATE_COPY_DEST);
+ textures[0] = create_default_texture(context.device,
+ 4, 4, DXGI_FORMAT_R32_UINT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
subresource_data.pData = texture0_data;
subresource_data.RowPitch = sizeof(*texture0_data);
subresource_data.SlicePitch = subresource_data.RowPitch;
@@ -10435,8 +10435,8 @@ static void test_update_compute_descriptor_tables(void)
transition_resource_state(command_list, textures[0],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- textures[1] = create_texture(context.device,
- 4, 4, DXGI_FORMAT_R32_UINT, D3D12_RESOURCE_STATE_COPY_DEST);
+ textures[1] = create_default_texture(context.device,
+ 4, 4, DXGI_FORMAT_R32_UINT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
subresource_data.pData = texture1_data;
subresource_data.RowPitch = sizeof(*texture1_data);
subresource_data.SlicePitch = subresource_data.RowPitch;
@@ -10843,8 +10843,8 @@ static void test_copy_descriptors(void)
/* create SRVs */
cpu_handle = get_cpu_descriptor_handle(&context, cpu_heap, 10);
- t[0] = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ t[0] = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &t0_data;
data.RowPitch = sizeof(t0_data);
data.SlicePitch = data.RowPitch;
@@ -10853,8 +10853,8 @@ static void test_copy_descriptors(void)
transition_resource_state(command_list, t[0],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- t[1] = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R32_UINT, D3D12_RESOURCE_STATE_COPY_DEST);
+ t[1] = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R32_UINT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &t1_data;
data.RowPitch = sizeof(t1_data);
data.SlicePitch = data.RowPitch;
@@ -10863,8 +10863,8 @@ static void test_copy_descriptors(void)
transition_resource_state(command_list, t[1],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- t[2] = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R32_UINT, D3D12_RESOURCE_STATE_COPY_DEST);
+ t[2] = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R32_UINT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &t2_data;
data.RowPitch = sizeof(t2_data);
data.SlicePitch = data.RowPitch;
@@ -11231,8 +11231,8 @@ static void test_copy_descriptors_range_sizes(void)
green_handle = get_cpu_descriptor_handle(&context, cpu_heap, 0);
blue_handle = get_cpu_descriptor_handle(&context, cpu_heap, 1);
- green_texture = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ green_texture = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &green;
data.RowPitch = sizeof(green);
data.SlicePitch = data.RowPitch;
@@ -11242,8 +11242,8 @@ static void test_copy_descriptors_range_sizes(void)
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
ID3D12Device_CreateShaderResourceView(device, green_texture, NULL, green_handle);
- blue_texture = create_texture(context.device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ blue_texture = create_default_texture(context.device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &blue;
data.RowPitch = sizeof(blue);
data.SlicePitch = data.RowPitch;
@@ -11544,8 +11544,8 @@ static void test_descriptors_visibility(void)
vs_raw_buffer = create_upload_buffer(device, sizeof(vs_buffer_data), vs_buffer_data);
ps_raw_buffer = create_upload_buffer(device, sizeof(ps_buffer_data), ps_buffer_data);
- vs_texture = create_texture(device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ vs_texture = create_default_texture(device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = vs_texture_data;
data.RowPitch = sizeof(vs_texture_data);
data.SlicePitch = data.RowPitch;
@@ -11554,8 +11554,8 @@ static void test_descriptors_visibility(void)
transition_resource_state(command_list, vs_texture,
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- ps_texture = create_texture(device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ ps_texture = create_default_texture(device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = ps_texture_data;
data.RowPitch = sizeof(ps_texture_data);
data.SlicePitch = data.RowPitch;
@@ -16308,16 +16308,16 @@ static void test_copy_texture_region(void)
for (i = 0; i < ARRAY_SIZE(resource_states); ++i)
{
- src_texture = create_texture(device, 4, 4, DXGI_FORMAT_R8G8B8A8_UNORM,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ src_texture = create_default_texture(device, 4, 4, DXGI_FORMAT_R8G8B8A8_UNORM,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
texture_data.pData = bitmap_data;
texture_data.RowPitch = 4 * sizeof(*bitmap_data);
texture_data.SlicePitch = texture_data.RowPitch * 4;
upload_texture_data(src_texture, &texture_data, 1, queue, command_list);
reset_command_list(command_list, context.allocator);
- dst_texture = create_texture(device, 4, 4, DXGI_FORMAT_R8G8B8A8_UNORM,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ dst_texture = create_default_texture(device, 4, 4, DXGI_FORMAT_R8G8B8A8_UNORM,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
texture_data.pData = clear_data;
texture_data.RowPitch = 4 * sizeof(*bitmap_data);
texture_data.SlicePitch = texture_data.RowPitch * 4;
@@ -16374,8 +16374,8 @@ static void test_copy_texture_region(void)
transition_sub_resource_state(command_list, ds.texture, 0,
D3D12_RESOURCE_STATE_DEPTH_WRITE, resource_states[i % ARRAY_SIZE(resource_states)]);
- dst_texture = create_texture(device, 32, 32, DXGI_FORMAT_R32_FLOAT,
- D3D12_RESOURCE_STATE_COPY_DEST);
+ dst_texture = create_default_texture(device, 32, 32, DXGI_FORMAT_R32_FLOAT,
+ 0, D3D12_RESOURCE_STATE_COPY_DEST);
ID3D12Device_CreateShaderResourceView(device, dst_texture, NULL,
ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap));
@@ -16631,8 +16631,8 @@ static void test_separate_bindings(void)
transition_resource_state(command_list, ps_raw_uav_buffer,
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- cs_textures[0] = create_texture(device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ cs_textures[0] = create_default_texture(device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &cs_data;
data.RowPitch = sizeof(cs_data);
data.SlicePitch = data.RowPitch;
@@ -16650,8 +16650,8 @@ static void test_separate_bindings(void)
transition_resource_state(command_list, cs_textures[1],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- ps_textures[0] = create_texture(device,
- 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D12_RESOURCE_STATE_COPY_DEST);
+ ps_textures[0] = create_default_texture(device,
+ 1, 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
data.pData = &ps_data;
data.RowPitch = sizeof(ps_data);
data.SlicePitch = data.RowPitch;
diff --git a/tests/vkd3d_d3d12_test.h b/tests/vkd3d_d3d12_test.h
index 2ebb58f997b3..67e4ddb3aae2 100644
--- a/tests/vkd3d_d3d12_test.h
+++ b/tests/vkd3d_d3d12_test.h
@@ -319,7 +319,6 @@ static void check_sub_resource_uint_(unsigned int line, ID3D12Resource *texture,
}
#define create_default_texture(a, b, c, d, e, f) create_default_texture2d_(__LINE__, a, b, c, 1, 1, d, e, f)
-#define create_texture(a, b, c, d, e) create_default_texture(a, b, c, d, 0, e)
#define create_default_texture2d(a, b, c, d, e, f, g, h) create_default_texture2d_(__LINE__, a, b, c, d, e, f, g, h)
static ID3D12Resource *create_default_texture2d_(unsigned int line, ID3D12Device *device,
unsigned int width, unsigned int height, unsigned int array_size, unsigned int miplevel_count,
--
2.16.4
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by Kai Krakow
Hello again!
2018-06-28 8:56 GMT+02:00 Kai Krakow <kai(a)kaishome.de>:
> Hello!
>
> 2018-06-27 21:14 GMT+02:00 Alex Henrie <alexhenrie24(a)gmail.com>:
>> On Wed, Jun 27, 2018 at 11:24 AM John Found <johnfound(a)asm32.info> wrote:
>>>
>>> While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
>>>
>>> for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
>>> {
>>> int m = vkey - VK_LSHIFT;
>>> >>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
>>> {
>>> TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
>>> modifiers[m].vkey, keystate[vkey]);
>>>
>>> update_key_state( keystate, vkey, modifiers[m].pressed );
>>> changed = TRUE;
>>> }
>>> }
>>>
>>> Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
>>>
>>> Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
>>
>> I don't immediately know what this if statement is for, but I can tell
>> you that the ! operator converts a value of zero to 1 and a nonzero
>> value to 0. So, if keystate[vkey] & 0x80 is 0 then
>> modifiers[m].pressed must be nonzero and vice versa.
>
> I always was under the impression that the bang operator does a binary
> inversion of the value. Thus, it would convert 0x7F to 0x80. This also
> means it would convert 0x00 (signed) to 0xFF (signed) which turns 0
> into -1, not 1.
>
> But however it works, this code is not working in any obvious way and
> should maybe be rewritten.
>
> Just my two cents.
I just looked it up, the bang operator seems to be a logical (not
binary) operator in C99:
https://stackoverflow.com/questions/3661751/what-is-0-in-c
According to this, I question how the code above is supposed to work
in the first place because "!modifiers[m].pressed" would always be 0
or 1, and it is compared to 0 or 0x80. This is exploiting implicit
behavior which is almost always a bad thing to do if you need to
understand code later.
Regards,
Kai
June 28, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by Kai Krakow
Hello!
2018-06-27 21:14 GMT+02:00 Alex Henrie <alexhenrie24(a)gmail.com>:
> On Wed, Jun 27, 2018 at 11:24 AM John Found <johnfound(a)asm32.info> wrote:
>>
>> While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
>>
>> for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
>> {
>> int m = vkey - VK_LSHIFT;
>> >>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
>> {
>> TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
>> modifiers[m].vkey, keystate[vkey]);
>>
>> update_key_state( keystate, vkey, modifiers[m].pressed );
>> changed = TRUE;
>> }
>> }
>>
>> Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
>>
>> Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
>
> I don't immediately know what this if statement is for, but I can tell
> you that the ! operator converts a value of zero to 1 and a nonzero
> value to 0. So, if keystate[vkey] & 0x80 is 0 then
> modifiers[m].pressed must be nonzero and vice versa.
I always was under the impression that the bang operator does a binary
inversion of the value. Thus, it would convert 0x7F to 0x80. This also
means it would convert 0x00 (signed) to 0xFF (signed) which turns 0
into -1, not 1.
But however it works, this code is not working in any obvious way and
should maybe be rewritten.
Just my two cents.
Regards,
Kai
June 28, 2018
[PATCH v2 2/2] dwrite: Test GetMetrics with custom fontcollection
by Lucian Poston
Signed-off-by: Lucian Poston <lucianposton(a)pm.me>
---
dlls/dwrite/tests/layout.c | 278 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 278 insertions(+)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 4198b8a1b1..7542cad8d7 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -4489,6 +4489,7 @@ static void test_SetWordWrapping(void)
/* Collection dedicated to fallback testing */
static const WCHAR g_blahfontW[] = {'B','l','a','h',0};
+static const WCHAR g_fontNotInCollectionW[] = {'n','o','t','B','l','a','h',0};
static HRESULT WINAPI fontcollection_QI(IDWriteFontCollection *iface, REFIID riid, void **obj)
{
if (IsEqualIID(riid, &IID_IDWriteFontCollection) || IsEqualIID(riid, &IID_IUnknown)) {
@@ -4548,6 +4549,9 @@ static HRESULT WINAPI fontcollection_FindFamilyName(IDWriteFontCollection *iface
*index = 123456;
*exists = TRUE;
return S_OK;
+ } else if (!lstrcmpW(name, g_fontNotInCollectionW)) {
+ *exists = FALSE;
+ return S_OK;
}
ok(0, "unexpected call, name %s\n", wine_dbgstr_w(name));
return E_NOTIMPL;
@@ -5568,6 +5572,279 @@ static void test_GetOverhangMetrics(void)
IDWriteFactory_Release(factory);
}
+static void test_GetMetrics_with_custom_fontcollection(void)
+{
+ static const WCHAR emptystringW[] = {0};
+ static const WCHAR mappedW[] = {'a','b','c','d',0};
+ static const WCHAR notmappedW[] = {'a',0xffff,'b',0}; // u+ffff = not a unicode character
+ DWRITE_CLUSTER_METRICS clusters[4];
+ DWRITE_TEXT_METRICS metrics;
+ IDWriteTextFormat *format;
+ IDWriteTextLayout *layout;
+ IDWriteFactory *factory;
+ UINT32 count, i;
+ FLOAT width;
+ HRESULT hr;
+
+ factory = create_factory();
+
+ /* font is in font collection */
+ hr = IDWriteFactory_CreateTextFormat(factory, g_blahfontW, &fallbackcollection,
+ DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ /* text is mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, mappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* text is not mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, notmappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* zero-length empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 0, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 0, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ IDWriteTextFormat_Release(format);
+
+ /* font not in font collection */
+ hr = IDWriteFactory_CreateTextFormat(factory, g_fontNotInCollectionW, &fallbackcollection,
+ DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ /* text is mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, mappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* text is not mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, notmappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* zero-length empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 0, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 0, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ IDWriteTextFormat_Release(format);
+
+ IDWriteFactory_Release(factory);
+}
+
START_TEST(layout)
{
IDWriteFactory *factory;
@@ -5601,6 +5878,7 @@ START_TEST(layout)
test_SetFontStretch();
test_SetStrikethrough();
test_GetMetrics();
+ test_GetMetrics_with_custom_fontcollection();
test_SetFlowDirection();
test_SetDrawingEffect();
test_GetLineMetrics();
--
2.16.4
June 28, 2018
[PATCH v2 1/2] dwrite: Test IDWriteTextFormat with nonexistent font
by Lucian Poston
Signed-off-by: Lucian Poston <lucianposton(a)pm.me>
---
dlls/dwrite/tests/layout.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 652f6b78ac..4198b8a1b1 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -30,6 +30,7 @@
#include "wine/test.h"
static const WCHAR tahomaW[] = {'T','a','h','o','m','a',0};
+static const WCHAR nonExistentFontW[] = {'B','l','a','h','!',0};
static const WCHAR enusW[] = {'e','n','-','u','s',0};
struct testanalysissink
@@ -3292,6 +3293,51 @@ todo_wine
ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
IDWriteTextLayout_Release(layout);
+ IDWriteTextFormat_Release(format);
+
+ /* nonexistent font */
+ hr = IDWriteFactory_CreateTextFormat(factory, nonExistentFontW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 500.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ count = 0;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+todo_wine
+ ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth);
+todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+
+ IDWriteTextLayout_Release(layout);
+
IDWriteTextFormat_Release(format);
IDWriteFactory_Release(factory);
}
--
2.16.4
June 28, 2018
Re: [PATCH 1/2] dwrite: Test IDWriteTextFormat with nonexistent font
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39429
Your paranoid android.
=== build (build) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Build: Patch failed to apply
=== debian9 (win32) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Task: Patch failed to apply
June 28, 2018
Re: [PATCH 2/2] dwrite: Test GetMetrics with custom fontcollection
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39428
Your paranoid android.
=== build (build) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Build: Patch failed to apply
=== debian9 (win32) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Task: Patch failed to apply
June 28, 2018
[PATCH 2/2] dwrite: Test GetMetrics with custom fontcollection
by Lucian Poston
Signed-off-by: Lucian Poston <lucianposton(a)pm.me>
---
dlls/dwrite/tests/layout.c | 278 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 278 insertions(+)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index ac36aff5b5..2b665fd74e 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -4491,6 +4491,7 @@ static void test_SetWordWrapping(void)
/* Collection dedicated to fallback testing */
static const WCHAR g_blahfontW[] = {'B','l','a','h',0};
+static const WCHAR g_fontNotInCollectionW[] = {'n','o','t','B','l','a','h',0};
static HRESULT WINAPI fontcollection_QI(IDWriteFontCollection *iface, REFIID riid, void **obj)
{
if (IsEqualIID(riid, &IID_IDWriteFontCollection) || IsEqualIID(riid, &IID_IUnknown)) {
@@ -4550,6 +4551,9 @@ static HRESULT WINAPI fontcollection_FindFamilyName(IDWriteFontCollection *iface
*index = 123456;
*exists = TRUE;
return S_OK;
+ } else if (!lstrcmpW(name, g_fontNotInCollectionW)) {
+ *exists = FALSE;
+ return S_OK;
}
ok(0, "unexpected call, name %s\n", wine_dbgstr_w(name));
return E_NOTIMPL;
@@ -5570,6 +5574,279 @@ static void test_GetOverhangMetrics(void)
IDWriteFactory_Release(factory);
}
+static void test_GetMetrics_with_custom_fontcollection(void)
+{
+ static const WCHAR emptystringW[] = {0};
+ static const WCHAR mappedW[] = {'a','b','c','d',0};
+ static const WCHAR notmappedW[] = {'a',0xffff,'b',0}; // u+ffff = not a unicode character
+ DWRITE_CLUSTER_METRICS clusters[4];
+ DWRITE_TEXT_METRICS metrics;
+ IDWriteTextFormat *format;
+ IDWriteTextLayout *layout;
+ IDWriteFactory *factory;
+ UINT32 count, i;
+ FLOAT width;
+ HRESULT hr;
+
+ factory = create_factory();
+
+ /* font is in font collection */
+ hr = IDWriteFactory_CreateTextFormat(factory, g_blahfontW, &fallbackcollection,
+ DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ /* text is mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, mappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* text is not mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, notmappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* zero-length empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 0, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 0, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ IDWriteTextFormat_Release(format);
+
+ /* font not in font collection */
+ hr = IDWriteFactory_CreateTextFormat(factory, g_fontNotInCollectionW, &fallbackcollection,
+ DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ /* text is mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, mappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* text is not mapped by fontfallback */
+ hr = IDWriteFactory_CreateTextLayout(factory, notmappedW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 4, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ /* zero-length empty string */
+ hr = IDWriteFactory_CreateTextLayout(factory, emptystringW, 0, format, 1000.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = 9999;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 0, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+ todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+ todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+ todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+ todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+ todo_wine
+ ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
+ todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+ todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+ todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+ IDWriteTextLayout_Release(layout);
+
+ IDWriteTextFormat_Release(format);
+
+ IDWriteFactory_Release(factory);
+}
+
START_TEST(layout)
{
IDWriteFactory *factory;
@@ -5603,6 +5880,7 @@ START_TEST(layout)
test_SetFontStretch();
test_SetStrikethrough();
test_GetMetrics();
+ test_GetMetrics_with_custom_fontcollection();
test_SetFlowDirection();
test_SetDrawingEffect();
test_GetLineMetrics();
--
2.16.4
June 28, 2018
Re: [PATCH 1/2] dwrite: Test IDWriteTextFormat with nonexistent font
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39427
Your paranoid android.
=== build (build) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Build: Patch failed to apply
=== debian9 (win32) ===
error: patch failed: dlls/dwrite/tests/layout.c:32
Task: Patch failed to apply
June 28, 2018
[PATCH 1/2] dwrite: Test IDWriteTextFormat with nonexistent font
by Lucian Poston
Signed-off-by: Lucian Poston <lucianposton(a)pm.me>
---
dlls/dwrite/tests/layout.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index c2dd273c6c..ac36aff5b5 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -32,6 +32,7 @@
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
static const WCHAR tahomaW[] = {'T','a','h','o','m','a',0};
+static const WCHAR nonExistentFontW[] = {'B','l','a','h','!',0};
static const WCHAR enusW[] = {'e','n','-','u','s',0};
struct testanalysissink
@@ -3294,6 +3295,51 @@ todo_wine
ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
IDWriteTextLayout_Release(layout);
+ IDWriteTextFormat_Release(format);
+
+ /* nonexistent font */
+ hr = IDWriteFactory_CreateTextFormat(factory, nonExistentFontW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 500.0, 1000.0, &layout);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ count = 0;
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
+todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+ ok(count == 4, "got %u\n", count);
+ for (i = 0, width = 0.0; i < count; i++)
+ width += clusters[i].width;
+
+ memset(&metrics, 0xcc, sizeof(metrics));
+ hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+ ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
+todo_wine
+ ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
+todo_wine
+ ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
+todo_wine
+ ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
+ metrics.widthIncludingTrailingWhitespace, width);
+todo_wine
+ ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
+todo_wine
+ ok(metrics.layoutWidth == 500.0, "got %.2f\n", metrics.layoutWidth);
+todo_wine
+ ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
+todo_wine
+ ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
+todo_wine
+ ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
+
+ IDWriteTextLayout_Release(layout);
+
IDWriteTextFormat_Release(format);
IDWriteFactory_Release(factory);
}
--
2.16.4
June 28, 2018
Re: [PATCH] include/d3d12: Fix typos.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 27, 2018
Re: [PATCH] kernel32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Unclear why this fails so massively on manual runs as the daily runs
don't show it to be a big problem.
Anyway, my patch is a true no-op.
The tests fail also with a whitespace only change
https://testbot.winehq.org/JobDetails.pl?Key=39420
bye
michael
On 06/27/2018 10:09 PM, Marvin wrote:
> Hi,
>
> While running your changed tests on Windows, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
> Full results can be found at
> https://testbot.winehq.org/JobDetails.pl?Key=39415
>
> Your paranoid android.
>
>
> === wvistau64 (64 bit file) ===
> TestBot process got stuck or died unexpectedly
> The previous 1 run(s) terminated abnormally
>
> === w1064 (64 bit module) ===
> kernel32:module crashed (c00000fd)
>
> === wvistau64 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === wvistau64_zh_CN (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === wvistau64_fr (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === wvistau64_he (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w2008s64 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w7u (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w7pro64 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w8 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> TestBot process got stuck or died unexpectedly
> The previous 1 run(s) terminated abnormally
>
> === w8adm (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w864 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
> === w1064 (32 bit virtual) ===
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 0, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2839: Test failed: expected policy flags 1, got 3
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
> virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
> virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
>
>
June 27, 2018
Re: [PATCH vkd3d 4/4] libs/vkd3d: Trace build version.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 27, 2018
Re: [PATCH vkd3d 2/4] tests: Add test for cube maps.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 27, 2018
Re: [PATCH vkd3d 3/4] libs/vkd3d: Set names for internal threads.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 27, 2018
Re: [PATCH vkd3d 1/4] libs/vkd3d: Implement cube shader resource views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 27, 2018
Re: [PATCH] kernel32/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39415
Your paranoid android.
=== wvistau64 (64 bit file) ===
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
=== w1064 (64 bit module) ===
kernel32:module crashed (c00000fd)
=== wvistau64 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== wvistau64_zh_CN (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== wvistau64_fr (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== wvistau64_he (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w2008s64 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w7u (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w7pro64 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w8 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
=== w8adm (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w864 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
=== w1064 (32 bit virtual) ===
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 0, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2895: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2909: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3034: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3052: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3133: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3157: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2839: Test failed: expected policy flags 1, got 3
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:2938: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:2953: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3001: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3016: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3197: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3222: Test failed: expected no STATUS_ACCESS_VIOLATION exception, got 1 exceptions
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2801: Test failed: NtSetInformationProcess failed with status c0000022
virtual.c:2840: Test failed: expected policy permanent FALSE, got 1
virtual.c:3259: Test failed: NtSetInformationProcess failed with status c0000022
June 27, 2018
Re: [PATCH] kernel32/tests: Avoid ARRAY_SIZE-like macros
by Michael Stefaniuc
On 06/27/2018 09:07 PM, Marvin wrote:
> Hi,
>
> While running your changed tests on Windows, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
> Full results can be found at
> https://testbot.winehq.org/JobDetails.pl?Key=39414
>
> Your paranoid android.
>
>
> === w8 (32 bit comm) ===
> comm.c:859: Test failed: WaitCommEvent failed with a timeout
> comm.c:870: recovering after WAIT_TIMEOUT...
> comm.c:880: Test failed: WaitCommEvent error 0
> comm.c:881: Test failed: WaitCommEvent: expected EV_TXEMPTY, got 0
> comm.c:885: WaitCommEvent for EV_TXEMPTY took 1515 ms (timeout 1500)
> comm.c:886: Test failed: WaitCommEvent used 1515 ms for waiting
> comm.c:1553: test_AbortWaitCts timeout 500 handle 00000144
> comm.c:1520: Changing CommMask on the fly for handle 00000144 after timeout 500
Flaky tests, see
https://test.winehq.org/data/f637408a23fb0c92e56f677ab1793b66f739b14d/win8_…
The line numbers just changed.
bye
michael
June 27, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by Alex Henrie
On Wed, Jun 27, 2018 at 11:24 AM John Found <johnfound(a)asm32.info> wrote:
>
> While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
>
> for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
> {
> int m = vkey - VK_LSHIFT;
> >>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
> {
> TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
> modifiers[m].vkey, keystate[vkey]);
>
> update_key_state( keystate, vkey, modifiers[m].pressed );
> changed = TRUE;
> }
> }
>
> Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
>
> Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
I don't immediately know what this if statement is for, but I can tell
you that the ! operator converts a value of zero to 1 and a nonzero
value to 0. So, if keystate[vkey] & 0x80 is 0 then
modifiers[m].pressed must be nonzero and vice versa.
-Alex
June 27, 2018
Re: [PATCH] kernel32/tests: Avoid ARRAY_SIZE-like macros
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39414
Your paranoid android.
=== w8 (32 bit comm) ===
comm.c:859: Test failed: WaitCommEvent failed with a timeout
comm.c:870: recovering after WAIT_TIMEOUT...
comm.c:880: Test failed: WaitCommEvent error 0
comm.c:881: Test failed: WaitCommEvent: expected EV_TXEMPTY, got 0
comm.c:885: WaitCommEvent for EV_TXEMPTY took 1515 ms (timeout 1500)
comm.c:886: Test failed: WaitCommEvent used 1515 ms for waiting
comm.c:1553: test_AbortWaitCts timeout 500 handle 00000144
comm.c:1520: Changing CommMask on the fly for handle 00000144 after timeout 500
June 27, 2018
[PATCH] user32/tests: Avoid a variable that holds an ARRAY_SIZE()
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/user32/tests/class.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c
index 92b9ad93a2..9b3b2b30f3 100644
--- a/dlls/user32/tests/class.c
+++ b/dlls/user32/tests/class.c
@@ -645,7 +645,6 @@ static void test_builtinproc(void)
"ScrollBar",
"#32770", /* dialog */
};
- static const int NUM_NORMAL_CLASSES = (sizeof(NORMAL_CLASSES)/sizeof(NORMAL_CLASSES[0]));
static const char classA[] = "deftest";
static const WCHAR classW[] = {'d','e','f','t','e','s','t',0};
WCHAR unistring[] = {0x142, 0x40e, 0x3b4, 0}; /* a string that would be destroyed by a W->A->W conversion */
@@ -656,7 +655,7 @@ static void test_builtinproc(void)
WCHAR buf[128];
ATOM atom;
HWND hwnd;
- int i;
+ unsigned int i;
pDefWindowProcA = (void *)GetProcAddress(GetModuleHandleA("user32.dll"), "DefWindowProcA");
pDefWindowProcW = (void *)GetProcAddress(GetModuleHandleA("user32.dll"), "DefWindowProcW");
@@ -771,7 +770,7 @@ static void test_builtinproc(void)
/* For most of the builtin controls both GetWindowLongPtrA and W returns a pointer that is executed directly
* by CallWindowProcA/W */
- for (i = 0; i < NUM_NORMAL_CLASSES; i++)
+ for (i = 0; i < ARRAY_SIZE(NORMAL_CLASSES); i++)
{
WNDPROC procA, procW;
hwnd = CreateWindowExA(0, NORMAL_CLASSES[i], classA, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 680, 260,
--
2.14.4
June 27, 2018
[PATCH] user32/tests: Don't undefine ARRAY_SIZE()
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/user32/tests/cursoricon.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index 95a6878e9a..3d56815848 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -1328,8 +1328,6 @@ static void test_LoadImage(void)
test_LoadImageFile("Cursor (invalid dwDIBOffset)", invalid_dwDIBOffset, sizeof(invalid_dwDIBOffset), "cur", 0);
}
-#undef ARRAY_SIZE
-
static void test_CreateIconFromResource(void)
{
HANDLE handle;
--
2.14.4
June 27, 2018
[PATCH] comdlg32/tests: Don't undefine ARRAY_SIZE()
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/comdlg32/tests/filedlg.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/dlls/comdlg32/tests/filedlg.c b/dlls/comdlg32/tests/filedlg.c
index aedb18a192..bf4d1f22eb 100644
--- a/dlls/comdlg32/tests/filedlg.c
+++ b/dlls/comdlg32/tests/filedlg.c
@@ -1116,9 +1116,6 @@ static void test_extension(void)
test_extension_helper(&ofn, "TestFilter (*.*.def)\0*.*.def\0", "deadbeef.xyz");
}
-#undef ARRAY_SIZE
-
-
static BOOL WINAPI test_null_enum(HWND hwnd, LPARAM lParam)
{
/* Find the textbox and send a filename so IDOK will work.
--
2.14.4
June 27, 2018
[PATCH] kernel32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/kernel32/tests/actctx.c | 30 +++++++--------
dlls/kernel32/tests/atom.c | 4 +-
dlls/kernel32/tests/codepage.c | 64 +++++++++++++++----------------
dlls/kernel32/tests/comm.c | 4 +-
dlls/kernel32/tests/console.c | 68 ++++++++++++++++-----------------
dlls/kernel32/tests/file.c | 38 +++++++++----------
dlls/kernel32/tests/heap.c | 2 +-
dlls/kernel32/tests/loader.c | 18 ++++-----
dlls/kernel32/tests/module.c | 13 ++++---
dlls/kernel32/tests/path.c | 86 +++++++++++++++++++++---------------------
dlls/kernel32/tests/pipe.c | 5 +--
dlls/kernel32/tests/process.c | 10 ++---
dlls/kernel32/tests/profile.c | 12 +++---
dlls/kernel32/tests/resource.c | 2 +-
dlls/kernel32/tests/thread.c | 2 +-
dlls/kernel32/tests/version.c | 2 +-
dlls/kernel32/tests/virtual.c | 20 +++++-----
dlls/kernel32/tests/volume.c | 4 +-
18 files changed, 191 insertions(+), 193 deletions(-)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index 8c9ac79db3..96d9b8cbb6 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -533,7 +533,7 @@ static int strcmp_aw(LPCWSTR strw, const char *stra)
WCHAR buf[1024];
if (!stra) return 1;
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
@@ -550,7 +550,7 @@ static BOOL create_manifest_file(const char *filename, const char *manifest, int
WCHAR path[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, filename, -1, path, MAX_PATH );
- GetFullPathNameW(path, sizeof(manifest_path)/sizeof(WCHAR), manifest_path, NULL);
+ GetFullPathNameW(path, ARRAY_SIZE(manifest_path), manifest_path, NULL);
if (manifest_len == -1)
manifest_len = strlen(manifest);
@@ -566,7 +566,7 @@ static BOOL create_manifest_file(const char *filename, const char *manifest, int
if (depmanifest)
{
MultiByteToWideChar( CP_ACP, 0, depfile, -1, path, MAX_PATH );
- GetFullPathNameW(path, sizeof(depmanifest_path)/sizeof(WCHAR), depmanifest_path, NULL);
+ GetFullPathNameW(path, ARRAY_SIZE(depmanifest_path), depmanifest_path, NULL);
file = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError());
@@ -2558,7 +2558,7 @@ static void init_paths(void)
static const WCHAR backslash[] = {'\\',0};
static const WCHAR subdir[] = {'T','e','s','t','S','u','b','d','i','r','\\',0};
- GetModuleFileNameW(NULL, exe_path, sizeof(exe_path)/sizeof(WCHAR));
+ GetModuleFileNameW(NULL, exe_path, ARRAY_SIZE(exe_path));
lstrcpyW(app_dir, exe_path);
for(ptr=app_dir+lstrlenW(app_dir); *ptr != '\\' && *ptr != '/'; ptr--);
ptr[1] = 0;
@@ -2570,7 +2570,7 @@ static void init_paths(void)
lstrcpyW(work_dir_subdir, work_dir);
lstrcatW(work_dir_subdir, subdir);
- GetModuleFileNameW(NULL, app_manifest_path, sizeof(app_manifest_path)/sizeof(WCHAR));
+ GetModuleFileNameW(NULL, app_manifest_path, ARRAY_SIZE(app_manifest_path));
lstrcpyW(app_manifest_path+lstrlenW(app_manifest_path), dot_manifest);
}
@@ -2580,7 +2580,7 @@ static void write_manifest(const char *filename, const char *manifest)
DWORD size;
CHAR path[MAX_PATH];
- GetTempPathA(sizeof(path)/sizeof(CHAR), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, filename);
file = CreateFileA(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -2593,7 +2593,7 @@ static void delete_manifest_file(const char *filename)
{
CHAR path[MAX_PATH];
- GetTempPathA(sizeof(path)/sizeof(CHAR), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, filename);
DeleteFileA(path);
}
@@ -2604,7 +2604,7 @@ static void test_CreateActCtx(void)
ACTCTXA actctx;
HANDLE handle;
- GetTempPathA(sizeof(path)/sizeof(CHAR), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, "main_wndcls.manifest");
write_manifest("testdep1.manifest", manifest_wndcls1);
@@ -2621,7 +2621,7 @@ static void test_CreateActCtx(void)
pReleaseActCtx(handle);
/* with specified directory, that doesn't contain dependent assembly */
- GetWindowsDirectoryA(dir, sizeof(dir)/sizeof(CHAR));
+ GetWindowsDirectoryA(dir, ARRAY_SIZE(dir));
memset(&actctx, 0, sizeof(ACTCTXA));
actctx.cbSize = sizeof(ACTCTXA);
@@ -2667,7 +2667,7 @@ todo_wine
/* load manifest from lpAssemblyDirectory directory */
write_manifest("testdir.manifest", manifest1);
- GetTempPathA(sizeof(path)/sizeof(path[0]), path);
+ GetTempPathA(ARRAY_SIZE(path), path);
SetCurrentDirectoryA(path);
strcat(path, "assembly_dir");
strcpy(dir, path);
@@ -3048,14 +3048,14 @@ static void test_settings(void)
ret = pQueryActCtxSettingsW( 0, handle, namespace2005W, dpiAwareW, buffer, 80, &size );
ok( ret, "QueryActCtxSettingsW failed err %u\n", GetLastError() );
ok( !lstrcmpW( buffer, trueW ), "got %s\n", wine_dbgstr_w(buffer) );
- ok( size == sizeof(trueW)/sizeof(WCHAR), "wrong len %lu\n", size );
+ ok( size == ARRAY_SIZE(trueW), "wrong len %lu\n", size );
SetLastError( 0xdeadbeef );
size = 0xdead;
memset( buffer, 0xcc, sizeof(buffer) );
ret = pQueryActCtxSettingsW( 0, handle, namespace2005W, dpiAwareW, buffer, lstrlenW(trueW) + 1, &size );
ok( ret, "QueryActCtxSettingsW failed err %u\n", GetLastError() );
ok( !lstrcmpW( buffer, trueW ), "got %s\n", wine_dbgstr_w(buffer) );
- ok( size == sizeof(trueW)/sizeof(WCHAR), "wrong len %lu\n", size );
+ ok( size == ARRAY_SIZE(trueW), "wrong len %lu\n", size );
SetLastError( 0xdeadbeef );
size = 0xdead;
memset( buffer, 0xcc, sizeof(buffer) );
@@ -3087,7 +3087,7 @@ static void test_settings(void)
if (ret)
{
ok( !lstrcmpW( buffer, trueW ), "got %s\n", wine_dbgstr_w(buffer) );
- ok( size == sizeof(trueW)/sizeof(WCHAR), "wrong len %lu\n", size );
+ ok( size == ARRAY_SIZE(trueW), "wrong len %lu\n", size );
}
else ok( buffer[0] == 0xcccc, "got %s\n", wine_dbgstr_w(buffer) );
SetLastError( 0xdeadbeef );
@@ -3096,7 +3096,7 @@ static void test_settings(void)
ret = pQueryActCtxSettingsW( 0, handle, NULL, dpiAwareW, buffer, lstrlenW(trueW), &size );
ok( ret, "QueryActCtxSettingsW failed err %u\n", GetLastError() );
ok( !lstrcmpW( buffer, trueW ), "got %s\n", wine_dbgstr_w(buffer) );
- ok( size == sizeof(trueW)/sizeof(WCHAR), "wrong len %lu\n", size );
+ ok( size == ARRAY_SIZE(trueW), "wrong len %lu\n", size );
SetLastError( 0xdeadbeef );
size = 0xdead;
memset( buffer, 0xcc, sizeof(buffer) );
@@ -3104,7 +3104,7 @@ static void test_settings(void)
ok( !ret, "QueryActCtxSettingsW failed err %u\n", GetLastError() );
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "wrong error %u\n", GetLastError() );
ok( buffer[0] == 0xcccc, "got %s\n", wine_dbgstr_w(buffer) );
- ok( size == sizeof(trueW)/sizeof(WCHAR), "wrong len %lu\n", size );
+ ok( size == ARRAY_SIZE(trueW), "wrong len %lu\n", size );
pReleaseActCtx(handle);
create_manifest_file( "manifest_settings2.manifest", settings_manifest2, -1, NULL, NULL );
diff --git a/dlls/kernel32/tests/atom.c b/dlls/kernel32/tests/atom.c
index 0c1740869a..ad9e91ba25 100644
--- a/dlls/kernel32/tests/atom.c
+++ b/dlls/kernel32/tests/atom.c
@@ -276,7 +276,7 @@ static void test_get_atom_name(void)
do_initW(inW, "abcdefghij", 255);
atom = GlobalAddAtomW(inW);
ok(atom, "couldn't add atom for %s\n", in);
- len = GlobalGetAtomNameW(atom, outW, sizeof(outW)/sizeof(outW[0]));
+ len = GlobalGetAtomNameW(atom, outW, ARRAY_SIZE(outW));
ok(len == 255, "length mismatch (%u instead of 255)\n", len);
for (i = 0; i < 255; i++)
{
@@ -537,7 +537,7 @@ static void test_local_get_atom_name(void)
do_initW(inW, "abcdefghij", 255);
atom = AddAtomW(inW);
ok(atom, "couldn't add atom for %s\n", in);
- len = GetAtomNameW(atom, outW, sizeof(outW)/sizeof(outW[0]));
+ len = GetAtomNameW(atom, outW, ARRAY_SIZE(outW));
ok(len == 255, "length mismatch (%u instead of 255)\n", len);
for (i = 0; i < 255; i++)
{
diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c
index 7389d93276..b15a3a10a7 100644
--- a/dlls/kernel32/tests/codepage.c
+++ b/dlls/kernel32/tests/codepage.c
@@ -205,7 +205,7 @@ static void test_other_invalid_parameters(void)
char c_string[] = "Hello World";
size_t c_string_len = sizeof(c_string);
WCHAR w_string[] = {'H','e','l','l','o',' ','W','o','r','l','d',0};
- size_t w_string_len = sizeof(w_string) / sizeof(WCHAR);
+ size_t w_string_len = ARRAY_SIZE(w_string);
BOOL used;
INT len;
@@ -683,7 +683,7 @@ static void test_utf7_encoding(void)
i, expected_len, expected_len, output[expected_len]);
}
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
memset(output, '#', sizeof(output) - 1);
output[sizeof(output) - 1] = 0;
@@ -746,12 +746,12 @@ static void test_utf7_decoding(void)
{
/* tests string conversion with srclen=-1 */
{
- "+T2BZfQ-", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2BZfQ-", -1, output, ARRAY_SIZE(output) - 1,
{0x4F60,0x597D,0}, 3, 3
},
/* tests string conversion with srclen=-2 */
{
- "+T2BZfQ-", -2, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2BZfQ-", -2, output, ARRAY_SIZE(output) - 1,
{0x4F60,0x597D,0}, 3, 3
},
/* tests string conversion with dstlen=strlen(expected_dst) */
@@ -781,72 +781,72 @@ static void test_utf7_decoding(void)
},
/* tests ill-formed UTF-7: 6 bits, not enough for a byte pair */
{
- "+T-+T-+T-hello", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T-+T-+T-hello", -1, output, ARRAY_SIZE(output) - 1,
{'h','e','l','l','o',0}, 6, 6
},
/* tests ill-formed UTF-7: 12 bits, not enough for a byte pair */
{
- "+T2-+T2-+T2-hello", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2-+T2-+T2-hello", -1, output, ARRAY_SIZE(output) - 1,
{'h','e','l','l','o',0}, 6, 6
},
/* tests ill-formed UTF-7: 18 bits, not a multiple of 16 and the last bit is a 1 */
{
- "+T2B-+T2B-+T2B-hello", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2B-+T2B-+T2B-hello", -1, output, ARRAY_SIZE(output) - 1,
{0x4F60,0x4F60,0x4F60,'h','e','l','l','o',0}, 9, 9
},
/* tests ill-formed UTF-7: 24 bits, a multiple of 8 but not a multiple of 16 */
{
- "+T2BZ-+T2BZ-+T2BZ-hello", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2BZ-+T2BZ-+T2BZ-hello", -1, output, ARRAY_SIZE(output) - 1,
{0x4F60,0x4F60,0x4F60,'h','e','l','l','o',0}, 9, 9
},
/* tests UTF-7 followed by characters that should be encoded but aren't */
{
- "+T2BZ-\x82\xFE", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2BZ-\x82\xFE", -1, output, ARRAY_SIZE(output) - 1,
{0x4F60,0x0082,0x00FE,0}, 4, 4
},
/* tests srclen > strlen(src) */
{
- "a\0b", 4, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "a\0b", 4, output, ARRAY_SIZE(output) - 1,
{'a',0,'b',0}, 4, 4
},
/* tests srclen < strlen(src) outside of a UTF-7 sequence */
{
- "hello", 2, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "hello", 2, output, ARRAY_SIZE(output) - 1,
{'h','e'}, 2, 2
},
/* tests srclen < strlen(src) inside of a UTF-7 sequence */
{
- "+T2BZfQ-", 4, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2BZfQ-", 4, output, ARRAY_SIZE(output) - 1,
{0x4F60}, 1, 1
},
/* tests srclen < strlen(src) right at the beginning of a UTF-7 sequence */
{
- "hi+T2A-", 3, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "hi+T2A-", 3, output, ARRAY_SIZE(output) - 1,
{'h','i'}, 2, 2
},
/* tests srclen < strlen(src) right at the end of a UTF-7 sequence */
{
- "+T2A-hi", 5, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+T2A-hi", 5, output, ARRAY_SIZE(output) - 1,
{0x4F60}, 1, 1
},
/* tests srclen < strlen(src) at the beginning of an escaped + sign */
{
- "hi+-", 3, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "hi+-", 3, output, ARRAY_SIZE(output) - 1,
{'h','i'}, 2, 2
},
/* tests srclen < strlen(src) at the end of an escaped + sign */
{
- "+-hi", 2, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+-hi", 2, output, ARRAY_SIZE(output) - 1,
{'+'}, 1, 1
},
/* tests len=0 but no error */
{
- "+", 1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "+", 1, output, ARRAY_SIZE(output) - 1,
{}, 0, 0
},
/* tests a single null char */
{
- "", -1, output, sizeof(output) / sizeof(WCHAR) - 1,
+ "", -1, output, ARRAY_SIZE(output) - 1,
{0}, 1, 1
},
/* tests a buffer that runs out while not decoding a UTF-7 sequence */
@@ -867,9 +867,9 @@ static void test_utf7_decoding(void)
sprintf(input, "+%c+AAA", i);
memset(output, 0x23, sizeof(output) - sizeof(WCHAR));
- output[sizeof(output) / sizeof(WCHAR) - 1] = 0;
+ output[ARRAY_SIZE(output) - 1] = 0;
- len = MultiByteToWideChar(CP_UTF7, 0, input, 7, output, sizeof(output) / sizeof(WCHAR) - 1);
+ len = MultiByteToWideChar(CP_UTF7, 0, input, 7, output, ARRAY_SIZE(output) - 1);
if (i == '-')
{
@@ -909,9 +909,9 @@ static void test_utf7_decoding(void)
sprintf(input, "+B%c+AAA", i);
memset(output, 0x23, sizeof(output) - sizeof(WCHAR));
- output[sizeof(output) / sizeof(WCHAR) - 1] = 0;
+ output[ARRAY_SIZE(output) - 1] = 0;
- len = MultiByteToWideChar(CP_UTF7, 0, input, 8, output, sizeof(output) / sizeof(WCHAR) - 1);
+ len = MultiByteToWideChar(CP_UTF7, 0, input, 8, output, ARRAY_SIZE(output) - 1);
if (i == '-')
{
@@ -955,10 +955,10 @@ static void test_utf7_decoding(void)
i, wine_dbgstr_wn(expected, expected_len + 1), wine_dbgstr_wn(output, expected_len + 1));
}
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
memset(output, 0x23, sizeof(output) - sizeof(WCHAR));
- output[sizeof(output) / sizeof(WCHAR) - 1] = 0;
+ output[ARRAY_SIZE(output) - 1] = 0;
SetLastError(0xdeadbeef);
len = MultiByteToWideChar(CP_UTF7, 0, tests[i].src, tests[i].srclen,
@@ -1004,7 +1004,7 @@ static void test_undefined_byte_char(void)
};
INT i, ret;
- for (i = 0; i < (sizeof(testset) / sizeof(testset[0])); i++) {
+ for (i = 0; i < ARRAY_SIZE(testset); i++) {
if (! IsValidCodePage(testset[i].codepage))
{
skip("Codepage %d not available\n", testset[i].codepage);
@@ -1106,7 +1106,7 @@ static void test_threadcp(void)
last = GetThreadLocale();
acp = GetACP();
- for (i = 0; i < sizeof(lcids)/sizeof(lcids[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(lcids); i++)
{
SetThreadLocale(lcids[i].lcid);
@@ -1151,7 +1151,7 @@ static void test_threadcp(void)
}
/* IsDBCSLeadByteEx - locales without codepage */
- for (i = 0; i < sizeof(isleads_nocp)/sizeof(isleads_nocp[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(isleads_nocp); i++)
{
SetThreadLocale(isleads_nocp[i].lcid);
@@ -1163,7 +1163,7 @@ static void test_threadcp(void)
}
/* IsDBCSLeadByteEx - locales with codepage */
- for (i = 0; i < sizeof(isleads)/sizeof(isleads[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(isleads); i++)
{
SetThreadLocale(isleads[i].lcid);
@@ -1194,7 +1194,7 @@ static void test_dbcs_to_widechar(void)
MB_COMPOSITE |MB_ERR_INVALID_CHARS|MB_USEGLYPHCHARS,
};
- for (i = 0; i < sizeof(flags)/sizeof(DWORD); ++i)
+ for (i = 0; i < ARRAY_SIZE(flags); ++i)
{
memset(wbuf, 0xff, sizeof(wbuf));
count = MultiByteToWideChar(936, flags[i], (char*)&buf[0], 2, NULL, 0);
@@ -1206,7 +1206,7 @@ static void test_dbcs_to_widechar(void)
ok(wbuf[1] == 0xffff, "%04x: returned %04x (expected ffff)\n", flags[i], wbuf[1]);
}
- for (i = 0; i < sizeof(flags)/sizeof(DWORD); ++i)
+ for (i = 0; i < ARRAY_SIZE(flags); ++i)
{
memset(wbuf, 0xff, sizeof(wbuf));
count = MultiByteToWideChar(936, flags[i], (char*)&buf[0], 3, NULL, 0);
@@ -1232,7 +1232,7 @@ static void test_dbcs_to_widechar(void)
}
/* src ends with null character */
- for (i = 0; i < sizeof(flags)/sizeof(DWORD); ++i)
+ for (i = 0; i < ARRAY_SIZE(flags); ++i)
{
memset(wbuf, 0xff, sizeof(wbuf));
count = MultiByteToWideChar(936, flags[i], (char*)&buf[0], 4, NULL, 0);
@@ -1261,7 +1261,7 @@ static void test_dbcs_to_widechar(void)
}
/* src has null character, but not ends with it */
- for (i = 0; i < sizeof(flags)/sizeof(DWORD); ++i)
+ for (i = 0; i < ARRAY_SIZE(flags); ++i)
{
memset(wbuf, 0xff, sizeof(wbuf));
count = MultiByteToWideChar(936, flags[i], (char*)&buf[0], 5, NULL, 0);
diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c
index d671e40f87..97a71358fe 100644
--- a/dlls/kernel32/tests/comm.c
+++ b/dlls/kernel32/tests/comm.c
@@ -580,7 +580,7 @@ static void test_BuildCommDCBW(const char *string, const TEST *ptest, int initia
WCHAR wide_string[sizeof(ptest->string)];
static int reportedDCBW = 0;
- MultiByteToWideChar(CP_ACP, 0, string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, string, -1, wide_string, ARRAY_SIZE(wide_string));
/* set initial conditions */
memset(&dcb, initial_value, sizeof(DCB));
@@ -608,7 +608,7 @@ static void test_BuildCommDCBAndTimeoutsW(const char *string, const TEST *ptest,
WCHAR wide_string[sizeof(ptest->string)];
static int reportedDCBAndTW = 0;
- MultiByteToWideChar(CP_ACP, 0, string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, string, -1, wide_string, ARRAY_SIZE(wide_string));
/* set initial conditions */
memset(&dcb, initial_value, sizeof(DCB));
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 926c052686..ac77ab76b0 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -982,7 +982,7 @@ static void test_GetSetConsoleInputExeName(void)
GetModuleFileNameA(GetModuleHandleA(NULL), module, sizeof(module));
p = strrchr(module, '\\') + 1;
- ret = pGetConsoleInputExeNameA(sizeof(buffer)/sizeof(buffer[0]), buffer);
+ ret = pGetConsoleInputExeNameA(ARRAY_SIZE(buffer), buffer);
ok(ret, "GetConsoleInputExeNameA failed\n");
todo_wine ok(!lstrcmpA(buffer, p), "got %s expected %s\n", buffer, p);
@@ -1001,7 +1001,7 @@ static void test_GetSetConsoleInputExeName(void)
ret = pSetConsoleInputExeNameA(input_exe);
ok(ret, "SetConsoleInputExeNameA failed\n");
- ret = pGetConsoleInputExeNameA(sizeof(buffer)/sizeof(buffer[0]), buffer);
+ ret = pGetConsoleInputExeNameA(ARRAY_SIZE(buffer), buffer);
ok(ret, "GetConsoleInputExeNameA failed\n");
ok(!lstrcmpA(buffer, input_exe), "got %s expected %s\n", buffer, input_exe);
}
@@ -1074,7 +1074,7 @@ static void test_OpenCON(void)
unsigned i;
HANDLE h;
- for (i = 0; i < sizeof(accesses) / sizeof(accesses[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(accesses); i++)
{
h = CreateFileW(conW, GENERIC_WRITE, 0, NULL, accesses[i], 0, NULL);
ok(h != INVALID_HANDLE_VALUE || broken(accesses[i] == TRUNCATE_EXISTING /* Win8 */),
@@ -1179,7 +1179,7 @@ static void test_OpenConsoleW(void)
return;
}
- for (index = 0; index < sizeof(invalid_table)/sizeof(invalid_table[0]); index++)
+ for (index = 0; index < ARRAY_SIZE(invalid_table); index++)
{
SetLastError(0xdeadbeef);
ret = pOpenConsoleW(invalid_table[index].name, invalid_table[index].access,
@@ -1193,7 +1193,7 @@ static void test_OpenConsoleW(void)
invalid_table[index].gle, invalid_table[index].gle2, index, gle);
}
- for (index = 0; index < sizeof(valid_table)/sizeof(valid_table[0]); index++)
+ for (index = 0; index < ARRAY_SIZE(valid_table); index++)
{
ret = pOpenConsoleW(valid_table[index].name, valid_table[index].access,
valid_table[index].inherit, valid_table[index].creation);
@@ -1248,7 +1248,7 @@ static void test_CreateFileW(void)
HANDLE ret;
SECURITY_ATTRIBUTES sa;
- for (index = 0; index < sizeof(cf_table)/sizeof(cf_table[0]); index++)
+ for (index = 0; index < ARRAY_SIZE(cf_table); index++)
{
SetLastError(0xdeadbeef);
@@ -1380,7 +1380,7 @@ static void test_GetNumberOfConsoleInputEvents(HANDLE input_handle)
{INVALID_HANDLE_VALUE, &count, ERROR_INVALID_HANDLE},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
SetLastError(0xdeadbeef);
if (invalid_table[i].nrofevents) count = 0xdeadbeef;
@@ -1481,7 +1481,7 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
event.EventType = MOUSE_EVENT;
event.Event.MouseEvent = mouse_event;
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win_crash)
continue;
@@ -1541,31 +1541,31 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
ret = FlushConsoleInputBuffer(input_handle);
ok(ret == TRUE, "Expected FlushConsoleInputBuffer to return TRUE, got %d\n", ret);
- for (i = 0; i < sizeof(event_list)/sizeof(event_list[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(event_list); i++)
{
event_list[i].EventType = MOUSE_EVENT;
event_list[i].Event.MouseEvent = mouse_event;
}
/* Writing consecutive chunks of mouse events appears to work. */
- ret = WriteConsoleInputA(input_handle, event_list, sizeof(event_list)/sizeof(event_list[0]), &count);
+ ret = WriteConsoleInputA(input_handle, event_list, ARRAY_SIZE(event_list), &count);
ok(ret == TRUE, "Expected WriteConsoleInputA to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
- ret = WriteConsoleInputA(input_handle, event_list, sizeof(event_list)/sizeof(event_list[0]), &count);
+ ret = WriteConsoleInputA(input_handle, event_list, ARRAY_SIZE(event_list), &count);
ok(ret == TRUE, "Expected WriteConsoleInputA to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
- ok(count == 2*sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == 2*ARRAY_SIZE(event_list),
"Expected count to be twice event list length, got %u\n", count);
/* Again, writing a single mouse event with adjacent mouse events queued doesn't appear to affect the count. */
@@ -1576,7 +1576,7 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
todo_wine
- ok(count == 2*sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == 2*ARRAY_SIZE(event_list),
"Expected count to be twice event list length, got %u\n", count);
ret = FlushConsoleInputBuffer(input_handle);
@@ -1718,7 +1718,7 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
event.EventType = MOUSE_EVENT;
event.Event.MouseEvent = mouse_event;
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win_crash)
continue;
@@ -1778,31 +1778,31 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
ret = FlushConsoleInputBuffer(input_handle);
ok(ret == TRUE, "Expected FlushConsoleInputBuffer to return TRUE, got %d\n", ret);
- for (i = 0; i < sizeof(event_list)/sizeof(event_list[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(event_list); i++)
{
event_list[i].EventType = MOUSE_EVENT;
event_list[i].Event.MouseEvent = mouse_event;
}
/* Writing consecutive chunks of mouse events appears to work. */
- ret = WriteConsoleInputW(input_handle, event_list, sizeof(event_list)/sizeof(event_list[0]), &count);
+ ret = WriteConsoleInputW(input_handle, event_list, ARRAY_SIZE(event_list), &count);
ok(ret == TRUE, "Expected WriteConsoleInputW to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
- ret = WriteConsoleInputW(input_handle, event_list, sizeof(event_list)/sizeof(event_list[0]), &count);
+ ret = WriteConsoleInputW(input_handle, event_list, ARRAY_SIZE(event_list), &count);
ok(ret == TRUE, "Expected WriteConsoleInputW to return TRUE, got %d\n", ret);
- ok(count == sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == ARRAY_SIZE(event_list),
"Expected count to be event list length, got %u\n", count);
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
- ok(count == 2*sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == 2*ARRAY_SIZE(event_list),
"Expected count to be twice event list length, got %u\n", count);
/* Again, writing a single mouse event with adjacent mouse events queued doesn't appear to affect the count. */
@@ -1813,7 +1813,7 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
ret = GetNumberOfConsoleInputEvents(input_handle, &count);
ok(ret == TRUE, "Expected GetNumberOfConsoleInputEvents to return TRUE, got %d\n", ret);
todo_wine
- ok(count == 2*sizeof(event_list)/sizeof(event_list[0]),
+ ok(count == 2*ARRAY_SIZE(event_list),
"Expected count to be twice event list length, got %u\n", count);
ret = FlushConsoleInputBuffer(input_handle);
@@ -1932,7 +1932,7 @@ static void test_WriteConsoleOutputCharacterA(HANDLE output_handle)
{output_handle, output, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2016,7 +2016,7 @@ static void test_WriteConsoleOutputCharacterW(HANDLE output_handle)
{output_handle, outputW, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2099,7 +2099,7 @@ static void test_WriteConsoleOutputAttribute(HANDLE output_handle)
{output_handle, &attr, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2169,7 +2169,7 @@ static void test_FillConsoleOutputCharacterA(HANDLE output_handle)
{output_handle, 'a', 1, {0, 0}, NULL, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2228,7 +2228,7 @@ static void test_FillConsoleOutputCharacterW(HANDLE output_handle)
{output_handle, 'a', 1, {0, 0}, NULL, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2287,7 +2287,7 @@ static void test_FillConsoleOutputAttribute(HANDLE output_handle)
{output_handle, FOREGROUND_BLUE, 1, {0, 0}, NULL, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2365,7 +2365,7 @@ static void test_ReadConsoleOutputCharacterA(HANDLE output_handle)
{output_handle, &read, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2449,7 +2449,7 @@ static void test_ReadConsoleOutputCharacterW(HANDLE output_handle)
{output_handle, &read, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
@@ -2532,7 +2532,7 @@ static void test_ReadConsoleOutputAttribute(HANDLE output_handle)
{output_handle, &attr, 1, {0, 0}, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
};
- for (i = 0; i < sizeof(invalid_table)/sizeof(invalid_table[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_table); i++)
{
if (invalid_table[i].win7_crash)
continue;
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 410c3f0591..1c4157279b 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -1836,7 +1836,7 @@ static void test_DeleteFileW( void )
/* test DeleteFile on empty directory */
ret = GetTempPathW(MAX_PATH, pathW);
- if (ret + sizeof(dirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH)
+ if (ret + ARRAY_SIZE(dirW)-1 + ARRAY_SIZE(subdirW)-1 >= MAX_PATH)
{
ok(0, "MAX_PATH exceeded in constructing paths\n");
return;
@@ -2366,9 +2366,9 @@ static void test_file_sharing(void)
return;
}
- for (a1 = 0; a1 < sizeof(access_modes)/sizeof(access_modes[0]); a1++)
+ for (a1 = 0; a1 < ARRAY_SIZE(access_modes); a1++)
{
- for (s1 = 0; s1 < sizeof(sharing_modes)/sizeof(sharing_modes[0]); s1++)
+ for (s1 = 0; s1 < ARRAY_SIZE(sharing_modes); s1++)
{
SetLastError(0xdeadbeef);
h = CreateFileA( filename, access_modes[a1].dw, sharing_modes[s1].dw,
@@ -2378,9 +2378,9 @@ static void test_file_sharing(void)
ok(0,"couldn't create file \"%s\" (err=%d)\n",filename,GetLastError());
return;
}
- for (a2 = 0; a2 < sizeof(access_modes)/sizeof(access_modes[0]); a2++)
+ for (a2 = 0; a2 < ARRAY_SIZE(access_modes); a2++)
{
- for (s2 = 0; s2 < sizeof(sharing_modes)/sizeof(sharing_modes[0]); s2++)
+ for (s2 = 0; s2 < ARRAY_SIZE(sharing_modes); s2++)
{
SetLastError(0xdeadbeef);
h2 = CreateFileA( filename, access_modes[a2].dw, sharing_modes[s2].dw,
@@ -2411,7 +2411,7 @@ static void test_file_sharing(void)
}
}
- for (a1 = 0; a1 < sizeof(mapping_modes)/sizeof(mapping_modes[0]); a1++)
+ for (a1 = 0; a1 < ARRAY_SIZE(mapping_modes); a1++)
{
HANDLE m;
@@ -2428,9 +2428,9 @@ static void test_file_sharing(void)
CloseHandle( h );
if (!m) continue;
- for (a2 = 0; a2 < sizeof(access_modes)/sizeof(access_modes[0]); a2++)
+ for (a2 = 0; a2 < ARRAY_SIZE(access_modes); a2++)
{
- for (s2 = 0; s2 < sizeof(sharing_modes)/sizeof(sharing_modes[0]); s2++)
+ for (s2 = 0; s2 < ARRAY_SIZE(sharing_modes); s2++)
{
SetLastError(0xdeadbeef);
h2 = CreateFileA( filename, access_modes[a2].dw, sharing_modes[s2].dw,
@@ -2861,10 +2861,10 @@ static void test_FindFirstFile_wildcards(void)
CreateDirectoryA("test-dir", NULL);
SetCurrentDirectoryA("test-dir");
- for (i = 0; i < sizeof(files) / sizeof(files[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(files); ++i)
_lclose(_lcreat(files[i], 0));
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
char correct[512];
char incorrect[512];
@@ -2901,7 +2901,7 @@ static void test_FindFirstFile_wildcards(void)
missing[0] ? missing+2 : "none");
}
- for (i = 0; i < sizeof(files) / sizeof(files[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(files); ++i)
DeleteFileA(files[i]);
SetCurrentDirectoryA("..");
RemoveDirectoryA("test-dir");
@@ -3007,7 +3007,7 @@ static void test_async_file_errors(void)
ovl.hEvent = hSem;
completion_count = 0;
szFile[0] = '\0';
- GetWindowsDirectoryA(szFile, sizeof(szFile)/sizeof(szFile[0])-1-strlen("\\win.ini"));
+ GetWindowsDirectoryA(szFile, ARRAY_SIZE(szFile)-1-strlen("\\win.ini"));
strcat(szFile, "\\win.ini");
hFile = CreateFileA(szFile, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
@@ -3881,7 +3881,7 @@ todo_wine_if (i == 1)
}
}
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
hfile = CreateFileA(file_name, td[i].access, 0, NULL, td[i].disposition, 0, 0);
@@ -3987,7 +3987,7 @@ static void test_GetFileInformationByHandleEx(void)
ok(directory != INVALID_HANDLE_VALUE, "GetFileInformationByHandleEx: failed to open the temp folder, "
"got error %u.\n", GetLastError());
- for (i = 0; i < sizeof(checks) / sizeof(checks[0]); i += 1)
+ for (i = 0; i < ARRAY_SIZE(checks); i += 1)
{
SetLastError(0xdeadbeef);
ret = pGetFileInformationByHandleEx(directory, checks[i].handleClass, checks[i].ptr, checks[i].size);
@@ -4129,7 +4129,7 @@ static void test_OpenFileById(void)
ok(ret2 != INVALID_FILE_ATTRIBUTES,
"OpenFileById: GetFileAttributesA failed to find the temp file, got error %u\n", GetLastError());
- ret2 = MultiByteToWideChar(CP_ACP, 0, tempFileName + strlen(tempPath), -1, tempFileNameW, sizeof(tempFileNameW)/sizeof(tempFileNameW[0]));
+ ret2 = MultiByteToWideChar(CP_ACP, 0, tempFileName + strlen(tempPath), -1, tempFileNameW, ARRAY_SIZE(tempFileNameW));
ok(ret2, "OpenFileById: MultiByteToWideChar failed to convert tempFileName, got error %u.\n", GetLastError());
tempFileNameLen = ret2 - 1;
@@ -4587,7 +4587,7 @@ static void test_file_access(void)
GetTempPathA(MAX_PATH, path);
GetTempFileNameA(path, "foo", 0, fname);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
hfile = CreateFileA(fname, td[i].access, 0, NULL, CREATE_ALWAYS,
@@ -4601,7 +4601,7 @@ static void test_file_access(void)
else
ok(hfile != INVALID_HANDLE_VALUE, "%d: CreateFile error %d\n", i, GetLastError());
- for (j = 0; j < sizeof(td)/sizeof(td[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(td); j++)
{
SetLastError(0xdeadbeef);
ret = DuplicateHandle(GetCurrentProcess(), hfile, GetCurrentProcess(), &hdup,
@@ -4843,7 +4843,7 @@ static void test_GetFinalPathNameByHandleW(void)
success = GetVolumePathNameW(long_path, drive_part, MAX_PATH);
ok(success, "GetVolumePathNameW error %u\n", GetLastError());
- success = GetVolumeNameForVolumeMountPointW(drive_part, volume_path, sizeof(volume_path) / sizeof(WCHAR));
+ success = GetVolumeNameForVolumeMountPointW(drive_part, volume_path, ARRAY_SIZE(volume_path));
ok(success, "GetVolumeNameForVolumeMountPointW error %u\n", GetLastError());
/* Test for VOLUME_NAME_GUID */
@@ -4863,7 +4863,7 @@ static void test_GetFinalPathNameByHandleW(void)
wine_dbgstr_w(file_part), wine_dbgstr_w(result_path));
drive_part[lstrlenW(drive_part)-1] = 0;
- success = QueryDosDeviceW(drive_part, nt_path, sizeof(nt_path) / sizeof(WCHAR));
+ success = QueryDosDeviceW(drive_part, nt_path, ARRAY_SIZE(nt_path));
ok(success, "QueryDosDeviceW error %u\n", GetLastError());
/* Test for VOLUME_NAME_NT */
diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index fefd3e7956..38fae0eede 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -823,7 +823,7 @@ static void test_obsolete_flags(void)
return;
}
- for (i = 0; i < sizeof(test_global_flags)/sizeof(test_global_flags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_global_flags); i++)
{
gbl = GlobalAlloc(test_global_flags[i].flags, 4);
ok(gbl != NULL, "GlobalAlloc failed\n");
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index c9ca02c28e..38ae3685dc 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -697,7 +697,7 @@ static void test_Loader(void)
/* prevent displaying of the "Unable to load this DLL" message box */
SetErrorMode(SEM_FAILCRITICALERRORS);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
nt_header = nt_header_template;
nt_header.FileHeader.NumberOfSections = td[i].number_of_sections;
@@ -922,7 +922,7 @@ static void test_Loader(void)
error_match = FALSE;
for (error_index = 0;
- ! error_match && error_index < sizeof(td[i].errors) / sizeof(DWORD);
+ ! error_match && error_index < ARRAY_SIZE(td[i].errors);
error_index++)
{
error_match = td[i].errors[error_index] == GetLastError();
@@ -1581,7 +1581,7 @@ static void test_VirtualProtect(void *base, void *section)
orig_prot = old_prot;
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
ret = VirtualQuery(section, &info, sizeof(info));
@@ -1712,7 +1712,7 @@ static void test_section_access(void)
GetTempPathA(MAX_PATH, temp_path);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
IMAGE_NT_HEADERS nt_header;
@@ -2028,7 +2028,7 @@ static DWORD WINAPI mutex_thread_proc(void *param)
trace("%04x: mutex_thread_proc: starting\n", GetCurrentThreadId());
while (1)
{
- ret = WaitForMultipleObjects(sizeof(wait_list)/sizeof(wait_list[0]), wait_list, FALSE, 50);
+ ret = WaitForMultipleObjects(ARRAY_SIZE(wait_list), wait_list, FALSE, 50);
if (ret == WAIT_OBJECT_0) break;
else if (ret == WAIT_OBJECT_0 + 1)
{
@@ -3364,7 +3364,7 @@ static void test_ResolveDelayLoadedAPI(void)
section.PointerToRawData = 0x2000;
section.VirtualAddress = 0x2000;
- i = sizeof(td)/sizeof(td[0]);
+ i = ARRAY_SIZE(td);
section.Misc.VirtualSize = sizeof(test_dll) + sizeof(hint) + sizeof(test_func) + sizeof(HMODULE) +
2 * (i + 1) * sizeof(IMAGE_THUNK_DATA);
ok(section.Misc.VirtualSize <= 0x1000, "Too much tests, add a new section!\n");
@@ -3413,7 +3413,7 @@ static void test_ResolveDelayLoadedAPI(void)
SetFilePointer( hfile, idd.ImportAddressTableRVA, NULL, SEEK_SET );
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
/* 0x1a00 is an empty space between delay data and extended delay data, real thunks are not necessary */
itd32.u1.Function = nt_header.OptionalHeader.ImageBase + 0x1a00 + i * 0x20;
@@ -3427,7 +3427,7 @@ static void test_ResolveDelayLoadedAPI(void)
ret = WriteFile(hfile, &itd32, sizeof(itd32), &dummy, NULL);
ok(ret, "WriteFile error %d\n", GetLastError());
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
if (td[i].func)
itd32.u1.AddressOfData = idd.DllNameRVA + sizeof(test_dll);
@@ -3480,7 +3480,7 @@ static void test_ResolveDelayLoadedAPI(void)
itda = RVAToAddr(delaydir->ImportAddressTableRVA, hlib);
htarget = LoadLibraryA(RVAToAddr(delaydir->DllNameRVA, hlib));
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
void *ret, *load;
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index 0b4ce14c46..ba65e0a761 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -39,7 +39,7 @@ static BOOL cmpStrAW(const char* a, const WCHAR* b, DWORD lenA, DWORD lenB)
WCHAR aw[1024];
DWORD len = MultiByteToWideChar( AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0,
- a, lenA, aw, sizeof(aw) / sizeof(aw[0]) );
+ a, lenA, aw, ARRAY_SIZE(aw));
if (len != lenB) return FALSE;
return memcmp(aw, b, len * sizeof(WCHAR)) == 0;
}
@@ -149,7 +149,7 @@ static void testGetModuleFileName(const char* name)
{
memset(bufW, '-', sizeof(bufW));
SetLastError(0xdeadbeef);
- len1W = GetModuleFileNameW(hMod, bufW, sizeof(bufW) / sizeof(WCHAR));
+ len1W = GetModuleFileNameW(hMod, bufW, ARRAY_SIZE(bufW));
ok(GetLastError() == ERROR_SUCCESS ||
broken(GetLastError() == 0xdeadbeef), /* <= XP SP3 */
"LastError was not reset: %u\n", GetLastError());
@@ -191,7 +191,8 @@ static void testGetModuleFileName_Wrong(void)
if (is_unicode_enabled)
{
bufW[0] = '*';
- ok(GetModuleFileNameW((void*)0xffffffff, bufW, sizeof(bufW) / sizeof(WCHAR)) == 0, "Unexpected success in module handle\n");
+ ok(GetModuleFileNameW((void*)0xffffffff, bufW, ARRAY_SIZE(bufW)) == 0,
+ "Unexpected success in module handle\n");
ok(bufW[0] == '*', "When failing, buffer shouldn't be written to\n");
}
@@ -538,7 +539,7 @@ static void test_LoadLibraryEx_search_flags(void)
ok( !mod, "LoadLibrary succeeded\n" );
ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() );
- for (j = 0; j < sizeof(tests) / sizeof(tests[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(tests); j++)
{
for (k = 0; tests[j].add_dirs[k]; k++)
{
@@ -598,7 +599,7 @@ static void testGetDllDirectory(void)
"C:\\Some\\Path\\",
"Q:\\A\\Long\\Path with spaces that\\probably\\doesn't exist!",
};
- const int test_count = sizeof(dll_directories) / sizeof(dll_directories[0]);
+ const int test_count = ARRAY_SIZE(dll_directories);
if (!pGetDllDirectoryA || !pGetDllDirectoryW)
{
@@ -917,7 +918,7 @@ static void test_AddDllDirectory(void)
}
buf[0] = '\0';
- GetTempPathW( sizeof(path)/sizeof(path[0]), path );
+ GetTempPathW(ARRAY_SIZE(path), path );
ret = GetTempFileNameW( path, tmpW, 0, buf );
ok( ret, "GetTempFileName failed err %u\n", GetLastError() );
SetLastError( 0xdeadbeef );
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index 632aefc34e..ca1cbf30ec 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -1018,7 +1018,7 @@ static void test_GetTempPathA(char* tmp_dir)
len = GetTempPathA(slen / 2, buf);
ok(len == slen || broken(len == slen + 1) /* read the big comment above */ ,
"expected %d, got %d\n", slen, len);
- for(len = 0; len < sizeof(buf) / sizeof(buf[0]); len++)
+ for(len = 0; len < ARRAY_SIZE(buf); len++)
ok(buf[len] == 'a', "expected 'a' at [%d], got 0x%x\n", len, buf[len]);
}
@@ -1029,7 +1029,7 @@ static void test_GetTempPathW(char* tmp_dir)
WCHAR tmp_dirW[MAX_PATH];
static const WCHAR fooW[] = {'f','o','o',0};
- MultiByteToWideChar(CP_ACP,0,tmp_dir,-1,tmp_dirW,sizeof(tmp_dirW)/sizeof(*tmp_dirW));
+ MultiByteToWideChar(CP_ACP, 0, tmp_dir, -1, tmp_dirW, ARRAY_SIZE(tmp_dirW));
len_with_null = lstrlenW(tmp_dirW) + 1;
/* This one is different from ANSI version: ANSI version doesn't
@@ -1064,18 +1064,18 @@ static void test_GetTempPathW(char* tmp_dir)
ok(lstrcmpiW(buf, tmp_dirW) == 0, "GetTempPathW returned an incorrect temporary path\n");
ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n");
- for(len = 0; len < sizeof(buf) / sizeof(buf[0]); len++)
+ for(len = 0; len < ARRAY_SIZE(buf); len++)
buf[len] = 'a';
len = GetTempPathW(len, buf);
ok(lstrcmpiW(buf, tmp_dirW) == 0, "GetTempPathW returned an incorrect temporary path\n");
ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n");
/* The rest of the buffer must be zeroed */
slen = len + 1;
- for(len++; len < sizeof(buf) / sizeof(buf[0]); len++)
+ for(len++; len < ARRAY_SIZE(buf); len++)
ok(buf[len] == '\0', "expected NULL at [%d], got 0x%x\n", len, buf[len]);
/* When the buffer is not long enough the length passed is zeroed */
- for(len = 0; len < sizeof(buf) / sizeof(buf[0]); len++)
+ for(len = 0; len < ARRAY_SIZE(buf); len++)
buf[len] = 'a';
len = GetTempPathW(slen / 2, buf);
ok(len == slen || broken(len == slen + 1) /* read the big comment above */ ,
@@ -1096,7 +1096,7 @@ static void test_GetTempPathW(char* tmp_dir)
for(len = 0; len < slen / 2; len++)
ok(buf[len] == '\0', "expected NULL at [%d], got 0x%x\n", len, buf[len]);
- for(; len < sizeof(buf) / sizeof(buf[0]); len++)
+ for(; len < ARRAY_SIZE(buf); len++)
ok(buf[len] == 'a', "expected 'a' at [%d], got 0x%x\n", len, buf[len]);
/* bogus application from bug 38220 passes the count value in sizeof(buffer)
@@ -1331,7 +1331,7 @@ static void test_GetLongPathNameW(void)
* files.
*/
name[0] = 0;
- while (lstrlenW(name) < (sizeof(name)/sizeof(WCHAR) - 1))
+ while (lstrlenW(name) < (ARRAY_SIZE(name) - 1))
lstrcatW(name, letterX);
GetTempPathW(MAX_PATH, tempdir);
@@ -1429,7 +1429,7 @@ static void test_GetShortPathNameW(void)
lstrcatW( path, test_path );
lstrcatW( path, backSlash );
short_path[0] = 0;
- length = GetShortPathNameW( path, short_path, sizeof(short_path) / sizeof(*short_path) );
+ length = GetShortPathNameW( path, short_path, ARRAY_SIZE( short_path ));
ok( length, "GetShortPathNameW returned 0.\n" );
lstrcpyW( path, tmppath );
@@ -1460,7 +1460,7 @@ static void test_GetShortPathNameW(void)
ok( file != INVALID_HANDLE_VALUE, "File was not created.\n" );
CloseHandle( file );
- length = GetShortPathNameW( path, short_path, sizeof(short_path)/sizeof(*short_path) );
+ length = GetShortPathNameW( path, short_path, ARRAY_SIZE( short_path ));
ok( length, "GetShortPathNameW failed: %u.\n", GetLastError() );
ret = DeleteFileW( path );
@@ -1752,7 +1752,7 @@ static void create_manifest_file(const char *filename, const char *manifest)
MultiByteToWideChar( CP_ACP, 0, filename, -1, path, MAX_PATH );
- GetTempPathW(sizeof(manifest_path)/sizeof(WCHAR), manifest_path);
+ GetTempPathW(ARRAY_SIZE(manifest_path), manifest_path);
lstrcatW(manifest_path, path);
file = CreateFileW(manifest_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -1777,7 +1777,7 @@ static HANDLE test_create(const char *file)
HANDLE handle;
MultiByteToWideChar(CP_ACP, 0, file, -1, path, MAX_PATH);
- GetTempPathW(sizeof(manifest_path)/sizeof(WCHAR), manifest_path);
+ GetTempPathW(ARRAY_SIZE(manifest_path), manifest_path);
lstrcatW(manifest_path, path);
memset(&actctx, 0, sizeof(ACTCTXW));
@@ -1818,18 +1818,18 @@ static void test_SearchPathA(void)
return;
}
- GetWindowsDirectoryA(pathA, sizeof(pathA)/sizeof(CHAR));
+ GetWindowsDirectoryA(pathA, ARRAY_SIZE(pathA));
/* NULL filename */
SetLastError(0xdeadbeef);
- ret = pSearchPathA(pathA, NULL, NULL, sizeof(buffA)/sizeof(CHAR), buffA, &ptrA);
+ ret = pSearchPathA(pathA, NULL, NULL, ARRAY_SIZE(buffA), buffA, &ptrA);
ok(ret == 0, "Expected failure, got %d\n", ret);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
/* empty filename */
SetLastError(0xdeadbeef);
- ret = pSearchPathA(pathA, fileA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, &ptrA);
+ ret = pSearchPathA(pathA, fileA, NULL, ARRAY_SIZE(buffA), buffA, &ptrA);
ok(ret == 0, "Expected failure, got %d\n", ret);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
@@ -1845,38 +1845,38 @@ static void test_SearchPathA(void)
delete_manifest_file("main.manifest");
/* search fails without active context */
- ret = pSearchPathA(NULL, testdepA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, testdepA, NULL, ARRAY_SIZE(buffA), buffA, NULL);
ok(ret == 0, "got %d\n", ret);
- ret = pSearchPathA(NULL, kernel32A, NULL, sizeof(path2A)/sizeof(CHAR), path2A, NULL);
+ ret = pSearchPathA(NULL, kernel32A, NULL, ARRAY_SIZE(path2A), path2A, NULL);
ok(ret && ret == strlen(path2A), "got %d\n", ret);
ret = pActivateActCtx(handle, &cookie);
ok(ret, "failed to activate context, %u\n", GetLastError());
/* works when activated */
- ret = pSearchPathA(NULL, testdepA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, testdepA, NULL, ARRAY_SIZE(buffA), buffA, NULL);
ok(ret && ret == strlen(buffA), "got %d\n", ret);
- ret = pSearchPathA(NULL, "testdep.dll", ".ext", sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, "testdep.dll", ".ext", ARRAY_SIZE(buffA), buffA, NULL);
ok(ret && ret == strlen(buffA), "got %d\n", ret);
- ret = pSearchPathA(NULL, "testdep", ".dll", sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, "testdep", ".dll", ARRAY_SIZE(buffA), buffA, NULL);
ok(ret && ret == strlen(buffA), "got %d\n", ret);
- ret = pSearchPathA(NULL, "testdep", ".ext", sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, "testdep", ".ext", ARRAY_SIZE(buffA), buffA, NULL);
ok(!ret, "got %d\n", ret);
/* name contains path */
- ret = pSearchPathA(NULL, testdeprelA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, testdeprelA, NULL, ARRAY_SIZE(buffA), buffA, NULL);
ok(!ret, "got %d\n", ret);
/* fails with specified path that doesn't contain this file */
- ret = pSearchPathA(pathA, testdepA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(pathA, testdepA, NULL, ARRAY_SIZE(buffA), buffA, NULL);
ok(!ret, "got %d\n", ret);
/* path is redirected for wellknown names too */
- ret = pSearchPathA(NULL, kernel32A, NULL, sizeof(buffA)/sizeof(CHAR), buffA, NULL);
+ ret = pSearchPathA(NULL, kernel32A, NULL, ARRAY_SIZE(buffA), buffA, NULL);
ok(ret && ret == strlen(buffA), "got %d\n", ret);
ok(strcmp(buffA, path2A), "got wrong path %s, %s\n", buffA, path2A);
@@ -1911,14 +1911,14 @@ static void test_SearchPathW(void)
if (0)
{
/* NULL filename, crashes on nt4 */
- pSearchPathW(pathW, NULL, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, &ptrW);
+ pSearchPathW(pathW, NULL, NULL, ARRAY_SIZE(buffW), buffW, &ptrW);
}
- GetWindowsDirectoryW(pathW, sizeof(pathW)/sizeof(WCHAR));
+ GetWindowsDirectoryW(pathW, ARRAY_SIZE(pathW));
/* empty filename */
SetLastError(0xdeadbeef);
- ret = pSearchPathW(pathW, fileW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, &ptrW);
+ ret = pSearchPathW(pathW, fileW, NULL, ARRAY_SIZE(buffW), buffW, &ptrW);
ok(ret == 0, "Expected failure, got %d\n", ret);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
@@ -1934,50 +1934,50 @@ if (0)
delete_manifest_file("main.manifest");
/* search fails without active context */
- ret = pSearchPathW(NULL, testdepW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdepW, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret == 0, "got %d\n", ret);
- ret = pSearchPathW(NULL, kernel32dllW, NULL, sizeof(path2W)/sizeof(WCHAR), path2W, NULL);
+ ret = pSearchPathW(NULL, kernel32dllW, NULL, ARRAY_SIZE(path2W), path2W, NULL);
ok(ret && ret == lstrlenW(path2W), "got %d\n", ret);
/* full path, name without 'dll' extension */
- GetSystemDirectoryW(pathW, sizeof(pathW)/sizeof(WCHAR));
- ret = pSearchPathW(pathW, kernel32W, NULL, sizeof(path2W)/sizeof(WCHAR), path2W, NULL);
+ GetSystemDirectoryW(pathW, ARRAY_SIZE(pathW));
+ ret = pSearchPathW(pathW, kernel32W, NULL, ARRAY_SIZE(path2W), path2W, NULL);
ok(ret == 0, "got %d\n", ret);
- GetWindowsDirectoryW(pathW, sizeof(pathW)/sizeof(WCHAR));
+ GetWindowsDirectoryW(pathW, ARRAY_SIZE(pathW));
ret = pActivateActCtx(handle, &cookie);
ok(ret, "failed to activate context, %u\n", GetLastError());
/* works when activated */
- ret = pSearchPathW(NULL, testdepW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdepW, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
- ret = pSearchPathW(NULL, testdepW, extW, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdepW, extW, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
- ret = pSearchPathW(NULL, testdep1W, dllW, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdep1W, dllW, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
- ret = pSearchPathW(NULL, testdep1W, extW, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdep1W, extW, ARRAY_SIZE(buffW), buffW, NULL);
ok(!ret, "got %d\n", ret);
/* name contains path */
- ret = pSearchPathW(NULL, testdeprelW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, testdeprelW, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(!ret, "got %d\n", ret);
/* fails with specified path that doesn't contain this file */
- ret = pSearchPathW(pathW, testdepW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(pathW, testdepW, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(!ret, "got %d\n", ret);
/* path is redirected for wellknown names too, meaning it takes precedence over normal search order */
- ret = pSearchPathW(NULL, kernel32dllW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, kernel32dllW, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
ok(lstrcmpW(buffW, path2W), "got wrong path %s, %s\n", wine_dbgstr_w(buffW), wine_dbgstr_w(path2W));
/* path is built using on manifest file name */
- ret = pSearchPathW(NULL, ole32W, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, NULL);
+ ret = pSearchPathW(NULL, ole32W, NULL, ARRAY_SIZE(buffW), buffW, NULL);
ok(ret && ret == lstrlenW(buffW), "got %d\n", ret);
ret = pDeactivateActCtx(0, cookie);
@@ -2010,7 +2010,7 @@ static void test_GetFullPathNameA(void)
{"", MAX_PATH, output, &filepart},
};
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
SetLastError(0xdeadbeef);
strcpy(output, "deadbeef");
@@ -2040,7 +2040,7 @@ static void test_GetFullPathNameA(void)
{ "c:\\\x83\x8f\x83\x43\x83\x93\\wine.c", "wine.c" },
{ "c:\\demo\\\x97\xa0\x95\x5c", "\x97\xa0\x95\x5c" }
};
- for (i = 0; i < sizeof(testset)/sizeof(testset[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(testset); i++) {
ret = GetFullPathNameA(testset[i].input, sizeof(output),
output, &filepart);
ok(ret, "[%d] GetFullPathName error %u\n", i, GetLastError());
@@ -2088,7 +2088,7 @@ static void test_GetFullPathNameW(void)
return;
}
- for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
{
SetLastError(0xdeadbeef);
lstrcpyW(output, deadbeefW);
@@ -2261,7 +2261,7 @@ static void test_CheckNameLegalDOS8Dot3(void)
br = pCheckNameLegalDOS8Dot3A("testtest.txt", NULL, 0, NULL, NULL);
ok(br == FALSE, "CheckNameLegalDOS8Dot3A should have failed\n");
- for(i = 0; i < sizeof(cases)/sizeof(*cases); ++i){
+ for(i = 0; i < ARRAY_SIZE(cases); ++i){
br = pCheckNameLegalDOS8Dot3W(cases[i].name, NULL, 0, &has_space, &is_legal);
ok(br == TRUE, "CheckNameLegalDOS8Dot3W failed for %s\n", wine_dbgstr_w(cases[i].name));
ok(is_legal == cases[i].should_be_legal, "Got wrong legality for %s\n", wine_dbgstr_w(cases[i].name));
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 13570b032c..0e6c7a3ae8 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -2381,9 +2381,8 @@ static void test_NamedPipeHandleState(void)
* on a local pipe.
*/
SetLastError(0xdeadbeef);
- ret = GetNamedPipeHandleStateA(server, &state, &instances,
- &maxCollectionCount, &collectDataTimeout, userName,
- sizeof(userName) / sizeof(userName[0]));
+ ret = GetNamedPipeHandleStateA(server, &state, &instances, &maxCollectionCount,
+ &collectDataTimeout, userName, ARRAY_SIZE(userName));
todo_wine
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index b1a453998c..0eb113b635 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -423,7 +423,7 @@ static void doChild(const char* file, const char* option)
childPrintf(hFile, "[Misc]\n");
if (GetCurrentDirectoryA(sizeof(bufA), bufA))
childPrintf(hFile, "CurrDirA=%s\n", encodeA(bufA));
- if (GetCurrentDirectoryW(sizeof(bufW) / sizeof(bufW[0]), bufW))
+ if (GetCurrentDirectoryW(ARRAY_SIZE(bufW), bufW))
childPrintf(hFile, "CurrDirW=%s\n", encodeW(bufW));
childPrintf(hFile, "\n");
@@ -1987,14 +1987,14 @@ static void test_QueryFullProcessImageNameW(void)
ok(GetModuleFileNameW(NULL, module_name, 1024), "GetModuleFileNameW(NULL, ...) failed\n");
/* GetCurrentProcess pseudo-handle */
- size = sizeof(buf) / sizeof(buf[0]);
+ size = ARRAY_SIZE(buf);
expect_eq_d(TRUE, pQueryFullProcessImageNameW(GetCurrentProcess(), 0, buf, &size));
expect_eq_d(lstrlenW(buf), size);
expect_eq_ws_i(buf, module_name);
hSelf = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, GetCurrentProcessId());
/* Real handle */
- size = sizeof(buf) / sizeof(buf[0]);
+ size = ARRAY_SIZE(buf);
expect_eq_d(TRUE, pQueryFullProcessImageNameW(hSelf, 0, buf, &size));
expect_eq_d(lstrlenW(buf), size);
expect_eq_ws_i(buf, module_name);
@@ -2032,7 +2032,7 @@ static void test_QueryFullProcessImageNameW(void)
/* native path */
- size = sizeof(buf) / sizeof(buf[0]);
+ size = ARRAY_SIZE(buf);
expect_eq_d(TRUE, pQueryFullProcessImageNameW(hSelf, PROCESS_NAME_NATIVE, buf, &size));
expect_eq_d(lstrlenW(buf), size);
ok(buf[0] == '\\', "NT path should begin with '\\'\n");
@@ -2040,7 +2040,7 @@ static void test_QueryFullProcessImageNameW(void)
module_name[2] = '\0';
*device = '\0';
- size = QueryDosDeviceW(module_name, device, sizeof(device)/sizeof(device[0]));
+ size = QueryDosDeviceW(module_name, device, ARRAY_SIZE(device));
ok(size, "QueryDosDeviceW failed: le=%u\n", GetLastError());
len = lstrlenW(device);
ok(size >= len+2, "expected %d to be greater than %d+2 = strlen(%s)\n", size, len, wine_dbgstr_w(device));
diff --git a/dlls/kernel32/tests/profile.c b/dlls/kernel32/tests/profile.c
index c5c77025b2..4dbe129b76 100644
--- a/dlls/kernel32/tests/profile.c
+++ b/dlls/kernel32/tests/profile.c
@@ -71,7 +71,7 @@ static void test_profile_int(void)
{ SECTION, KEY, "B4294967297", TESTFILE, -1, 0 , 0},
{ SECTION, KEY, "B4294967297", TESTFILE, 1, 0 , 0},
};
- int i, num_test = (sizeof(profileInt)/sizeof(struct _profileInt));
+ int i, num_test = ARRAY_SIZE(profileInt);
UINT res;
DeleteFileA( TESTFILE);
@@ -144,8 +144,7 @@ static void test_profile_string(void)
CloseHandle( h);
/* works only in unicode, ascii crashes */
- ret=GetPrivateProfileStringW(emptyW, keyW, emptyW, bufW,
- sizeof(bufW)/sizeof(bufW[0]), TESTFILE2W);
+ ret=GetPrivateProfileStringW(emptyW, keyW, emptyW, bufW, ARRAY_SIZE(bufW), TESTFILE2W);
todo_wine
ok(ret == 13, "expected 13, got %u\n", ret);
todo_wine
@@ -153,8 +152,7 @@ static void test_profile_string(void)
wine_dbgstr_w(valsectionW), wine_dbgstr_w(bufW) );
/* works only in unicode, ascii crashes */
- ret=GetPrivateProfileStringW(sW, emptyW, emptyW, bufW,
- sizeof(bufW)/sizeof(bufW[0]), TESTFILE2W);
+ ret=GetPrivateProfileStringW(sW, emptyW, emptyW, bufW, ARRAY_SIZE(bufW), TESTFILE2W);
todo_wine
ok(ret == 10, "expected 10, got %u\n", ret);
todo_wine
@@ -394,7 +392,7 @@ static void test_profile_existing(void)
HANDLE h = 0;
char buffer[MAX_PATH];
- for (i=0; i < sizeof(pe)/sizeof(pe[0]); i++)
+ for (i=0; i < ARRAY_SIZE(pe); i++)
{
h = CreateFileA(testfile1, pe[i].dwDesiredAccess, pe[i].dwShareMode, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -434,7 +432,7 @@ static void test_profile_existing(void)
ok( WriteFile( h, buffer, strlen(buffer), &size, NULL ), "failed to write\n" );
CloseHandle( h );
- for (i=0; i < sizeof(pe)/sizeof(pe[0]); i++)
+ for (i=0; i < ARRAY_SIZE(pe); i++)
{
h = CreateFileA(testfile2, pe[i].dwDesiredAccess, pe[i].dwShareMode, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
diff --git a/dlls/kernel32/tests/resource.c b/dlls/kernel32/tests/resource.c
index 74066cfba3..b3aaed6840 100644
--- a/dlls/kernel32/tests/resource.c
+++ b/dlls/kernel32/tests/resource.c
@@ -478,7 +478,7 @@ START_TEST(resource)
update_empty_exe();
- for(i=0; i < sizeof( sec_variants ) / sizeof( sec_variants[0] ); i++)
+ for(i=0; i < ARRAY_SIZE(sec_variants); i++)
{
const struct _sec_variants *sec = &sec_variants[i];
build_exe( &sec->build );
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c
index 5fb19f0992..b69d2eb371 100644
--- a/dlls/kernel32/tests/thread.c
+++ b/dlls/kernel32/tests/thread.c
@@ -1933,7 +1933,7 @@ static void test_thread_info(void)
return;
}
- for (i = 0; i < sizeof(info_size)/sizeof(info_size[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(info_size); i++)
{
memset(buf, 0, sizeof(buf));
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index eb78a383d2..ebda2db1f1 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -606,7 +606,7 @@ static void test_VerifyVersionInfo(void)
}
}
- for (i = 0; i < sizeof(verify_version_tests)/sizeof(verify_version_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(verify_version_tests); i++)
{
struct verify_version_test *test = &verify_version_tests[i];
DWORD srcinfo = test->srcinfo;
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 4a449fd82b..a343fa435c 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1716,7 +1716,7 @@ static void test_CreateFileMapping(void)
file[2] = CreateFileA( path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
ok( file[2] != INVALID_HANDLE_VALUE, "CreateFile error %u\n", GetLastError() );
- for (i = 0; i < sizeof(sec_flag_tests) / sizeof(sec_flag_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(sec_flag_tests); i++)
{
DWORD flags = sec_flag_tests[i].flags;
DWORD perm = sec_flag_tests[i].file == 2 ? PAGE_READONLY : PAGE_READWRITE;
@@ -3333,7 +3333,7 @@ static void test_VirtualProtect(void)
ok(status == STATUS_SUCCESS, "NtProtectVirtualMemory should succeed, got %08x\n", status);
ok(old_prot == PAGE_NOACCESS, "got %#x != expected PAGE_NOACCESS\n", old_prot);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
ret = VirtualQuery(base, &info, sizeof(info));
@@ -3499,7 +3499,7 @@ static void test_VirtualAlloc_protection(void)
DWORD ret, i;
MEMORY_BASIC_INFORMATION info;
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
base = VirtualAlloc(0, si.dwPageSize, MEM_COMMIT, td[i].prot);
@@ -3602,7 +3602,7 @@ static void test_CreateFileMapping_protection(void)
SetFilePointer(hfile, si.dwPageSize, NULL, FILE_BEGIN);
SetEndOfFile(hfile);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
hmap = CreateFileMappingW(hfile, NULL, td[i].prot | SEC_COMMIT, 0, si.dwPageSize, NULL);
@@ -3674,7 +3674,7 @@ static void test_CreateFileMapping_protection(void)
hmap = CreateFileMappingW(hfile, NULL, alloc_prot, 0, si.dwPageSize, NULL);
ok(hmap != 0, "%d: CreateFileMapping error %d\n", i, GetLastError());
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
SetLastError(0xdeadbeef);
base = MapViewOfFile(hmap, FILE_MAP_READ | FILE_MAP_WRITE | (page_exec_supported ? FILE_MAP_EXECUTE : 0), 0, 0, 0);
@@ -3941,7 +3941,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
BOOL anon_mapping = (hfile == INVALID_HANDLE_VALUE);
trace( "testing %s mapping flags %08x\n", anon_mapping ? "anonymous" : "file", sec_flags );
- for (i = 0; i < sizeof(page_prot)/sizeof(page_prot[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(page_prot); i++)
{
SetLastError(0xdeadbeef);
hmap = CreateFileMappingW(hfile, NULL, page_prot[i] | sec_flags, 0, si.dwPageSize, NULL);
@@ -3998,7 +3998,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
ok(hmap != 0, "%d: CreateFileMapping(%04x) error %d\n", i, page_prot[i], GetLastError());
- for (j = 0; j < sizeof(view)/sizeof(view[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(view); j++)
{
nt_base = map_view_of_file(hmap, view[j].access);
if (nt_base)
@@ -4085,7 +4085,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
prev_prot = info.Protect;
alloc_prot = info.AllocationProtect;
- for (k = 0; k < sizeof(page_prot)/sizeof(page_prot[0]); k++)
+ for (k = 0; k < ARRAY_SIZE(page_prot); k++)
{
/*trace("map %#x, view %#x, requested prot %#x\n", page_prot[i], view[j].prot, page_prot[k]);*/
DWORD actual_prot = (sec_flags & SEC_IMAGE) ? map_prot_no_write(page_prot[k]) : page_prot[k];
@@ -4118,7 +4118,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
}
}
- for (k = 0; k < sizeof(page_prot)/sizeof(page_prot[0]); k++)
+ for (k = 0; k < ARRAY_SIZE(page_prot); k++)
{
/*trace("map %#x, view %#x, requested prot %#x\n", page_prot[i], view[j].prot, page_prot[k]);*/
SetLastError(0xdeadbeef);
@@ -4172,7 +4172,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
prev_prot = info.Protect;
alloc_prot = info.AllocationProtect;
- for (k = 0; k < sizeof(page_prot)/sizeof(page_prot[0]); k++)
+ for (k = 0; k < ARRAY_SIZE(page_prot); k++)
{
DWORD actual_prot = (sec_flags & SEC_IMAGE) ? map_prot_no_write(page_prot[k]) : page_prot[k];
SetLastError(0xdeadbeef);
diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index f673fd2917..2de66cdfd0 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -251,7 +251,7 @@ static void test_GetVolumeNameForVolumeMountPointW(void)
{
BOOL ret;
WCHAR volume[MAX_PATH], path[] = {'c',':','\\',0};
- DWORD len = sizeof(volume) / sizeof(WCHAR);
+ DWORD len = ARRAY_SIZE(volume);
/* not present before w2k */
if (!pGetVolumeNameForVolumeMountPointW) {
@@ -795,7 +795,7 @@ static void test_GetVolumePathNameA(void)
ret = SetEnvironmentVariableA( "CurrentDrive", cwd );
ok( ret, "Failed to set an environment variable for the current working drive.\n" );
- for (i=0; i<sizeof(test_paths)/sizeof(test_paths[0]); i++)
+ for (i=0; i<ARRAY_SIZE(test_paths); i++)
{
BOOL broken_ret = test_paths[i].broken_error == NO_ERROR;
char *output = (test_paths[i].path_name != NULL ? volume_path : NULL);
--
2.14.4
June 27, 2018
[PATCH] kernel32/tests: Avoid ARRAY_SIZE-like macros
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/kernel32/tests/comm.c | 4 +---
dlls/kernel32/tests/toolhelp.c | 8 +++-----
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c
index 4fb9de1268..d671e40f87 100644
--- a/dlls/kernel32/tests/comm.c
+++ b/dlls/kernel32/tests/comm.c
@@ -410,8 +410,6 @@ static const TEST test[] =
},
};
-#define TEST_COUNT (sizeof(test) / sizeof(TEST))
-
/* This function can be useful if you are modifying the test cases and want to
output the contents of a DCB structure. */
/*static print_dcb(DCB *pdcb)
@@ -656,7 +654,7 @@ static void test_BuildCommDCB(void)
if(!port)
trace("Could not find a valid COM port. Some tests will be skipped.\n");
- for(i = 0; i < TEST_COUNT; i++)
+ for(i = 0; i < ARRAY_SIZE(test); i++)
{
char string[sizeof(test[i].string)];
diff --git a/dlls/kernel32/tests/toolhelp.c b/dlls/kernel32/tests/toolhelp.c
index c40dbc4f8f..bdb01b9824 100644
--- a/dlls/kernel32/tests/toolhelp.c
+++ b/dlls/kernel32/tests/toolhelp.c
@@ -217,8 +217,6 @@ static const char* sub_expected_modules[] =
"ntdll.dll"
};
-#define NUM_OF(x) (sizeof(x) / sizeof(x[0]))
-
static void test_module(DWORD pid, const char* expected[], unsigned num_expected)
{
HANDLE hSnapshot;
@@ -229,7 +227,7 @@ static void test_module(DWORD pid, const char* expected[], unsigned num_expected
unsigned i;
int num = 0;
- ok(NUM_OF(found) >= num_expected, "Internal: bump found[] size\n");
+ ok(ARRAY_SIZE(found) >= num_expected, "Internal: bump found[] size\n");
hSnapshot = pCreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid );
ok(hSnapshot != NULL, "Cannot create snapshot\n");
@@ -341,8 +339,8 @@ START_TEST(toolhelp)
test_process(pid, info.dwProcessId);
test_thread(pid, info.dwProcessId);
- test_module(pid, curr_expected_modules, NUM_OF(curr_expected_modules));
- test_module(info.dwProcessId, sub_expected_modules, NUM_OF(sub_expected_modules));
+ test_module(pid, curr_expected_modules, ARRAY_SIZE(curr_expected_modules));
+ test_module(info.dwProcessId, sub_expected_modules, ARRAY_SIZE(sub_expected_modules));
SetEvent(ev2);
winetest_wait_child_process( info.hProcess );
--
2.14.4
June 27, 2018
Re: [PATCH] msctf: Add TF_CreateCicLoadMutex stub.
by Nikolay Sivov
On 06/27/2018 08:51 PM, Andrey Gusev wrote:
> For https://bugs.winehq.org/show_bug.cgi?id=38270
>
> Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
> ---
> dlls/msctf/msctf.c | 9 +++++++++
> dlls/msctf/msctf.spec | 2 +-
> 2 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/msctf/msctf.c b/dlls/msctf/msctf.c
> index a19eaa1d33..da7375a5c7 100644
> --- a/dlls/msctf/msctf.c
> +++ b/dlls/msctf/msctf.c
> @@ -682,6 +682,15 @@ HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(void)
> return S_OK;
> }
>
> +/***********************************************************************
> + * TF_CreateCicLoadMutex (MSCTF.@)
> + */
> +HRESULT WINAPI TF_CreateCicLoadMutex(void)
> +{
> + FIXME("stub!\n");
> + return E_FAIL;
> +}
> +
This looks undocumented, could be only useful for native components. But
what's a point in running ctfmon.exe?
> /***********************************************************************
> * TF_CreateLangBarMgr (MSCTF.@)
> */
> diff --git a/dlls/msctf/msctf.spec b/dlls/msctf/msctf.spec
> index c3d909ccf5..2a2430cb3e 100644
> --- a/dlls/msctf/msctf.spec
> +++ b/dlls/msctf/msctf.spec
> @@ -9,7 +9,7 @@
> @ stub TF_CheckThreadInputIdle
> @ stub TF_ClearLangBarAddIns
> @ stub TF_CreateCategoryMgr
> -@ stub TF_CreateCicLoadMutex
> +@ stdcall TF_CreateCicLoadMutex()
> @ stub TF_CreateDisplayAttributeMgr
> @ stdcall TF_CreateInputProcessorProfiles(ptr)
> @ stdcall TF_CreateLangBarItemMgr(ptr)
June 27, 2018
[PATCH] msctf: Add TF_CreateCicLoadMutex stub.
by Andrey Gusev
For https://bugs.winehq.org/show_bug.cgi?id=38270
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/msctf/msctf.c | 9 +++++++++
dlls/msctf/msctf.spec | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/msctf/msctf.c b/dlls/msctf/msctf.c
index a19eaa1d33..da7375a5c7 100644
--- a/dlls/msctf/msctf.c
+++ b/dlls/msctf/msctf.c
@@ -682,6 +682,15 @@ HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(void)
return S_OK;
}
+/***********************************************************************
+ * TF_CreateCicLoadMutex (MSCTF.@)
+ */
+HRESULT WINAPI TF_CreateCicLoadMutex(void)
+{
+ FIXME("stub!\n");
+ return E_FAIL;
+}
+
/***********************************************************************
* TF_CreateLangBarMgr (MSCTF.@)
*/
diff --git a/dlls/msctf/msctf.spec b/dlls/msctf/msctf.spec
index c3d909ccf5..2a2430cb3e 100644
--- a/dlls/msctf/msctf.spec
+++ b/dlls/msctf/msctf.spec
@@ -9,7 +9,7 @@
@ stub TF_CheckThreadInputIdle
@ stub TF_ClearLangBarAddIns
@ stub TF_CreateCategoryMgr
-@ stub TF_CreateCicLoadMutex
+@ stdcall TF_CreateCicLoadMutex()
@ stub TF_CreateDisplayAttributeMgr
@ stdcall TF_CreateInputProcessorProfiles(ptr)
@ stdcall TF_CreateLangBarItemMgr(ptr)
--
2.17.1
June 27, 2018
Re: [PATCH v2 1/4] explorer: Add a private message to notify the graphics driver when activity occurs.
by Alexandre Julliard
Zebediah Figura <zfigura(a)codeweavers.com> writes:
> @@ -661,6 +665,11 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
> }
> return 0;
>
> + case WM_WINE_NOTIFY_ACTIVITY:
> + if (wine_notify_activity)
> + wine_notify_activity();
> + return 0;
> +
> default:
> return DefWindowProcW( hwnd, message, wp, lp );
> }
I think it would be cleaner to have the drivers wrap the desktop winproc
so that we don't need to define new driver functions. The Android driver
already does this.
--
Alexandre Julliard
julliard(a)winehq.org
June 27, 2018
Re: Bug #45385 related to keyboard and probably wineserver - where to start the search
by John Found
While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:
for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
{
int m = vkey - VK_LSHIFT;
>>> if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
{
TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
modifiers[m].vkey, keystate[vkey]);
update_key_state( keystate, vkey, modifiers[m].pressed );
changed = TRUE;
}
}
Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)
Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?
And why is modifiers[m].vkey included in the condition?
Best Regards
On Wed, 27 Jun 2018 08:50:22 +0300
John Found <johnfound(a)asm32.info> wrote:
> I just reported bug #45385 (https://bugs.winehq.org/show_bug.cgi?id=45385) and want to try to fix it.
>
> So I want to ask about some preliminary directions - where to check the code,
> what is the general structure of the code related to the bug subject, possible suspicious places.
>
> Here is the full bug report in order to save you a visit to the bug tracker:
>
> > I noticed that the state of the keys sometimes sticks in pressed state.
> >
> > This happens when cycling windows with some shortcut key combination.
> >
> > For example if cycling with Alt+Tab, on pressing Alt, the program gets WM_KEYDOWN and the state of the VK_MENU becomes pressed. But after cycling windows, the program does not get WM_KEYUP because the window is not focused and VK_MENU (and the respective VK_LMENU or VK_RMENU) remain in pressed state.
> >
> > When cycling back to the program window, the window get focused only after releasing Alt key, so it does not get this event as well.
> >
> > If cycling windows with another shortcut key combination (for example Alt+Shift+Tab - for backward cycling) both VK_MENU and VK_SHIFT keys stick.
> >
> > In the same time, GetAsyncKeyState returns the proper state of the keys.
> >
> > Note1: The problem is obviously in the wineserver code, because it handles the key state tables for the different threads.
> >
> > Note2: The effect happens only sometimes. It seems the code for proper processing is already there, but some racing conditions have place.
> >
> > Note3: There is some probability that the effect is in result of my application code, but it never happens on real Windows, so I considered it a bug.
> >
> > Note4: I tried to workaround this problem by reading the whole table by GetAsyncKeyState and setting it then with SetKeyboardState on WM_ACTIVATE message of the main window. This workaround actually works, but is too ugly IMO.
> > The same trick on WM_ACTIVATEAPP does not work.
--
John Found <johnfound(a)asm32.info>
June 27, 2018
Re: [PATCH vkd3d 4/4] libs/vkd3d: Trace build version.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39407
Your paranoid android.
=== debian9 (win32) ===
error: patch failed: configure.ac:93
Task: Patch failed to apply
June 27, 2018
Re: [PATCH vkd3d 3/4] libs/vkd3d: Set names for internal threads.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39406
Your paranoid android.
=== debian9 (win32) ===
error: patch failed: configure.ac:93
Task: Patch failed to apply
June 27, 2018
[PATCH vkd3d 4/4] libs/vkd3d: Trace build version.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
Makefile.am | 11 ++++++++++-
libs/.gitignore | 1 +
libs/vkd3d/device.c | 2 ++
libs/vkd3d/vkd3d_private.h | 2 ++
4 files changed, 15 insertions(+), 1 deletion(-)
create mode 100644 libs/.gitignore
diff --git a/Makefile.am b/Makefile.am
index faefc679258e..14f2d5168134 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -94,7 +94,8 @@ libvkd3d_la_SOURCES = \
libs/vkd3d/vkd3d.map \
libs/vkd3d/vkd3d_main.c \
libs/vkd3d/vkd3d_private.h \
- libs/vkd3d/vulkan_procs.h
+ libs/vkd3d/vulkan_procs.h \
+ libs/vkd3d_version.c
libvkd3d_la_LDFLAGS = -version-info 1:0:0
libvkd3d_la_LIBADD = libvkd3d-common.la libvkd3d-shader.la @DL_LIBS@ @PTHREAD_LIBS@
if HAVE_LD_VERSION_SCRIPT
@@ -173,6 +174,14 @@ libvkd3d.pc: $(srcdir)/libs/vkd3d/libvkd3d.pc.in
-e 's![@]PACKAGE_VERSION[@]!$(PACKAGE_VERSION)!g' \
$< > $@
+libs/vkd3d_version.c: dummy-vkd3d-version
+ version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "vkd3d-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char vkd3d_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || ($(RM) $@ && exit 1)
+.SILENT: libs/vkd3d_version.c
+CLEANFILES += libs/vkd3d_version.c
+
+.PHONY: dummy-vkd3d-version
+dummy-vkd3d-version:
+
## Cross-compile tests
cross_implibs = crosslibs/d3d12
CROSS_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/include/private -I$(builddir)/include
diff --git a/libs/.gitignore b/libs/.gitignore
new file mode 100644
index 000000000000..b4fc05a293e0
--- /dev/null
+++ b/libs/.gitignore
@@ -0,0 +1 @@
+vkd3d_version.c
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index e4c4d5211d61..fb57d76b5666 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -284,6 +284,8 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
VkResult vr;
HRESULT hr;
+ TRACE("Build: %s.\n", vkd3d_build);
+
if (!create_info->pfn_signal_event)
{
ERR("Invalid signal event function pointer.\n");
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 29611b8ccdc5..685825955a7f 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -794,4 +794,6 @@ HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs,
HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs,
const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
+extern const char vkd3d_build[];
+
#endif /* __VKD3D_PRIVATE_H */
--
2.16.4
June 27, 2018
[PATCH vkd3d 3/4] libs/vkd3d: Set names for internal threads.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
configure.ac | 2 ++
libs/vkd3d/command.c | 4 ++++
libs/vkd3d/vkd3d_private.h | 8 +++++---
m4/check-functions.m4 | 7 +++++++
4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index daae6464fae9..2773a155cd78 100644
--- a/configure.ac
+++ b/configure.ac
@@ -93,6 +93,8 @@ VKD3D_CHECK_FUNC([HAVE_BUILTIN_POPCOUNT], [__builtin_popcount], [__builtin_popco
VKD3D_CHECK_FUNC([HAVE_SYNC_ADD_AND_FETCH], [__sync_add_and_fetch], [__sync_add_and_fetch((int *)0, 0)])
VKD3D_CHECK_FUNC([HAVE_SYNC_SUB_AND_FETCH], [__sync_sub_and_fetch], [__sync_sub_and_fetch((int *)0, 0)])
+VKD3D_CHECK_LIB_FUNCS([pthread_setname_np], [$PTHREAD_LIBS])
+
AM_CONDITIONAL([HAVE_WIDL], [test "x$WIDL" != "xno"])
AM_CONDITIONAL([HAVE_CROSSTARGET32], [test "x$CROSSTARGET32" != "xno"])
AM_CONDITIONAL([HAVE_CROSSTARGET64], [test "x$CROSSTARGET64" != "xno"])
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index ee1d3f6e1018..d29d18edb633 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -199,6 +199,10 @@ static void *vkd3d_fence_worker_main(void *arg)
struct vkd3d_fence_worker *worker = arg;
int rc;
+#ifdef HAVE_PTHREAD_SETNAME_NP
+ pthread_setname_np(pthread_self(), "vkd3d_worker");
+#endif
+
for (;;)
{
if ((rc = pthread_mutex_lock(&worker->mutex)))
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 38f0bf38e215..29611b8ccdc5 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -19,12 +19,14 @@
#ifndef __VKD3D_PRIVATE_H
#define __VKD3D_PRIVATE_H
-#define VK_NO_PROTOTYPES
-
#define COBJMACROS
#define NONAMELESSUNION
-#include "vkd3d.h"
+#define VK_NO_PROTOTYPES
+
+#include "vkd3d_common.h"
#include "vkd3d_memory.h"
+
+#include "vkd3d.h"
#include "vkd3d_shader.h"
#include <assert.h>
diff --git a/m4/check-functions.m4 b/m4/check-functions.m4
index 8bb8213153af..17082a179719 100644
--- a/m4/check-functions.m4
+++ b/m4/check-functions.m4
@@ -7,3 +7,10 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return [$3]; }])],
[1],
[Define to 1 if you have $2.])],
[AC_MSG_RESULT([no])])])
+
+dnl VKD3D_CHECK_LIB_FUNCS
+AC_DEFUN([VKD3D_CHECK_LIB_FUNCS],
+[vkd3d_libs_saved="$LIBS"
+LIBS="$LIBS $2"
+AC_CHECK_FUNCS([$1], [$3], [$4])
+LIBS="$vkd3d_libs_saved"])
--
2.16.4
June 27, 2018
[PATCH vkd3d 2/4] tests: Add test for cube maps.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 305 +++++++++++++++++++++++++++++++++++++++++++++++
tests/vkd3d_d3d12_test.h | 15 +--
2 files changed, 313 insertions(+), 7 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index c6220aa0113d..217b4368a6b2 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -909,6 +909,7 @@ static ID3D12RootSignature *create_texture_root_signature_(unsigned int line,
sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ sampler_desc.MaxLOD = D3D12_FLOAT32_MAX;
sampler_desc.ShaderRegister = 0;
sampler_desc.RegisterSpace = 0;
sampler_desc.ShaderVisibility = shader_visibility;
@@ -8973,6 +8974,309 @@ static void test_gather(void)
destroy_test_context(&context);
}
+static void test_cube_maps(void)
+{
+ unsigned int i, j, sub_resource_idx, sub_resource_count;
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc;
+ D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc;
+ ID3D12GraphicsCommandList *command_list;
+ D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle;
+ D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle;
+ D3D12_SUBRESOURCE_DATA *texture_data;
+ const D3D12_SHADER_BYTECODE *ps;
+ struct test_context_desc desc;
+ struct test_context context;
+ ID3D12DescriptorHeap *heap;
+ ID3D12CommandQueue *queue;
+ ID3D12PipelineState *pso;
+ ID3D12Resource *texture;
+ float *data;
+ HRESULT hr;
+
+ struct
+ {
+ unsigned int face;
+ unsigned int level;
+ unsigned int cube;
+ } constants;
+
+ const unsigned int texture_size = 64;
+ static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ static const DWORD ps_cube_code[] =
+ {
+#if 0
+ TextureCube t;
+ SamplerState s;
+
+ uint face;
+ uint level;
+
+ float4 main(float4 position : SV_POSITION) : SV_Target
+ {
+ float2 p;
+ p.x = position.x / 640.0f;
+ p.y = position.y / 480.0f;
+
+ float3 coord;
+ switch (face)
+ {
+ case 0:
+ coord = float3(1.0f, p.x, p.y);
+ break;
+ case 1:
+ coord = float3(-1.0f, p.x, p.y);
+ break;
+ case 2:
+ coord = float3(p.x, 1.0f, p.y);
+ break;
+ case 3:
+ coord = float3(p.x, -1.0f, p.y);
+ break;
+ case 4:
+ coord = float3(p.x, p.y, 1.0f);
+ break;
+ case 5:
+ default:
+ coord = float3(p.x, p.y, -1.0f);
+ break;
+ }
+ return t.SampleLevel(s, coord, level);
+ }
+#endif
+ 0x43425844, 0x039aee18, 0xfd630453, 0xb884cf0f, 0x10100744, 0x00000001, 0x00000310, 0x00000003,
+ 0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
+ 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x5449534f, 0x004e4f49,
+ 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003,
+ 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x00000274, 0x00000040,
+ 0x0000009d, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x0300005a, 0x00106000, 0x00000000,
+ 0x04003058, 0x00107000, 0x00000000, 0x00005555, 0x04002064, 0x00101032, 0x00000000, 0x00000001,
+ 0x03000065, 0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x0400004c, 0x0020800a, 0x00000000,
+ 0x00000000, 0x03000006, 0x00004001, 0x00000000, 0x05000036, 0x00100012, 0x00000000, 0x00004001,
+ 0x3f800000, 0x0a000038, 0x00100062, 0x00000000, 0x00101106, 0x00000000, 0x00004002, 0x00000000,
+ 0x3acccccd, 0x3b088889, 0x00000000, 0x01000002, 0x03000006, 0x00004001, 0x00000001, 0x05000036,
+ 0x00100012, 0x00000000, 0x00004001, 0xbf800000, 0x0a000038, 0x00100062, 0x00000000, 0x00101106,
+ 0x00000000, 0x00004002, 0x00000000, 0x3acccccd, 0x3b088889, 0x00000000, 0x01000002, 0x03000006,
+ 0x00004001, 0x00000002, 0x0a000038, 0x00100052, 0x00000000, 0x00101106, 0x00000000, 0x00004002,
+ 0x3acccccd, 0x00000000, 0x3b088889, 0x00000000, 0x05000036, 0x00100022, 0x00000000, 0x00004001,
+ 0x3f800000, 0x01000002, 0x03000006, 0x00004001, 0x00000003, 0x0a000038, 0x00100052, 0x00000000,
+ 0x00101106, 0x00000000, 0x00004002, 0x3acccccd, 0x00000000, 0x3b088889, 0x00000000, 0x05000036,
+ 0x00100022, 0x00000000, 0x00004001, 0xbf800000, 0x01000002, 0x03000006, 0x00004001, 0x00000004,
+ 0x0a000038, 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x00004002, 0x3acccccd, 0x3b088889,
+ 0x00000000, 0x00000000, 0x05000036, 0x00100042, 0x00000000, 0x00004001, 0x3f800000, 0x01000002,
+ 0x0100000a, 0x0a000038, 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x00004002, 0x3acccccd,
+ 0x3b088889, 0x00000000, 0x00000000, 0x05000036, 0x00100042, 0x00000000, 0x00004001, 0xbf800000,
+ 0x01000002, 0x01000017, 0x06000056, 0x00100082, 0x00000000, 0x0020801a, 0x00000000, 0x00000000,
+ 0x0b000048, 0x001020f2, 0x00000000, 0x00100246, 0x00000000, 0x00107e46, 0x00000000, 0x00106000,
+ 0x00000000, 0x0010003a, 0x00000000, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE ps_cube = {ps_cube_code, sizeof(ps_cube_code)};
+ static const DWORD ps_cube_array_code[] =
+ {
+#if 0
+ TextureCubeArray t;
+ SamplerState s;
+
+ uint face;
+ uint level;
+ uint cube;
+
+ float4 main(float4 position : SV_POSITION) : SV_Target
+ {
+ float2 p;
+ p.x = position.x / 640.0f;
+ p.y = position.y / 480.0f;
+
+ float3 coord;
+ switch (face)
+ {
+ case 0:
+ coord = float3(1.0f, p.x, p.y);
+ break;
+ case 1:
+ coord = float3(-1.0f, p.x, p.y);
+ break;
+ case 2:
+ coord = float3(p.x, 1.0f, p.y);
+ break;
+ case 3:
+ coord = float3(p.x, -1.0f, p.y);
+ break;
+ case 4:
+ coord = float3(p.x, p.y, 1.0f);
+ break;
+ case 5:
+ default:
+ coord = float3(p.x, p.y, -1.0f);
+ break;
+ }
+ return t.SampleLevel(s, float4(coord, cube), level);
+ }
+#endif
+ 0x43425844, 0xb8d5b94a, 0xdb4be034, 0x183aed19, 0xad4af415, 0x00000001, 0x00000328, 0x00000003,
+ 0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
+ 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x5449534f, 0x004e4f49,
+ 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003,
+ 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x0000028c, 0x00000041,
+ 0x000000a3, 0x0100086a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x0300005a, 0x00106000,
+ 0x00000000, 0x04005058, 0x00107000, 0x00000000, 0x00005555, 0x04002064, 0x00101032, 0x00000000,
+ 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x02000068, 0x00000002, 0x0400004c, 0x0020800a,
+ 0x00000000, 0x00000000, 0x03000006, 0x00004001, 0x00000000, 0x05000036, 0x00100012, 0x00000000,
+ 0x00004001, 0x3f800000, 0x0a000038, 0x00100062, 0x00000000, 0x00101106, 0x00000000, 0x00004002,
+ 0x00000000, 0x3acccccd, 0x3b088889, 0x00000000, 0x01000002, 0x03000006, 0x00004001, 0x00000001,
+ 0x05000036, 0x00100012, 0x00000000, 0x00004001, 0xbf800000, 0x0a000038, 0x00100062, 0x00000000,
+ 0x00101106, 0x00000000, 0x00004002, 0x00000000, 0x3acccccd, 0x3b088889, 0x00000000, 0x01000002,
+ 0x03000006, 0x00004001, 0x00000002, 0x0a000038, 0x00100052, 0x00000000, 0x00101106, 0x00000000,
+ 0x00004002, 0x3acccccd, 0x00000000, 0x3b088889, 0x00000000, 0x05000036, 0x00100022, 0x00000000,
+ 0x00004001, 0x3f800000, 0x01000002, 0x03000006, 0x00004001, 0x00000003, 0x0a000038, 0x00100052,
+ 0x00000000, 0x00101106, 0x00000000, 0x00004002, 0x3acccccd, 0x00000000, 0x3b088889, 0x00000000,
+ 0x05000036, 0x00100022, 0x00000000, 0x00004001, 0xbf800000, 0x01000002, 0x03000006, 0x00004001,
+ 0x00000004, 0x0a000038, 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x00004002, 0x3acccccd,
+ 0x3b088889, 0x00000000, 0x00000000, 0x05000036, 0x00100042, 0x00000000, 0x00004001, 0x3f800000,
+ 0x01000002, 0x0100000a, 0x0a000038, 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x00004002,
+ 0x3acccccd, 0x3b088889, 0x00000000, 0x00000000, 0x05000036, 0x00100042, 0x00000000, 0x00004001,
+ 0xbf800000, 0x01000002, 0x01000017, 0x06000056, 0x00100032, 0x00000001, 0x00208a66, 0x00000000,
+ 0x00000000, 0x05000036, 0x00100082, 0x00000000, 0x0010000a, 0x00000001, 0x0b000048, 0x001020f2,
+ 0x00000000, 0x00100e46, 0x00000000, 0x00107e46, 0x00000000, 0x00106000, 0x00000000, 0x0010001a,
+ 0x00000001, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE ps_cube_array = {ps_cube_array_code, sizeof(ps_cube_array_code)};
+ static const struct ps_test
+ {
+ const D3D12_SHADER_BYTECODE *ps;
+ unsigned int miplevel_count;
+ unsigned int array_size;
+ }
+ ps_tests[] =
+ {
+ {&ps_cube, 1, 6},
+ {&ps_cube, 2, 6},
+ {&ps_cube, 3, 6},
+
+ {&ps_cube_array, 1, 12},
+ {&ps_cube_array, 2, 12},
+ {&ps_cube_array, 3, 12},
+ };
+
+ memset(&desc, 0, sizeof(desc));
+ desc.rt_width = 640;
+ desc.rt_height = 480;
+ desc.rt_format = DXGI_FORMAT_R32_FLOAT;
+ desc.no_root_signature = true;
+ if (!init_test_context(&context, &desc))
+ return;
+ command_list = context.list;
+ queue = context.queue;
+
+ context.root_signature = create_texture_root_signature(context.device,
+ D3D12_SHADER_VISIBILITY_PIXEL, 3, 0);
+
+ init_pipeline_state_desc(&pso_desc, context.root_signature,
+ context.render_target_desc.Format, NULL, NULL, NULL);
+
+ heap = create_gpu_descriptor_heap(context.device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
+ cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap);
+ gpu_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(heap);
+
+ ps = NULL;
+ pso = NULL;
+ for (i = 0; i < ARRAY_SIZE(ps_tests); ++i)
+ {
+ const struct ps_test *test = &ps_tests[i];
+
+ if (ps != test->ps)
+ {
+ if (pso)
+ ID3D12PipelineState_Release(pso);
+
+ ps = test->ps;
+ pso_desc.PS = *test->ps;
+ hr = ID3D12Device_CreateGraphicsPipelineState(context.device, &pso_desc,
+ &IID_ID3D12PipelineState, (void **)&pso);
+ ok(hr == S_OK, "Failed to create graphics pipeline state, hr %#x.\n", hr);
+ }
+
+ texture = create_default_texture2d(context.device, texture_size, texture_size,
+ test->array_size, test->miplevel_count, DXGI_FORMAT_R32_FLOAT,
+ D3D12_RESOURCE_FLAG_NONE, D3D12_RESOURCE_STATE_COPY_DEST);
+ srv_desc.Format = DXGI_FORMAT_R32_FLOAT;
+ srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ if (ps == &ps_cube)
+ {
+ srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
+ srv_desc.TextureCube.MostDetailedMip = 0;
+ srv_desc.TextureCube.MipLevels = test->miplevel_count;
+ srv_desc.TextureCube.ResourceMinLODClamp = 0.0f;
+ }
+ else
+ {
+ srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
+ srv_desc.TextureCubeArray.MostDetailedMip = 0;
+ srv_desc.TextureCubeArray.MipLevels = test->miplevel_count;
+ srv_desc.TextureCubeArray.First2DArrayFace = 0;
+ srv_desc.TextureCubeArray.NumCubes = test->array_size / 6;
+ srv_desc.TextureCubeArray.ResourceMinLODClamp = 0.0f;
+ }
+ ID3D12Device_CreateShaderResourceView(context.device, texture, &srv_desc, cpu_handle);
+
+ sub_resource_count = test->array_size * test->miplevel_count;
+ texture_data = calloc(sub_resource_count, sizeof(*texture_data));
+ ok(texture_data, "Failed to allocate memory.\n");
+ for (sub_resource_idx = 0; sub_resource_idx < sub_resource_count; ++sub_resource_idx)
+ {
+ data = calloc(texture_size * texture_size, sizeof(*data));
+ ok(data, "Failed to allocate memory.\n");
+ for (j = 0; j < texture_size * texture_size; ++j)
+ data[j] = sub_resource_idx;
+
+ texture_data[sub_resource_idx].pData = data;
+ texture_data[sub_resource_idx].RowPitch = texture_size * sizeof(*data);
+ texture_data[sub_resource_idx].SlicePitch = 0;
+ }
+ upload_texture_data(texture, texture_data, sub_resource_count, queue, command_list);
+ for (sub_resource_idx = 0; sub_resource_idx < sub_resource_count; ++sub_resource_idx)
+ free((void *)texture_data[sub_resource_idx].pData);
+ free(texture_data);
+
+ reset_command_list(command_list, context.allocator);
+ transition_resource_state(command_list, texture,
+ D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+
+ for (sub_resource_idx = 0; sub_resource_idx < sub_resource_count; ++sub_resource_idx)
+ {
+ constants.face = (sub_resource_idx / test->miplevel_count) % 6;
+ constants.level = sub_resource_idx % test->miplevel_count;
+ constants.cube = (sub_resource_idx / test->miplevel_count) / 6;
+
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, white, 0, NULL);
+ ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, FALSE, NULL);
+ ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, pso);
+ ID3D12GraphicsCommandList_SetDescriptorHeaps(command_list, 1, &heap);
+ ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(command_list, 0, gpu_handle);
+ ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstants(command_list, 1, 3, &constants.face, 0);
+ ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context.viewport);
+ ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context.scissor_rect);
+ ID3D12GraphicsCommandList_DrawInstanced(command_list, 3, 1, 0, 0);
+
+ transition_resource_state(command_list, context.render_target,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+
+ check_sub_resource_float(context.render_target, 0, queue, command_list, sub_resource_idx, 0);
+
+ reset_command_list(command_list, context.allocator);
+ transition_resource_state(command_list, context.render_target,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
+ }
+
+ ID3D12Resource_Release(texture);
+ }
+ ID3D12PipelineState_Release(pso);
+
+ ID3D12DescriptorHeap_Release(heap);
+ destroy_test_context(&context);
+}
+
static void test_descriptor_tables(void)
{
ID3D12DescriptorHeap *heap, *sampler_heap, *heaps[2];
@@ -17380,6 +17684,7 @@ START_TEST(d3d12)
run_test(test_root_constants);
run_test(test_texture);
run_test(test_gather);
+ run_test(test_cube_maps);
run_test(test_descriptor_tables);
run_test(test_descriptor_tables_overlapping_bindings);
run_test(test_update_root_descriptors);
diff --git a/tests/vkd3d_d3d12_test.h b/tests/vkd3d_d3d12_test.h
index b4a9a442a5d2..2ebb58f997b3 100644
--- a/tests/vkd3d_d3d12_test.h
+++ b/tests/vkd3d_d3d12_test.h
@@ -318,11 +318,12 @@ static void check_sub_resource_uint_(unsigned int line, ID3D12Resource *texture,
release_resource_readback(&rb);
}
-#define create_texture(a, b, c, d, e) create_default_texture_(__LINE__, a, b, c, d, 0, e)
-#define create_default_texture(a, b, c, d, e, f) create_default_texture_(__LINE__, a, b, c, d, e, f)
-static ID3D12Resource *create_default_texture_(unsigned int line, ID3D12Device *device,
- unsigned int width, unsigned int height, DXGI_FORMAT format,
- D3D12_RESOURCE_FLAGS flags, D3D12_RESOURCE_STATES initial_state)
+#define create_default_texture(a, b, c, d, e, f) create_default_texture2d_(__LINE__, a, b, c, 1, 1, d, e, f)
+#define create_texture(a, b, c, d, e) create_default_texture(a, b, c, d, 0, e)
+#define create_default_texture2d(a, b, c, d, e, f, g, h) create_default_texture2d_(__LINE__, a, b, c, d, e, f, g, h)
+static ID3D12Resource *create_default_texture2d_(unsigned int line, ID3D12Device *device,
+ unsigned int width, unsigned int height, unsigned int array_size, unsigned int miplevel_count,
+ DXGI_FORMAT format, D3D12_RESOURCE_FLAGS flags, D3D12_RESOURCE_STATES initial_state)
{
D3D12_HEAP_PROPERTIES heap_properties;
D3D12_RESOURCE_DESC resource_desc;
@@ -336,8 +337,8 @@ static ID3D12Resource *create_default_texture_(unsigned int line, ID3D12Device *
resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
resource_desc.Width = width;
resource_desc.Height = height;
- resource_desc.DepthOrArraySize = 1;
- resource_desc.MipLevels = 1;
+ resource_desc.DepthOrArraySize = array_size;
+ resource_desc.MipLevels = miplevel_count;
resource_desc.Format = format;
resource_desc.SampleDesc.Count = 1;
resource_desc.Flags = flags;
--
2.16.4
June 27, 2018
[PATCH vkd3d 1/4] libs/vkd3d: Implement cube shader resource views.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/vkd3d_d3d12.idl | 2 +-
libs/vkd3d/resource.c | 43 +++++++++++++++++++++++++++++++++++++------
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/include/vkd3d_d3d12.idl b/include/vkd3d_d3d12.idl
index 5bfc76718873..ec7df5653faa 100644
--- a/include/vkd3d_d3d12.idl
+++ b/include/vkd3d_d3d12.idl
@@ -945,7 +945,7 @@ typedef struct D3D12_TEXCUBE_ARRAY_SRV
{
UINT MostDetailedMip;
UINT MipLevels;
- UINT First2DArraySlice;
+ UINT First2DArrayFace;
UINT NumCubes;
FLOAT ResourceMinLODClamp;
} D3D12_TEXCUBE_ARRAY_SRV;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index e45c90083229..e1a5adf3364d 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1150,6 +1150,7 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
+ uint32_t miplevel_idx, miplevel_count, layer_idx, layer_count;
const struct vkd3d_format *format;
VkImageViewType vk_view_type;
struct vkd3d_view *view;
@@ -1174,22 +1175,52 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
return;
}
- if (desc)
- FIXME("Unhandled SRV desc %p.\n", desc);
-
if (!(format = vkd3d_format_from_d3d12_resource_desc(&resource->desc, desc ? desc->Format : 0)))
{
FIXME("Failed to find format for %#x.\n", resource->desc.Format);
return;
}
+ vk_view_type = resource->desc.DepthOrArraySize > 1
+ ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
+ miplevel_idx = 0;
+ miplevel_count = VK_REMAINING_MIP_LEVELS;
+ layer_idx = 0;
+ layer_count = VK_REMAINING_ARRAY_LAYERS;
+ if (desc)
+ {
+ if (desc->Shader4ComponentMapping != D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING)
+ FIXME("Ignoring component mapping %#x.\n", desc->Shader4ComponentMapping);
+
+ switch (desc->ViewDimension)
+ {
+ case D3D12_SRV_DIMENSION_TEXTURECUBE:
+ vk_view_type = VK_IMAGE_VIEW_TYPE_CUBE;
+ miplevel_idx = desc->u.TextureCube.MostDetailedMip;
+ miplevel_count = desc->u.TextureCube.MipLevels;
+ layer_count = 6;
+ if (desc->u.TextureCube.ResourceMinLODClamp)
+ FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCube.ResourceMinLODClamp);
+ break;
+ case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
+ vk_view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ miplevel_idx = desc->u.TextureCubeArray.MostDetailedMip;
+ miplevel_count = desc->u.TextureCubeArray.MipLevels;
+ layer_idx = desc->u.TextureCubeArray.First2DArrayFace;
+ layer_count = 6 * desc->u.TextureCubeArray.NumCubes;
+ if (desc->u.TextureCubeArray.ResourceMinLODClamp)
+ FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCubeArray.ResourceMinLODClamp);
+ break;
+ default:
+ FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
+ }
+ }
+
if (!(view = vkd3d_view_create()))
return;
- vk_view_type = resource->desc.DepthOrArraySize > 1
- ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
- 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS, true, &view->u.vk_image_view) < 0)
+ miplevel_idx, miplevel_count, layer_idx, layer_count, true, &view->u.vk_image_view) < 0)
{
vkd3d_free(view);
return;
--
2.16.4
June 27, 2018
[PATCH] include/d3d12: Fix typos.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/d3d12.idl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/d3d12.idl b/include/d3d12.idl
index 69220e674cd7..43e9c2dca3bb 100644
--- a/include/d3d12.idl
+++ b/include/d3d12.idl
@@ -944,7 +944,7 @@ typedef struct D3D12_TEXCUBE_ARRAY_SRV
{
UINT MostDetailedMip;
UINT MipLevels;
- UINT First2DArraySlice;
+ UINT First2DArrayFace;
UINT NumCubes;
FLOAT ResourceMinLODClamp;
} D3D12_TEXCUBE_ARRAY_SRV;
@@ -2172,7 +2172,7 @@ interface ID3D12RootSignatureDeserializer : IUnknown
ID3DBlob **blob, ID3DBlob **error_blob);
typedef HRESULT (__stdcall *PFN_D3D12_CREATE_DEVICE)(IUnknown *adapter,
- D3D_FEATURE_LEVEL minmum_feature_level, REFIID iid, void **device);
+ D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device);
[local] HRESULT __stdcall D3D12CreateDevice(IUnknown *adapter,
D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device);
--
2.16.4
June 27, 2018
[PATCH v2] msvcp120: Add test for Concurrent_vector_Internal_resize and reverse.
by Piotr Caban
From: Hua Meng <161220092(a)smail.nju.edu.cn>
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
v2:
- added test for vector capacity after _Internal_reserve call
dlls/msvcp120/tests/msvcp120.c | 90
++++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
June 27, 2018
[PATCH 5/5] schedsvc: Use current time as trigger begin time when necessary.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/schedsvc/atsvc.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index b463be6960..a0e0727b31 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -170,6 +170,9 @@ static BOOL trigger_get_next_runtime(const TASK_TRIGGER *trigger, const FILETIME
FileTimeToSystemTime(current_ft, ¤t_st);
get_begin_time(trigger, &begin_ft);
+ if (CompareFileTime(&begin_ft, current_ft) < 0)
+ begin_ft = *current_ft;
+
get_end_time(trigger, &end_ft);
switch (trigger->TriggerType)
--
2.16.3
June 27, 2018
[PATCH 4/5] schedsvc: Avoid an infinite loop.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/schedsvc/atsvc.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index df4185eac2..b463be6960 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -194,6 +194,9 @@ static BOOL trigger_get_next_runtime(const TASK_TRIGGER *trigger, const FILETIME
break;
case TASK_TIME_TRIGGER_DAILY:
+ if (!trigger->Type.Daily.DaysInterval)
+ break; /* avoid infinite loop */
+
st = current_st;
st.wHour = trigger->wStartHour;
st.wMinute = trigger->wStartMinute;
--
2.16.3
June 27, 2018
[PATCH 3/5] schedsvc: Minor cleanup.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/schedsvc/atsvc.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index b8adc7279d..df4185eac2 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -99,7 +99,7 @@ static void filetime_add_ms(FILETIME *ft, LONGLONG ms)
LONGLONG ll;
} *ftll = (union u_ftll *)ft;
- ftll->ll += ms * (ULONGLONG)10000;
+ ftll->ll += ms * (LONGLONG)10000;
}
static void filetime_add_minutes(FILETIME *ft, LONG minutes)
@@ -117,7 +117,7 @@ static void filetime_add_days(FILETIME *ft, LONG days)
filetime_add_hours(ft, (LONGLONG)days * 24);
}
-static void filetime_add_weeks(FILETIME *ft, ULONG weeks)
+static void filetime_add_weeks(FILETIME *ft, LONG weeks)
{
filetime_add_days(ft, (LONGLONG)weeks * 7);
}
@@ -250,7 +250,7 @@ static BOOL trigger_get_next_runtime(const TASK_TRIGGER *trigger, const FILETIME
return FALSE;
}
-static BOOL job_get_next_runtime(struct job_t *job, FILETIME *current_ft, FILETIME *next_rt)
+static BOOL job_get_next_runtime(struct job_t *job, const FILETIME *current_ft, FILETIME *next_rt)
{
FILETIME trigger_rt;
BOOL have_next_rt = FALSE;
@@ -307,7 +307,7 @@ BOOL get_next_runtime(LARGE_INTEGER *rt)
return have_next_rt;
}
-static BOOL job_runs_at(struct job_t *job, FILETIME *begin_ft, FILETIME *end_ft)
+static BOOL job_runs_at(struct job_t *job, const FILETIME *begin_ft, const FILETIME *end_ft)
{
FILETIME job_ft;
--
2.16.3
June 27, 2018
[PATCH 2/5] mstask: Avoid an infinite loop.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/mstask/task.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c
index 6492f16986..6c27b76c95 100644
--- a/dlls/mstask/task.c
+++ b/dlls/mstask/task.c
@@ -532,6 +532,9 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
break;
case TASK_TIME_TRIGGER_DAILY:
+ if (!This->trigger[i].Type.Daily.DaysInterval)
+ break; /* avoid infinite loop */
+
st = current_st;
st.wHour = This->trigger[i].wStartHour;
st.wMinute = This->trigger[i].wStartMinute;
--
2.16.3
June 27, 2018
[PATCH 1/5] mstask: Use current time as trigger begin time when necessary.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/mstask/task.c | 42 +++++++++++++++++++++++-------------------
1 file changed, 23 insertions(+), 19 deletions(-)
diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c
index 490229ae71..6492f16986 100644
--- a/dlls/mstask/task.c
+++ b/dlls/mstask/task.c
@@ -481,7 +481,7 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
TaskImpl *This = impl_from_ITask(iface);
HRESULT hr = SCHED_S_TASK_NO_VALID_TRIGGERS;
SYSTEMTIME st, current_st;
- FILETIME current_ft, begin_ft, end_ft, best_ft;
+ FILETIME current_ft, trigger_ft, begin_ft, end_ft, best_ft;
BOOL have_best_time = FALSE;
DWORD i;
@@ -494,12 +494,16 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
}
GetLocalTime(¤t_st);
+ SystemTimeToFileTime(¤t_st, ¤t_ft);
for (i = 0; i < This->trigger_count; i++)
{
if (!(This->trigger[i].rgFlags & TASK_TRIGGER_FLAG_DISABLED))
{
get_begin_time(&This->trigger[i], &begin_ft);
+ if (CompareFileTime(&begin_ft, ¤t_ft) < 0)
+ begin_ft = current_ft;
+
get_end_time(&This->trigger[i], &end_ft);
switch (This->trigger[i].TriggerType)
@@ -516,12 +520,12 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
st.wMinute = This->trigger[i].wStartMinute;
st.wSecond = 0;
st.wMilliseconds = 0;
- SystemTimeToFileTime(&st, ¤t_ft);
- if (CompareFileTime(&begin_ft, ¤t_ft) <= 0 && CompareFileTime(¤t_ft, &end_ft) < 0)
+ SystemTimeToFileTime(&st, &trigger_ft);
+ if (CompareFileTime(&begin_ft, &trigger_ft) <= 0 && CompareFileTime(&trigger_ft, &end_ft) < 0)
{
- if (!have_best_time || CompareFileTime(¤t_ft, &best_ft) < 0)
+ if (!have_best_time || CompareFileTime(&trigger_ft, &best_ft) < 0)
{
- best_ft = current_ft;
+ best_ft = trigger_ft;
have_best_time = TRUE;
}
}
@@ -533,20 +537,20 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
st.wMinute = This->trigger[i].wStartMinute;
st.wSecond = 0;
st.wMilliseconds = 0;
- SystemTimeToFileTime(&st, ¤t_ft);
- while (CompareFileTime(¤t_ft, &end_ft) < 0)
+ SystemTimeToFileTime(&st, &trigger_ft);
+ while (CompareFileTime(&trigger_ft, &end_ft) < 0)
{
- if (CompareFileTime(¤t_ft, &begin_ft) >= 0)
+ if (CompareFileTime(&trigger_ft, &begin_ft) >= 0)
{
- if (!have_best_time || CompareFileTime(¤t_ft, &best_ft) < 0)
+ if (!have_best_time || CompareFileTime(&trigger_ft, &best_ft) < 0)
{
- best_ft = current_ft;
+ best_ft = trigger_ft;
have_best_time = TRUE;
}
break;
}
- filetime_add_days(¤t_ft, This->trigger[i].Type.Daily.DaysInterval);
+ filetime_add_days(&trigger_ft, This->trigger[i].Type.Daily.DaysInterval);
}
break;
@@ -559,18 +563,18 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
st.wMinute = This->trigger[i].wStartMinute;
st.wSecond = 0;
st.wMilliseconds = 0;
- SystemTimeToFileTime(&st, ¤t_ft);
- while (CompareFileTime(¤t_ft, &end_ft) < 0)
+ SystemTimeToFileTime(&st, &trigger_ft);
+ while (CompareFileTime(&trigger_ft, &end_ft) < 0)
{
- FileTimeToSystemTime(¤t_ft, &st);
+ FileTimeToSystemTime(&trigger_ft, &st);
- if (CompareFileTime(¤t_ft, &begin_ft) >= 0)
+ if (CompareFileTime(&trigger_ft, &begin_ft) >= 0)
{
if (This->trigger[i].Type.Weekly.rgfDaysOfTheWeek & (1 << st.wDayOfWeek))
{
- if (!have_best_time || CompareFileTime(¤t_ft, &best_ft) < 0)
+ if (!have_best_time || CompareFileTime(&trigger_ft, &best_ft) < 0)
{
- best_ft = current_ft;
+ best_ft = trigger_ft;
have_best_time = TRUE;
}
break;
@@ -578,9 +582,9 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
}
if (st.wDayOfWeek == 0 && This->trigger[i].Type.Weekly.WeeksInterval > 1) /* Sunday, goto next week */
- filetime_add_weeks(¤t_ft, This->trigger[i].Type.Weekly.WeeksInterval - 1);
+ filetime_add_weeks(&trigger_ft, This->trigger[i].Type.Weekly.WeeksInterval - 1);
else /* check next weekday */
- filetime_add_days(¤t_ft, 1);
+ filetime_add_days(&trigger_ft, 1);
}
break;
--
2.16.3
June 27, 2018
[PATCH] testbot/web: Let GetHtmlLine() detect and format the timeout errors.
by Francois Gouget
It already handles filtering and highlighting errors so it makes sense
to also have if reformat the timeout errors for the log summary.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/JobDetails.pl | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index e5f792929..e7e53d208 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -253,6 +253,11 @@ sub GetHtmlLine($$$)
return undef if ($Category ne "error" and !$FullLog);
my $Html = $self->escapeHTML($Line);
+ if (!$FullLog and $Html =~ m/^[^:]+:([^:]*)(?::[0-9a-f]+)? done \(258\)/)
+ {
+ my $Unit = $1;
+ return $Unit ne "" ? "$Unit: Timeout" : "Timeout";
+ }
if ($FullLog and $Category ne "none")
{
# Highlight all line categories in the full log
@@ -414,15 +419,7 @@ sub GenerateBody($)
print "<pre><code>";
$LogFirst = 0;
}
- if (!$MoreInfo->{Full} && $Line =~ m/^[^:]+:([^:]*)(?::[0-9a-f]+)? done \(258\)/)
- {
- my $Unit = $1 ne "" ? "$1: " : "";
- print "${Unit}Timeout\n";
- }
- else
- {
- print "$Html\n";
- }
+ print "$Html\n";
}
close($LogFile);
--
2.18.0
June 27, 2018
[PATCH] testbot: Track patches to the Wine modules separately.
by Francois Gouget
Patches to the dlls and programs modules don't require a rebuild of
the native Wine tools.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/PatchUtils.pm | 13 +++++++++++++
testbot/lib/WineTestBot/Patches.pm | 3 ++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index b2bfe6a9a..811c3b8b2 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -193,6 +193,19 @@ sub _HandleFile($$$)
}
$Tests->{$Module}->{Files}->{$File} = $Change;
}
+ elsif ($FilePath =~ m~^(dlls|programs)/([^/]+)/([^/\s]+)$~)
+ {
+ my ($Root, $Dir, $File) = ($1, $2, $3);
+ my $Module = ($Root eq "programs") ? "$Dir.exe" : $Dir;
+ $Impacts->{IsWinePatch} = 1;
+ $Impacts->{ModuleBuild} = 1;
+
+ if ($File eq "Makefile.in" and $Change ne "modify")
+ {
+ # This adds / removes a directory
+ $Impacts->{MakeMakefiles} = 1;
+ }
+ }
else
{
my $WineFiles = $Impacts->{WineFiles} || $_WineFiles;
diff --git a/testbot/lib/WineTestBot/Patches.pm b/testbot/lib/WineTestBot/Patches.pm
index fe333d943..50f720861 100644
--- a/testbot/lib/WineTestBot/Patches.pm
+++ b/testbot/lib/WineTestBot/Patches.pm
@@ -136,7 +136,8 @@ sub Submit($$$)
$PastImpacts = GetPatchImpact($PatchFileName) if ($IsSet);
my $Impacts = GetPatchImpact("$DataDir/patches/" . $self->Id, undef, $PastImpacts);
- if (!$Impacts->{WineBuild} and !$Impacts->{TestBuild})
+ if (!$Impacts->{WineBuild} and !$Impacts->{ModuleBuild} and
+ !$Impacts->{TestBuild})
{
if ($Impacts->{IsWinePatch})
{
--
2.18.0
June 27, 2018
[PATCH] testbot/WineRun*: Prefix the TestBot errors so they are easy to identify.
by Francois Gouget
Some scripts may need to detect them.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 2 +-
testbot/bin/WineRunReconfig.pl | 2 +-
testbot/bin/WineRunTask.pl | 2 +-
testbot/bin/WineRunWineTest.pl | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 176ade6b6..90b9f030a 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -269,7 +269,7 @@ sub FatalError($;$)
my ($ErrMessage, $Retry) = @_;
LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
- LogTaskError($ErrMessage);
+ LogTaskError("BotError: $ErrMessage");
WrapUpAndExit('boterror', $Retry);
}
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index aa0cf955e..8a3d955a7 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -269,7 +269,7 @@ sub FatalError($;$)
my ($ErrMessage, $Retry) = @_;
LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
- LogTaskError($ErrMessage);
+ LogTaskError("BotError: $ErrMessage");
WrapUpAndExit('boterror', $Retry);
}
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 821ca55ea..fb2966303 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -319,7 +319,7 @@ sub FatalError($;$)
my ($ErrMessage, $Retry) = @_;
LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
- LogTaskError($ErrMessage);
+ LogTaskError("BotError: $ErrMessage");
WrapUpAndExit('boterror', undef, $Retry);
}
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index 83cf5821b..1e43f9a41 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -320,7 +320,7 @@ sub FatalError($;$)
my ($ErrMessage, $Retry) = @_;
LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
- LogTaskError($ErrMessage);
+ LogTaskError("BotError: $ErrMessage");
WrapUpAndExit('boterror', undef, $Retry);
}
--
2.18.0
June 27, 2018
[PATCH] testbot/CheckForWinetestUpdate: Fix the Wine reconfig timeout.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/CheckForWinetestUpdate.pl | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/testbot/bin/CheckForWinetestUpdate.pl b/testbot/bin/CheckForWinetestUpdate.pl
index d3ef384c7..a570a1b80 100755
--- a/testbot/bin/CheckForWinetestUpdate.pl
+++ b/testbot/bin/CheckForWinetestUpdate.pl
@@ -286,7 +286,9 @@ sub AddReconfigJob($)
Debug(" $VMKey $VMType reconfig\n");
my $Task = $BuildStep->Tasks->Add();
$Task->VM($VM);
- $Task->Timeout($ReconfigTimeout);
+ $Task->Timeout($VMType eq "wine" ?
+ 3 * $WineReconfigTimeout : # 3 full Wine builds
+ $ReconfigTimeout); # 1 overall timeout
}
# Save the build step so the others can reference it.
--
2.18.0
June 27, 2018
[PATCH] testbot/web: Compile patches on wow64 if 64 bit tests have been selected.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/Submit.pl | 45 ++++++++++++++++++++++++-------------------
1 file changed, 25 insertions(+), 20 deletions(-)
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index 9fa252a11..38aa75fcb 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -858,30 +858,35 @@ sub OnSubmit($)
my $VMs = CreateVMs();
$VMs->AddFilter("Type", ["wine"]);
my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
- foreach my $VMKey (@$SortedKeys)
+ foreach my $Build ("win32", "wow64")
{
- my $VM = $VMs->GetItem($VMKey);
- my $FieldName = "vm_" . $self->CGI->escapeHTML($VMKey);
- next if (!$self->GetParam($FieldName)); # skip unselected VMs
+ next if ($Build eq "wow64" and !defined($self->GetParam("Run64")));
- if (!$Tasks)
+ foreach my $VMKey (@$SortedKeys)
{
- # First create the Wine test step
- my $WineStep = $Steps->Add();
- $WineStep->FileName($BaseName);
- $WineStep->FileType($FileType);
- $WineStep->InStaging(!1);
- $WineStep->Type("build");
- $WineStep->DebugLevel($self->GetParam("DebugLevel"));
- $WineStep->ReportSuccessfulTests(defined($self->GetParam("ReportSuccessfulTests")));
- $Tasks = $WineStep->Tasks;
- }
+ my $VM = $VMs->GetItem($VMKey);
+ my $FieldName = "vm_" . $self->CGI->escapeHTML($VMKey);
+ next if (!$self->GetParam($FieldName)); # skip unselected VMs
- # Then add a task for this VM
- my $Task = $Tasks->Add();
- $Task->VM($VM);
- $Task->CmdLineArg("win32");
- $Task->Timeout($WineReconfigTimeout);
+ if (!$Tasks)
+ {
+ # First create the Wine test step
+ my $WineStep = $Steps->Add();
+ $WineStep->FileName($BaseName);
+ $WineStep->FileType($FileType);
+ $WineStep->InStaging(!1);
+ $WineStep->Type("build");
+ $WineStep->DebugLevel($self->GetParam("DebugLevel"));
+ $WineStep->ReportSuccessfulTests(defined($self->GetParam("ReportSuccessfulTests")));
+ $Tasks = $WineStep->Tasks;
+ }
+
+ # Then add a task for this VM
+ my $Task = $Tasks->Add();
+ $Task->VM($VM);
+ $Task->CmdLineArg($Build);
+ $Task->Timeout($WineReconfigTimeout);
+ }
}
}
--
2.18.0
June 27, 2018
[PATCH] testbot: Fix the detection of the start and skipped report lines.
by Francois Gouget
This now matches the Wine report parser.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/LogUtils.pm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index 2d3042ec7..bccf30db3 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -408,7 +408,7 @@ sub GetLogLineCategory($)
return "todo";
}
if ($Line =~ /: Tests skipped: / or
- $Line =~ /^\w+:\w+ skipped /)
+ $Line =~ /^[_.a-z0-9-]+:[_a-z0-9]* skipped /)
{
return "skip";
}
@@ -431,7 +431,7 @@ sub GetLogLineCategory($)
return "error";
}
if ($Line =~ /^\+ \S/ or
- $Line =~ /^\w+:\w+ start / or
+ $Line =~ /^[_.a-z0-9-]+:[_a-z0-9]* start / or
# Build messages
$Line =~ /^(?:Build|Reconfig|Task): ok/)
{
--
2.18.0
June 27, 2018
[PATCH 3/3] testbot: Run WineTest on Wine VMs after commits.
by Francois Gouget
WineReconfig.pl now knows how to retrieve and cache the Gecko and Mono
addons, and how to create new wineprefixes. These are then captured by
the updated snapshot and are thus ready to use to run tests.
CheckForWinetestUpdate.pl creates additional steps to rerun the full
WineTest suite on the Wine VMs if the Wine rebuild was successful.
Running WineTest is handled by WineTest.pl and WineRunWineTest.pl
collects the corresponding reports in the latest directory in files
named '<vm>_<build>.report' where build is one of win32, wow32 or
wow64.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/CheckForWinetestUpdate.pl | 44 +++++-
testbot/bin/WineRunWineTest.pl | 218 ++++++++++++++++++++++----
testbot/bin/build/WineReconfig.pl | 189 ++++++++++++++++++++--
testbot/bin/build/WineTest.pl | 118 ++++++++++++--
testbot/lib/WineTestBot/LogUtils.pm | 8 +-
testbot/lib/WineTestBot/Utils.pm | 19 ++-
6 files changed, 537 insertions(+), 59 deletions(-)
diff --git a/testbot/bin/CheckForWinetestUpdate.pl b/testbot/bin/CheckForWinetestUpdate.pl
index 74c59955f..d3ef384c7 100755
--- a/testbot/bin/CheckForWinetestUpdate.pl
+++ b/testbot/bin/CheckForWinetestUpdate.pl
@@ -273,10 +273,10 @@ sub AddReconfigJob($)
# Add a step to the job
my $Steps = $NewJob->Steps;
- my $NewStep = $Steps->Add();
- $NewStep->Type("reconfig");
- $NewStep->FileType("none");
- $NewStep->InStaging(!1);
+ my $BuildStep = $Steps->Add();
+ $BuildStep->Type("reconfig");
+ $BuildStep->FileType("none");
+ $BuildStep->InStaging(!1);
# And a task for each VM
my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
@@ -284,14 +284,46 @@ sub AddReconfigJob($)
{
my $VM = $VMs->GetItem($VMKey);
Debug(" $VMKey $VMType reconfig\n");
- my $Task = $NewStep->Tasks->Add();
+ my $Task = $BuildStep->Tasks->Add();
$Task->VM($VM);
$Task->Timeout($ReconfigTimeout);
}
- # Save it all
+ # Save the build step so the others can reference it.
my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
if (defined $ErrMessage)
+ {
+ Error "Failed to save the build step: $ErrMessage\n";
+ return 0;
+ }
+
+ if ($VMType eq "wine")
+ {
+ # Add steps to run WineTest on Wine
+ foreach my $Build ("win32", "wow32", "wow64")
+ {
+ # Add a step to the job
+ my $NewStep = $Steps->Add();
+ $NewStep->PreviousNo($BuildStep->No);
+ $NewStep->Type("suite");
+ $NewStep->FileType("none");
+ $NewStep->InStaging(!1);
+
+ foreach my $VMKey (@$SortedKeys)
+ {
+ my $VM = $VMs->GetItem($VMKey);
+ Debug(" $VMKey $Build\n");
+ my $Task = $NewStep->Tasks->Add();
+ $Task->VM($VM);
+ $Task->CmdLineArg($Build);
+ $Task->Timeout($SuiteTimeout);
+ }
+ }
+ }
+
+ # Save it all
+ ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
+ if (defined $ErrMessage)
{
Error "Failed to save the Reconfig job: $ErrMessage\n";
return 0;
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index 53a2a0929..83cf5821b 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl -Tw
# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
#
-# Makes sure the Wine patches compile.
+# Makes sure the Wine patches compile or run WineTest.
# See the bin/build/WineTest.pl script.
#
# Copyright 2018 Francois Gouget
@@ -46,6 +46,7 @@ use WineTestBot::PatchUtils;
use WineTestBot::VMs;
use WineTestBot::Log;
use WineTestBot::LogUtils;
+use WineTestBot::Utils;
use WineTestBot::Engine::Notify;
@@ -67,6 +68,35 @@ sub Error(@)
}
+#
+# Task helpers
+#
+
+sub TakeScreenshot($$)
+{
+ my ($VM, $FileName) = @_;
+
+ my $Domain = $VM->GetDomain();
+ my ($ErrMessage, $ImageSize, $ImageBytes) = $Domain->CaptureScreenImage();
+ if (!defined $ErrMessage)
+ {
+ if (open(my $Screenshot, ">", $FileName))
+ {
+ print $Screenshot $ImageBytes;
+ close($Screenshot);
+ }
+ else
+ {
+ Error "Could not open the screenshot file for writing: $!\n";
+ }
+ }
+ elsif ($Domain->IsPoweredOn())
+ {
+ Error "Could not capture a screenshot: $ErrMessage\n";
+ }
+}
+
+
#
# Setup and command line processing
#
@@ -190,15 +220,17 @@ sub LogTaskError($)
}
}
-sub WrapUpAndExit($;$$)
+sub WrapUpAndExit($;$$$)
{
- my ($Status, $Retry, $Timeout) = @_;
+ my ($Status, $TestFailures, $Retry, $TimedOut) = @_;
my $NewVMStatus = $Status eq 'queued' ? 'offline' : 'dirty';
my $VMResult = $Status eq "boterror" ? "boterror" :
$Status eq "queued" ? "error" :
- $Timeout ? "timeout" : "";
+ $TimedOut ? "timeout" : "";
+
+ Debug(Elapsed($Start), " Taking a screenshot\n");
+ TakeScreenshot($VM, "$TaskDir/screenshot.png");
- my $TestFailures;
my $Tries = $Task->TestFailures || 0;
if ($Retry)
{
@@ -253,6 +285,30 @@ sub WrapUpAndExit($;$$)
$VM->Save();
}
+ if ($Step->Type eq 'suite' and $Status eq 'completed' and !$TimedOut)
+ {
+ my $BuildList = $Task->CmdLineArg;
+ $BuildList =~ s/ .*$//;
+ foreach my $Build (split /,/, $BuildList)
+ {
+ # Keep the old report if the new one is missing
+ my $RptFileName = "$Build.report";
+ if (-f "$TaskDir/$RptFileName" and !-z "$TaskDir/$RptFileName")
+ {
+ # Update the reference VM suite results for WineSendLog.pl
+ my $LatestBaseName = join("", "$DataDir/latest/", $Task->VM->Name,
+ "_$Build");
+ unlink("$LatestBaseName.log");
+ link("$TaskDir/$RptFileName", "$LatestBaseName.log");
+ unlink("$LatestBaseName.err");
+ if (-f "$TaskDir/err" and !-z "$TaskDir/err")
+ {
+ link("$TaskDir/err", "$LatestBaseName.err");
+ }
+ }
+ }
+ }
+
my $Result = $VM->Name .": ". $VM->Status ." Status: $Status Failures: ". (defined $TestFailures ? $TestFailures : "unset");
LogMsg "Task $JobId/$StepNo/$TaskNo done ($Result)\n";
Debug(Elapsed($Start), " Done. $Result\n");
@@ -266,12 +322,12 @@ sub FatalError($;$)
LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
LogTaskError($ErrMessage);
- WrapUpAndExit('boterror', $Retry);
+ WrapUpAndExit('boterror', undef, $Retry);
}
-sub FatalTAError($$)
+sub FatalTAError($$;$)
{
- my ($TA, $ErrMessage) = @_;
+ my ($TA, $ErrMessage, $PossibleCrash) = @_;
$ErrMessage .= ": ". $TA->GetLastError() if (defined $TA);
# A TestAgent operation failed, see if the VM is still accessible
@@ -297,7 +353,13 @@ sub FatalTAError($$)
else
{
# Ignore the TestAgent error, it's irrelevant
- $ErrMessage = "The test VM is powered off!\n";
+ $ErrMessage = "The test VM is powered off! Did the test shut it down?\n";
+ }
+ if ($PossibleCrash and !$Task->CanRetry())
+ {
+ # The test did it!
+ LogTaskError($ErrMessage);
+ WrapUpAndExit('completed', 1);
}
FatalError($ErrMessage, $Retry);
}
@@ -320,33 +382,78 @@ elsif (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
-if ($Step->FileType ne "patchdlls")
+if (($Step->Type eq "suite" and $Step->FileType ne "none") or
+ ($Step->Type ne "suite" and $Step->FileType ne "patchdlls"))
{
FatalError("Unexpected file type '". $Step->FileType ."' found\n");
}
#
-# Run the task
+# Setup the VM
#
+my $TA = $VM->GetAgent();
+Debug(Elapsed($Start), " Setting the time\n");
+if (!$TA->SetTime())
+{
+ # Not a fatal error. Try the next port in case the VM runs a privileged
+ # TestAgentd daemon there.
+ my $PrivilegedTA = $VM->GetAgent(1);
+ if (!$PrivilegedTA->SetTime())
+ {
+ LogTaskError("Unable to set the VM system time: ". $PrivilegedTA->GetLastError() .". Maybe the TestAgentd process is missing the required privileges.\n");
+ $PrivilegedTA->Disconnect();
+ }
+}
my $FileName = $Step->GetFullFileName();
-my $TA = $VM->GetAgent();
-Debug(Elapsed($Start), " Sending '$FileName'\n");
-if (!$TA->SendFile($FileName, "staging/patch.diff", 0))
+if (defined $FileName)
{
- FatalTAError($TA, "Could not copy the patch to the VM");
+ Debug(Elapsed($Start), " Sending '$FileName'\n");
+ if (!$TA->SendFile($FileName, "staging/patch.diff", 0))
+ {
+ FatalTAError($TA, "Could not copy the patch to the VM");
+ }
}
+
my $Script = "#!/bin/sh\n".
- "( set -x\n" .
- " ../bin/build/WineTest.pl ". $Task->CmdLineArg ." build patch.diff\n".
- ") >Task.log 2>&1\n";
+ "( set -x\n".
+ " ../bin/build/WineTest.pl ";
+if ($Step->Type eq "suite")
+{
+ my $Tag = lc($VM->Name);
+ $Tag =~ s/^$TagPrefix//;
+ $Tag =~ s/[^a-zA-Z0-9]/-/g;
+ $Script .= $Task->CmdLineArg .",submit winetest $TagPrefix-$Tag ";
+ if (defined $WebHostName)
+ {
+ my $StepTask = 100 * $StepNo + $TaskNo;
+ $Script .= "-u \"http://$WebHostName/JobDetails.pl?Key=$JobId&s$StepTask=1#k$StepTask\" ";
+ }
+ my $Info = $VM->Description ? $VM->Description : "";
+ if ($VM->Details)
+ {
+ $Info .= ": " if ($Info ne "");
+ $Info .= $VM->Details;
+ }
+ $Script .= join(" ", "-m", ShQuote($AdminEMail), "-i", ShQuote($Info));
+}
+else
+{
+ $Script .= $Task->CmdLineArg ." build patch.diff";
+}
+$Script .= "\n) >Task.log 2>&1\n";
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
{
FatalTAError($TA, "Could not send the task script to the VM");
}
+
+#
+# Run the test
+#
+
Debug(Elapsed($Start), " Starting the script\n");
my $Pid = $TA->Run(["./task"], 0);
if (!$Pid)
@@ -357,10 +464,11 @@ if (!$Pid)
#
# From that point on we want to at least try to grab the task log
-# before giving up
+# and a screenshot before giving up
#
-my ($NewStatus, $ErrMessage, $TAError, $TaskTimedOut);
+my $NewStatus = 'completed';
+my ($TaskFailures, $TaskTimedOut, $ErrMessage, $TAError, $PossibleCrash);
Debug(Elapsed($Start), " Waiting for the script (", $Task->Timeout, "s timeout)\n");
if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
{
@@ -368,11 +476,19 @@ if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
if ($ErrMessage =~ /timed out waiting for the child process/)
{
$ErrMessage = "The task timed out\n";
- $NewStatus = "badbuild";
+ if ($Step->Type eq "build")
+ {
+ $NewStatus = "badbuild";
+ }
+ else
+ {
+ $TaskFailures = 1;
+ }
$TaskTimedOut = 1;
}
else
{
+ $PossibleCrash = 1 if ($Step->Type ne "build");
$TAError = "An error occurred while waiting for the task to complete: $ErrMessage";
$ErrMessage = undef;
}
@@ -399,10 +515,11 @@ if ($TA->GetFile("Task.log", "$TaskDir/log"))
{
FatalError("$Result\n", "retry");
}
- else
+ elsif ($Result ne "missing" or $Step->Type ne "suite")
{
- # If the result line is missing we probably already have an error message
- # that explains why.
+ # There is no build and thus no result line when running WineTest.
+ # Otherwise if the result line is missing we probably already have an
+ # error message that explains why.
$NewStatus = "badbuild";
}
}
@@ -411,15 +528,62 @@ elsif (!defined $TAError)
$TAError = "An error occurred while retrieving the task log: ". $TA->GetLastError();
}
+#
+# Grab the test logs if any
+#
+
+my $TimedOut;
+if ($Step->Type ne "build")
+{
+ my $TaskDir = $Task->CreateDir();
+ my $BuildList = $Task->CmdLineArg;
+ $BuildList =~ s/ .*$//;
+ foreach my $Build (split /,/, $BuildList)
+ {
+ my $RptFileName = "$Build.report";
+ Debug(Elapsed($Start), " Retrieving '$RptFileName'\n");
+ if ($TA->GetFile($RptFileName, "$TaskDir/$RptFileName"))
+ {
+ chmod 0664, "$TaskDir/$RptFileName";
+
+ (my $LogFailures, my $LogErrors, $TimedOut) = ParseWineTestReport("$TaskDir/$RptFileName", 1, $Step->Type eq "suite", $TaskTimedOut);
+ if (!defined $LogFailures and @$LogErrors == 1)
+ {
+ # Could not open the file
+ $NewStatus = 'boterror';
+ Error "Unable to open '$RptFileName' for reading: $!\n";
+ LogTaskError("Unable to open '$RptFileName' for reading: $!\n");
+ }
+ else
+ {
+ # $LogFailures can legitimately be undefined in case of a timeout
+ $TaskFailures += $LogFailures || 0;
+ foreach my $Error (@$LogErrors)
+ {
+ LogTaskError("$Error\n");
+ }
+ }
+ }
+ elsif (!defined $TAError and
+ $TA->GetLastError() !~ /: No such file or directory/)
+ {
+ $TAError = "An error occurred while retrieving $RptFileName: ". $TA->GetLastError();
+ $NewStatus = 'boterror';
+ }
+ }
+}
+
+Debug(Elapsed($Start), " Disconnecting\n");
+$TA->Disconnect();
+
# Report the task errors even though they may have been caused by
# TestAgent trouble.
LogTaskError($ErrMessage) if (defined $ErrMessage);
-FatalTAError(undef, $TAError) if (defined $TAError);
-$TA->Disconnect();
+FatalTAError(undef, $TAError, $PossibleCrash) if (defined $TAError);
#
# Wrap up
#
-WrapUpAndExit($NewStatus, undef, $TaskTimedOut);
+WrapUpAndExit($NewStatus, $TaskFailures, undef, $TaskTimedOut || $TimedOut);
diff --git a/testbot/bin/build/WineReconfig.pl b/testbot/bin/build/WineReconfig.pl
index b030051c6..e3f14e243 100755
--- a/testbot/bin/build/WineReconfig.pl
+++ b/testbot/bin/build/WineReconfig.pl
@@ -40,6 +40,9 @@ my $Name0 = $0;
$Name0 =~ s+^.*/++;
+use Digest::SHA;
+use File::Path;
+
use WineTestBot::Config;
use WineTestBot::PatchUtils;
@@ -126,7 +129,7 @@ sub BuildWine($$$$)
{
my ($Targets, $NoRm, $Build, $Extras) = @_;
- return 1 if (!$Targets->{$Build});
+ return 1 if (!$Targets->{build} or !$Targets->{$Build});
mkdir "$DataDir/build-$Build" if (!-d "$DataDir/build-$Build");
# If $NoRm is not set, rebuild from scratch to make sure cruft will not
@@ -134,7 +137,7 @@ sub BuildWine($$$$)
InfoMsg "\nRebuilding the $Build Wine\n";
system("cd '$DataDir/build-$Build' && set -x && ".
($NoRm ? "" : "rm -rf * && ") .
- "time ../wine/configure $Extras --disable-winetest && ".
+ "time ../wine/configure $Extras && ".
"time make -j$ncpus");
if ($? != 0)
{
@@ -146,6 +149,154 @@ sub BuildWine($$$$)
}
+#
+# WinePrefix helpers
+#
+
+sub VerifyAddOn($$)
+{
+ my ($AddOn, $Arch) = @_;
+
+ my $Sha256 = Digest::SHA->new(256);
+ eval { $Sha256->addfile("$DataDir/$AddOn->{name}/$AddOn->{filename}") };
+ return "$@" if ($@);
+
+ my $Checksum = $Sha256->hexdigest();
+ return undef if ($Checksum eq $AddOn->{$Arch});
+ return "Bad checksum for '$AddOn->{filename}'";
+}
+
+sub UpdateAddOn($$$)
+{
+ my ($AddOn, $Name, $Arch) = @_;
+
+ if (!defined $AddOn)
+ {
+ LogMsg "Could not get information on the $Name addon\n";
+ return 0;
+ }
+ if (!$AddOn->{version})
+ {
+ LogMsg "Could not get the $Name version\n";
+ return 0;
+ }
+ if (!$AddOn->{$Arch})
+ {
+ LogMsg "Could not get the $Name $Arch checksum\n";
+ return 0;
+ }
+
+ $AddOn->{filename} = "wine". ($Name eq "gecko" ? "_" : "-") .
+ "$Name-$AddOn->{version}".
+ ($Arch eq "" ? "" : "-$Arch") .".msi";
+ return 1 if (!VerifyAddOn($AddOn, $Arch));
+
+ InfoMsg "Downloading $AddOn->{filename}\n";
+ mkdir "$DataDir/$Name";
+
+ my $Url="http://dl.winehq.org/wine/wine-$Name/$AddOn->{version}/$AddOn->{filename}";
+ for (1..3)
+ {
+ system("cd '$DataDir/$Name' && set -x && ".
+ "wget --no-verbose -O- '$Url' >'$AddOn->{filename}'");
+ last if ($? == 0);
+ }
+ my $ErrMessage = VerifyAddOn($AddOn, $Arch);
+ return 1 if (!defined $ErrMessage);
+ LogMsg "$ErrMessage\n";
+ return 0;
+}
+
+sub UpdateAddOns($)
+{
+ my ($Targets) = @_;
+ return 1 if (!$Targets->{addons});
+
+ my %AddOns;
+ if (open(my $fh, "<", "$DataDir/wine/dlls/appwiz.cpl/addons.c"))
+ {
+ my $Arch = "";
+ while (my $Line= <$fh>)
+ {
+ if ($Line =~ /^\s*#\s*define\s+ARCH_STRING\s+"([^"]+)"/)
+ {
+ $Arch = $1;
+ }
+ elsif ($Line =~ /^\s*#\s*define\s*(GECKO|MONO)_VERSION\s*"([^"]+)"/)
+ {
+ my ($AddOn, $Version) = ($1, $2);
+ $AddOn =~ tr/A-Z/a-z/;
+ $AddOns{$AddOn}->{name} = $AddOn;
+ $AddOns{$AddOn}->{version} = $Version;
+ }
+ elsif ($Line =~ /^\s*#\s*define\s*(GECKO|MONO)_SHA\s*"([^"]+)"/)
+ {
+ my ($AddOn, $Checksum) = ($1, $2);
+ $AddOn =~ tr/A-Z/a-z/;
+ $AddOns{$AddOn}->{$Arch} = $Checksum;
+ $Arch = "";
+ }
+ }
+ close($fh);
+ }
+ else
+ {
+ LogMsg "Could not open 'wine/dlls/appwiz.cpl/addons.c': $!\n";
+ return 0;
+ }
+
+ return UpdateAddOn($AddOns{gecko}, "gecko", "x86") &&
+ UpdateAddOn($AddOns{gecko}, "gecko", "x86_64") &&
+ UpdateAddOn($AddOns{mono}, "mono", "");
+}
+
+# See also WineTest.pl
+sub SetupWineEnvironment($)
+{
+ my ($Build) = @_;
+
+ $ENV{WINEPREFIX} = "$DataDir/wineprefix-$Build";
+ $ENV{DISPLAY} ||= ":0.0";
+}
+
+# See also WineTest.pl
+sub RunWine($$$)
+{
+ my ($Build, $Cmd, $CmdArgs) = @_;
+
+ my $Magic = `cd '$DataDir/build-$Build' && file $Cmd`;
+ my $Wine = ($Magic =~ /ELF 64/ ? "./wine64" : "./wine");
+ return system("cd '$DataDir/build-$Build' && set -x && ".
+ "time $Wine $Cmd $CmdArgs");
+}
+
+# Setup a brand new WinePrefix ready for use for testing.
+# This way we do it once instead of doing it for every test, thus saving
+# time. Note that this requires using a different wineprefix for each build.
+sub NewWinePrefix($$)
+{
+ my ($Targets, $Build) = @_;
+
+ return 1 if (!$Targets->{wineprefix} or !$Targets->{$Build});
+
+ InfoMsg "\nRecreating the $Build wineprefix\n";
+ SetupWineEnvironment($Build);
+ rmtree($ENV{WINEPREFIX});
+
+ # Crash dialogs cause delays so disable them
+ if (RunWine($Build, "./programs/reg/reg.exe.so", "ADD HKCU\\\\Software\\\\Wine\\\\WineDbg /v ShowCrashDialog /t REG_DWORD /d 0"))
+ {
+ LogMsg "Failed to disable the $Build build crash dialogs: $!\n";
+ return 0;
+ }
+
+ # Ensure the WinePrefix has been fully created before updating the snapshot
+ system("cd '$DataDir/build-$Build' && ./server/wineserver -w");
+
+ return 1;
+}
+
+
#
# Setup and command line processing
#
@@ -154,7 +305,7 @@ $ENV{PATH} = "/usr/lib/ccache:/usr/bin:/bin";
delete $ENV{ENV};
my %AllTargets;
-map { $AllTargets{$_} = 1 } qw(update win32 wow32 wow64);
+map { $AllTargets{$_} = 1 } qw(update addons build wineprefix win32 wow32 wow64);
my ($Usage, $TargetList, $NoRm);
while (@ARGV)
@@ -212,15 +363,18 @@ if (defined $Usage)
}
print "Usage: $Name0 [--no-rm] [--help] [TARGETS]\n";
print "\n";
- print "Performs all the tasks needed for the host to be ready to test new patches: update the Wine source and rebuild the Wine binaries.\n";
+ print "Performs all the tasks needed for the host to be ready to test new patches: update the Wine source and addons, and rebuild the Wine binaries.\n";
print "\n";
print "Where:\n";
print " TARGETS Is a comma-separated list of targets to process. By default all\n";
print " targets are processed.\n";
print " - update: Update Wine's source code.\n";
- print " - win32: Rebuild the regular 32 bit Wine.\n";
- print " - wow32: Rebuild the 32 bit WoW Wine.\n";
- print " - wow64: Rebuild the 64 bit WoW Wine.\n";
+ print " - build: Update the Wine builds.\n";
+ print " - addons: Update the Gecko and Mono Wine addons.\n";
+ print " - wineprefix: Update the wineprefixes.\n";
+ print " - win32: Apply the above to the regular 32 bit Wine.\n";
+ print " - wow32: Apply the above to the 32 bit WoW Wine.\n";
+ print " - wow64: Apply the above to the 64 bit WoW Wine.\n";
print " --no-rm Don't rebuild from scratch.\n";
print " --help Shows this usage message.\n";
exit 0;
@@ -240,16 +394,25 @@ if ($DataDir =~ /'/)
#
-# Run the builds
+# Run the builds and/or tests
#
CountCPUs();
-if (!BuildTestAgentd() ||
- !GitPull($Targets) ||
- !BuildWine($Targets, $NoRm, "win32", "") ||
- !BuildWine($Targets, $NoRm, "wow64", "--enable-win64") ||
- !BuildWine($Targets, $NoRm, "wow32", "--with-wine64='$DataDir/build-wow64'"))
+if (!BuildTestAgentd() or
+ !GitPull($Targets) or
+ !UpdateAddOns($Targets) or
+ !BuildWine($Targets, $NoRm, "win32", "") or
+ !BuildWine($Targets, $NoRm, "wow64", "--enable-win64") or
+ !BuildWine($Targets, $NoRm, "wow32", "--with-wine64='$DataDir/build-wow64'") or
+ !NewWinePrefix($Targets, "win32") or
+ # The wow32 and wow64 wineprefixes:
+ # - Are essentially identical.
+ # - Must be created after both WoW builds have been updated.
+ # - Make it possible to run the wow32 and wow64 tests in separate prefixes,
+ # thus ensuring they don't interfere with each other.
+ !NewWinePrefix($Targets, "wow64") or
+ !NewWinePrefix($Targets, "wow32"))
{
exit(1);
}
diff --git a/testbot/bin/build/WineTest.pl b/testbot/bin/build/WineTest.pl
index 3be81485e..518deae99 100755
--- a/testbot/bin/build/WineTest.pl
+++ b/testbot/bin/build/WineTest.pl
@@ -144,6 +144,62 @@ sub BuildWine($$)
}
+#
+# Test helpers
+#
+
+# See also WineReconfig.pl
+sub SetupWineEnvironment($)
+{
+ my ($Build) = @_;
+
+ $ENV{WINEPREFIX} = "$DataDir/wineprefix-$Build";
+ $ENV{DISPLAY} ||= ":0.0";
+}
+
+# See also WineReconfig.pl
+sub RunWine($$$)
+{
+ my ($Build, $Cmd, $CmdArgs) = @_;
+
+ my $Magic = `cd '$DataDir/build-$Build' && file $Cmd`;
+ my $Wine = ($Magic =~ /ELF 64/ ? "./wine64" : "./wine");
+ return system("cd '$DataDir/build-$Build' && set -x && ".
+ "time $Wine $Cmd $CmdArgs");
+}
+
+sub DailyWineTest($$$$)
+{
+ my ($Targets, $Build, $BaseTag, $Args) = @_;
+
+ return 1 if (!$Targets->{$Build});
+
+ InfoMsg "\nRunning WineTest in the $Build Wine\n";
+ SetupWineEnvironment($Build);
+
+ # Run WineTest. Ignore the exit code since it returns non-zero whenever
+ # there are test failures.
+ RunWine($Build, "./programs/winetest/winetest.exe.so",
+ "-c -o '../$Build.report' -t $BaseTag-$Build ". ShArgv2Cmd(@$Args));
+ if (!-f "$Build.report")
+ {
+ LogMsg "WineTest did not produce a report file\n";
+ return 0;
+ }
+
+ # Send the report to the website
+ if ($Targets->{submit} and
+ RunWine($Build, "./programs/winetest/winetest.exe.so",
+ "-c -s '../$Build.report'"))
+ {
+ LogMsg "WineTest failed to send the $Build report\n";
+ # Soldier on in case it's just a network issue
+ }
+
+ return 1;
+}
+
+
#
# Setup and command line processing
#
@@ -152,9 +208,9 @@ $ENV{PATH} = "/usr/lib/ccache:/usr/bin:/bin";
delete $ENV{ENV};
my %AllTargets;
-map { $AllTargets{$_} = 1 } qw(win32 wow32 wow64);
+map { $AllTargets{$_} = 1 } qw(win32 wow32 wow64 submit);
-my ($Usage, $TargetList, $Action, $FileName);
+my ($Usage, $TargetList, $Action, $FileName, $BaseTag);
while (@ARGV)
{
my $Arg = shift @ARGV;
@@ -177,6 +233,12 @@ while (@ARGV)
{
$Action = $Arg;
}
+ elsif (($Action || "") eq "winetest")
+ {
+ $BaseTag = $Arg;
+ # The remaining arguments are meant for WineTest
+ last;
+ }
elsif (!defined $FileName)
{
if (IsValidFileName($Arg))
@@ -230,6 +292,23 @@ if (!defined $Usage)
Error "you must specify the action to perform\n";
$Usage = 2;
}
+ elsif ($Action eq "winetest")
+ {
+ if (!defined $BaseTag)
+ {
+ Error "you must specify a base tag for WineTest\n";
+ $Usage = 2;
+ }
+ elsif ($BaseTag =~ m/^([\w_.\-]+)$/)
+ {
+ $BaseTag = $1;
+ }
+ else
+ {
+ Error "invalid WineTest base tag '$BaseTag'\n";
+ $Usage = 2;
+ }
+ }
elsif ($Action ne "build")
{
Error "invalid '$Action' action\n";
@@ -245,16 +324,23 @@ if (!defined $Usage)
if (defined $Usage)
{
print "Usage: $Name0 [--help] TARGETS build PATCH\n";
+ print "or $Name0 [--help] TARGETS winetest BASETAG ARGS\n";
print "\n";
- print "Applies the specified patch and rebuilds Wine.\n";
+ print "Tests the specified patch or runs WineTest in Wine.\n";
print "\n";
print "Where:\n";
- print " TARGETS Is a comma-separated list of targets for the build.\n";
+ print " TARGETS Is a comma-separated list of targets for the specified action.\n";
print " - win32: The regular 32 bit Wine build.\n";
print " - wow32: The 32 bit WoW Wine build.\n";
print " - wow64: The 64 bit WoW Wine build.\n";
+ print " - submit: Send the WineTest result to the website.\n";
print " build Verify that the patch compiles.\n";
print " PATCH Is the staging file containing the patch to test.\n";
+ print " winetest Run WineTest and submit the result to the website if the submit\n";
+ print " task was specified.\n";
+ print " BASETAG Is the tag for this WineTest run. Note that the build type is\n";
+ print " automatically added to this tag.\n";
+ print " ARGS The WineTest arguments.\n";
print " --help Shows this usage message.\n";
exit $Usage;
}
@@ -267,16 +353,28 @@ if ($DataDir =~ /'/)
#
-# Run the builds
+# Run the builds and tests
#
+# Clean up old reports
+map { unlink("$_.report") } keys %AllTargets;
+
CountCPUs();
-my $Impacts = ApplyPatch($FileName);
-exit(1) if (!$Impacts or
- !BuildWine($Targets, "win32") or
- !BuildWine($Targets, "wow64") or
- !BuildWine($Targets, "wow32"));
+if ($Action eq "build")
+{
+ my $Impacts = ApplyPatch($FileName);
+ exit(1) if (!$Impacts or
+ !BuildWine($Targets, "win32") or
+ !BuildWine($Targets, "wow64") or
+ !BuildWine($Targets, "wow32"));
+}
+elsif ($Action eq "winetest")
+{
+ exit(1) if (!DailyWineTest($Targets, "win32", $BaseTag, \@ARGV) or
+ !DailyWineTest($Targets, "wow64", $BaseTag, \@ARGV) or
+ !DailyWineTest($Targets, "wow32", $BaseTag, \@ARGV));
+}
LogMsg "ok\n";
exit;
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index 363f80827..2d3042ec7 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -458,6 +458,7 @@ sub GetLogFileNames($;$)
my ($Dir, $IncludeOld) = @_;
my @Candidates = ("exe32.report", "exe64.report",
+ "win32.report", "wow32.report", "wow64.report",
"log", "err");
push @Candidates, "log.old", "err.old" if ($IncludeOld);
@@ -472,10 +473,13 @@ sub GetLogFileNames($;$)
my %_LogFileLabels = (
"exe32.report" => "32 bit Windows report",
"exe64.report" => "64 bit Windows report",
- "err" => "task errors",
+ "win32.report" => "32 bit Wine report",
+ "wow32.report" => "32 bit WoW Wine report",
+ "wow64.report" => "64 bit Wow Wine report",
"log" => "task log",
- "err.old" => "old task errors",
+ "err" => "task errors",
"log.old" => "old logs",
+ "err.old" => "old task errors",
);
=pod
diff --git a/testbot/lib/WineTestBot/Utils.pm b/testbot/lib/WineTestBot/Utils.pm
index 111a56589..f64310b6b 100644
--- a/testbot/lib/WineTestBot/Utils.pm
+++ b/testbot/lib/WineTestBot/Utils.pm
@@ -29,7 +29,7 @@ use Exporter 'import';
our @EXPORT = qw(MakeSecureURL SecureConnection GenerateRandomString
OpenNewFile CreateNewFile CreateNewLink CreateNewDir
DurationToString BuildEMailRecipient IsValidFileName
- ShQuote);
+ ShQuote ShArgv2Cmd);
use Fcntl;
@@ -220,4 +220,21 @@ sub ShQuote($)
return "\"$Str\"";
}
+=pod
+=over 12
+
+=item C<ShArgv2Cmd()>
+
+Converts an argument list into a command line suitable for use in a shell.
+
+See also ShQuote().
+
+=back
+=cut
+
+sub ShArgv2Cmd(@)
+{
+ return join(' ', map { /[^a-zA-Z0-9\/.,+_-]/ ? ShQuote($_) : $_ } @_);
+}
+
1;
--
2.18.0
June 27, 2018
[PATCH 2/3] testbot/WineRunTask: Make the Wine report parser reusable.
by Francois Gouget
Moving it to LogUtils.pm makes it possible to reuse it in future
scripts.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunTask.pl | 276 ++-----------------------
testbot/lib/WineTestBot/LogUtils.pm | 310 +++++++++++++++++++++++++++-
2 files changed, 322 insertions(+), 264 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 9faae28c3..821ca55ea 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -44,6 +44,7 @@ use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::VMs;
use WineTestBot::Log;
+use WineTestBot::LogUtils;
use WineTestBot::Engine::Notify;
@@ -527,275 +528,24 @@ Debug(Elapsed($Start), " Retrieving the report file to '$RptFileName'\n");
if ($TA->GetFile($RptFileName, "$TaskDir/$RptFileName"))
{
chmod 0664, "$TaskDir/$RptFileName";
- if (open(my $LogFile, "<", "$TaskDir/$RptFileName"))
- {
- # There is more than one test unit when running the full test suite so keep
- # track of the current one. Note that for the TestBot we don't count or
- # complain about misplaced skips.
- my ($CurrentDll, $CurrentUnit) = ("", "");
- my $UnitSize = 0;
- my ($LineFailures, $LineTodos, $LineSkips) = (0, 0, 0);
- my ($SummaryFailures, $SummaryTodos, $SummarySkips) = (0, 0, 0);
- my ($CurrentIsBroken, %CurrentPids, $CurrentRc, $LogFailures);
-
- sub CheckUnit($$)
- {
- my ($Unit, $Type) = @_;
- if ($Unit eq $CurrentUnit or $CurrentUnit eq "")
- {
- $IsWineTest = 1;
- }
- # To avoid issuing many duplicate errors,
- # only report the first misplaced message.
- elsif ($IsWineTest and !$CurrentIsBroken)
- {
- LogTaskError("$CurrentDll:$CurrentUnit contains a misplaced $Type message for $Unit\n");
- $LogFailures++;
- $CurrentIsBroken = 1;
- }
- }
-
- sub CheckSummaryCounter($$$)
- {
- my ($Count, $SCount, $Type) = @_;
-
- if ($Count != 0 and $SCount == 0)
- {
- LogTaskError("$CurrentDll:$CurrentUnit has unaccounted for $Type messages\n");
- $LogFailures++;
- }
- elsif ($Count == 0 and $SCount != 0)
- {
- LogTaskError("$CurrentDll:$CurrentUnit is missing some $Type messages\n");
- $LogFailures++;
- }
- }
-
- sub CloseTestUnit($)
- {
- my ($Last) = @_;
-
- # Verify the summary lines
- if (!$CurrentIsBroken)
- {
- CheckSummaryCounter($LineFailures, $SummaryFailures, "failure");
- CheckSummaryCounter($LineTodos, $SummaryTodos, "todo");
- CheckSummaryCounter($LineSkips, $SummarySkips, "skip");
- }
-
- # Note that the summary lines may count some failures twice
- # so only use them as a fallback.
- $LineFailures ||= $SummaryFailures;
-
- if ($UnitSize > $MaxUnitSize)
- {
- LogTaskError("$CurrentDll:$CurrentUnit prints too much data ($UnitSize bytes)\n");
- $LogFailures++;
- }
- if (!$CurrentIsBroken and defined $CurrentRc)
- {
- # Check the exit code, particularly against failures reported
- # after the 'done' line (e.g. by subprocesses).
- if ($LineFailures != 0 and $CurrentRc == 0)
- {
- LogTaskError("$CurrentDll:$CurrentUnit returned success despite having failures\n");
- $LogFailures++;
- }
- elsif (!$IsWineTest and $CurrentRc != 0)
- {
- LogTaskError("The test returned a non-zero exit code\n");
- $LogFailures++;
- }
- elsif ($IsWineTest and $LineFailures == 0 and $CurrentRc != 0)
- {
- LogTaskError("$CurrentDll:$CurrentUnit returned a non-zero exit code despite reporting no failures\n");
- $LogFailures++;
- }
- }
- # For executables TestLauncher's done line may not be recognizable.
- elsif ($IsWineTest and !defined $CurrentRc)
- {
- if (!$Last)
- {
- LogTaskError("$CurrentDll:$CurrentUnit has no done line (or it is garbled)\n");
- }
- elsif ($Last and !$TaskTimedOut)
- {
- LogTaskError("The report seems to have been truncated\n");
- }
- $LogFailures++;
- }
-
- $LogFailures += $LineFailures;
-
- $CurrentDll = $CurrentUnit = "";
- $UnitSize = 0;
- $LineFailures = $LineTodos = $LineSkips = 0;
- $SummaryFailures = $SummaryTodos = $SummarySkips = 0;
- $CurrentIsBroken = 0;
- $CurrentRc = undef;
- %CurrentPids = ();
- }
-
- foreach my $Line (<$LogFile>)
- {
- $UnitSize += length($Line);
- if ($Line =~ m%^([_.a-z0-9-]+):([_a-z0-9]*) (start|skipped) (?:-|[/_.a-z0-9]+) (?:-|[.0-9a-f]+)\r?$%)
- {
- my ($Dll, $Unit, $Type) = ($1, $2, $3);
-
- # Close the previous test unit
- CloseTestUnit(0) if ($CurrentDll ne "");
-
- ($CurrentDll, $CurrentUnit) = ($Dll, $Unit);
-
- # Recognize skipped messages in case we need to skip tests in the VMs
- $CurrentRc = 0 if ($Type eq "skipped");
- }
- elsif ($Line =~ /^([_a-z0-9]+)\.c:\d+: Test (?:failed|succeeded inside todo block): / or
- ($CurrentUnit ne "" and
- $Line =~ /($CurrentUnit)\.c:\d+: Test (?:failed|succeeded inside todo block): /))
- {
- CheckUnit($1, "failure");
- $LineFailures++;
- }
- elsif ($Line =~ /^([_a-z0-9]+)\.c:\d+: Test marked todo: / or
- ($CurrentUnit ne "" and
- $Line =~ /($CurrentUnit)\.c:\d+: Test marked todo: /))
- {
- CheckUnit($1, "todo");
- $LineTodos++;
- }
- # TestLauncher's skip message is quite broken
- elsif ($Line =~ /^([_a-z0-9]+)(?:\.c)?:\d+:? Tests? skipped: / or
- ($CurrentUnit ne "" and
- $Line =~ /($CurrentUnit)(?:\.c)?:\d+:? Tests? skipped: /))
- {
- my $Unit = $1;
- # Don't complain and don't count misplaced skips. Only complain if they
- # are misreported (see CloseTestUnit). Also TestLauncher uses the wrong
- # name in its skip message when skipping tests.
- if ($Unit eq $CurrentUnit or $CurrentUnit eq "" or $Unit eq $CurrentDll)
- {
- $LineSkips++;
- }
- }
- elsif ($Line =~ /^Fatal: test '([_a-z0-9]+)' does not exist/)
- {
- # This also replaces a test summary line.
- $CurrentPids{0} = 1;
- $SummaryFailures++;
- $IsWineTest = 1;
-
- $LineFailures++;
- }
- elsif ($Line =~ /^(?:([0-9a-f]+):)?([_.a-z0-9]+): unhandled exception [0-9a-fA-F]{8} at / or
- ($CurrentUnit ne "" and
- $Line =~ /(?:([0-9a-f]+):)?($CurrentUnit): unhandled exception [0-9a-fA-F]{8} at /))
- {
- my ($Pid, $Unit) = ($1, $2);
-
- if ($Unit eq $CurrentUnit)
- {
- # This also replaces a test summary line.
- $CurrentPids{$Pid || 0} = 1;
- $SummaryFailures++;
- }
- CheckUnit($Unit, "unhandled exception");
- $LineFailures++;
- }
- elsif ($Line =~ /^(?:([0-9a-f]+):)?([_a-z0-9]+): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), (\d+) skipped\./ or
- ($CurrentUnit ne "" and
- $Line =~ /(?:([0-9a-f]+):)?($CurrentUnit): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), (\d+) skipped\./))
- {
- my ($Pid, $Unit, $Todos, $Failures, $Skips) = ($1, $2, $3, $4, $5);
-
- # Dlls that have only one test unit will run it even if there is
- # no argument. Also TestLauncher uses the wrong name in its test
- # summary line when skipping tests.
- if ($Unit eq $CurrentUnit or $CurrentUnit eq "" or $Unit eq $CurrentDll)
- {
- # There may be more than one summary line due to child processes
- $CurrentPids{$Pid || 0} = 1;
- $SummaryFailures += $Failures;
- $SummaryTodos += $Todos;
- $SummarySkips += $Skips;
- $IsWineTest = 1;
- }
- else
- {
- CheckUnit($Unit, "test summary") if ($Todos or $Failures);
- }
- }
- elsif ($Line =~ /^([_.a-z0-9-]+):([_a-z0-9]*)(?::([0-9a-f]+))? done \((-?\d+)\)(?:\r?$| in)/ or
- ($CurrentDll ne "" and
- $Line =~ /(\Q$CurrentDll\E):([_a-z0-9]*)(?::([0-9a-f]+))? done \((-?\d+)\)(?:\r?$| in)/))
- {
- my ($Dll, $Unit, $Pid, $Rc) = ($1, $2, $3, $4);
-
- if ($IsWineTest and ($Dll ne $CurrentDll or $Unit ne $CurrentUnit))
- {
- # First close the current test unit taking into account
- # it may have been polluted by the new one.
- $LogFailures++;
- $CurrentIsBroken = 1;
- CloseTestUnit(0);
-
- # Then switch to the new one, warning it's missing a start line,
- # and that its results may be inconsistent.
- ($CurrentDll, $CurrentUnit) = ($Dll, $Unit);
- LogTaskError("$Dll:$Unit had no start line (or it is garbled)\n");
- $CurrentIsBroken = 1;
- }
-
- if ($Rc == 258)
- {
- # The done line will already be shown as a timeout (see JobDetails)
- # so record the failure but don't add an error message.
- $LogFailures++;
- $CurrentIsBroken = 1;
- $TimedOut = ($Step->Type ne "suite");
- }
- elsif ((!$Pid and !%CurrentPids) or
- ($Pid and !$CurrentPids{$Pid} and !$CurrentPids{0}))
- {
- # The main summary line is missing
- if ($Rc & 0xc0000000)
- {
- LogTaskError(sprintf("%s:%s crashed (%08x)\n", $Dll, $Unit, $Rc & 0xffffffff));
- $LogFailures++;
- $CurrentIsBroken = 1;
- }
- elsif ($IsWineTest and !$CurrentIsBroken)
- {
- LogTaskError("$Dll:$Unit has no test summary line (early exit of the main process?)\n");
- $LogFailures++;
- }
- }
- elsif ($Rc & 0xc0000000)
- {
- # We know the crash happened in the main process which means we got
- # an "unhandled exception" message. So there is no need to add an
- # extra message or to increment the failure count. Still note that
- # there may be inconsistencies (e.g. unreported todos or skips).
- $CurrentIsBroken = 1;
- }
- $CurrentRc = $Rc;
- }
- }
- $CurrentIsBroken = 1 if ($TaskTimedOut);
- CloseTestUnit(1);
- close($LogFile);
- # $LogFailures can legitimately be undefined in case of a timeout
- $TaskFailures += $LogFailures || 0;
- }
- else
+ (my $LogFailures, my $LogErrors, $TimedOut) = ParseWineTestReport("$TaskDir/$RptFileName", $IsWineTest, $Step->Type eq "suite", $TaskTimedOut);
+ if (!defined $LogFailures and @$LogErrors == 1)
{
+ # Could not open the file
$NewStatus = 'boterror';
Error "Unable to open '$RptFileName' for reading: $!\n";
LogTaskError("Unable to open '$RptFileName' for reading: $!\n");
}
+ else
+ {
+ # $LogFailures can legitimately be undefined in case of a timeout
+ $TaskFailures += $LogFailures || 0;
+ foreach my $Error (@$LogErrors)
+ {
+ LogTaskError("$Error\n");
+ }
+ }
}
elsif (!defined $TAError)
{
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index 3dfd7c5e7..363f80827 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -27,7 +27,12 @@ WineTestBot::LogUtils - Provides functions to parse task logs
use Exporter 'import';
-our @EXPORT = qw(GetLogFileNames GetLogLabel GetLogLineCategory ParseTaskLog);
+our @EXPORT = qw(GetLogFileNames GetLogLabel GetLogLineCategory
+ ParseTaskLog ParseWineTestReport);
+
+use File::Basename;
+
+use WineTestBot::Config; # For $MaxUnitSize
#
@@ -75,6 +80,309 @@ sub ParseTaskLog($$)
}
+#
+# WineTest report parser
+#
+
+sub _NewCurrentUnit($$)
+{
+ my ($Dll, $Unit) = @_;
+
+ return {
+ # There is more than one test unit when running the full test suite so keep
+ # track of the current one. Note that for the TestBot we don't count or
+ # complain about misplaced skips.
+ Dll => $Dll,
+ Unit => $Unit,
+ UnitSize => 0,
+ LineFailures => 0,
+ LineTodos => 0,
+ LineSkips => 0,
+ SummaryFailures => 0,
+ SummaryTodos => 0,
+ SummarySkips => 0,
+ IsBroken => 0,
+ Rc => undef,
+ Pids => {},
+ };
+}
+
+sub _AddError($$;$)
+{
+ my ($Parser, $Error, $Cur) = @_;
+
+ $Error = "$Cur->{Dll}:$Cur->{Unit} $Error" if (defined $Cur);
+ push @{$Parser->{Errors}}, $Error;
+ $Parser->{Failures}++;
+}
+
+sub _CheckUnit($$$$)
+{
+ my ($Parser, $Cur, $Unit, $Type) = @_;
+
+ if ($Unit eq $Cur->{Unit} or $Cur->{Unit} eq "")
+ {
+ $Parser->{IsWineTest} = 1;
+ }
+ # To avoid issuing many duplicate errors,
+ # only report the first misplaced message.
+ elsif ($Parser->{IsWineTest} and !$Cur->{IsBroken})
+ {
+ _AddError($Parser, "contains a misplaced $Type message for $Unit", $Cur);
+ $Cur->{IsBroken} = 1;
+ }
+}
+
+sub _CheckSummaryCounter($$$$)
+{
+ my ($Parser, $Cur, $Field, $Type) = @_;
+
+ if ($Cur->{"Line$Field"} != 0 and $Cur->{"Summary$Field"} == 0)
+ {
+ _AddError($Parser, "has unaccounted for $Type messages", $Cur);
+ }
+ elsif ($Cur->{"Line$Field"} == 0 and $Cur->{"Summary$Field"} != 0)
+ {
+ _AddError($Parser, "is missing some $Type messages", $Cur);
+ }
+}
+
+sub _CloseTestUnit($$$)
+{
+ my ($Parser, $Cur, $Last) = @_;
+
+ # Verify the summary lines
+ if (!$Cur->{IsBroken})
+ {
+ _CheckSummaryCounter($Parser, $Cur, "Failures", "failure");
+ _CheckSummaryCounter($Parser, $Cur, "Todos", "todo");
+ _CheckSummaryCounter($Parser, $Cur, "Skips", "skip");
+ }
+
+ # Note that the summary lines may count some failures twice
+ # so only use them as a fallback.
+ $Cur->{LineFailures} ||= $Cur->{SummaryFailures};
+
+ if ($Cur->{UnitSize} > $MaxUnitSize)
+ {
+ _AddError($Parser, "prints too much data ($Cur->{UnitSize} bytes)", $Cur);
+ }
+ if (!$Cur->{IsBroken} and defined $Cur->{Rc})
+ {
+ # Check the exit code, particularly against failures reported
+ # after the 'done' line (e.g. by subprocesses).
+ if ($Cur->{LineFailures} != 0 and $Cur->{Rc} == 0)
+ {
+ _AddError($Parser, "returned success despite having failures", $Cur);
+ }
+ elsif (!$Parser->{IsWineTest} and $Cur->{Rc} != 0)
+ {
+ _AddError($Parser, "The test returned a non-zero exit code");
+ }
+ elsif ($Parser->{IsWineTest} and $Cur->{LineFailures} == 0 and $Cur->{Rc} != 0)
+ {
+ _AddError($Parser, "returned a non-zero exit code despite reporting no failures", $Cur);
+ }
+ }
+ # For executables TestLauncher's done line may not be recognizable.
+ elsif ($Parser->{IsWineTest} and !defined $Cur->{Rc})
+ {
+ if (!$Last)
+ {
+ _AddError($Parser, "has no done line (or it is garbled)", $Cur);
+ }
+ elsif ($Last and !$Parser->{TaskTimedOut})
+ {
+ _AddError($Parser, "The report seems to have been truncated");
+ }
+ }
+
+ $Parser->{Failures} += $Cur->{LineFailures};
+}
+
+=pod
+=over 12
+
+=item C<ParseWineTestReport()>
+
+Parses a Wine test report and returns the number of failures and extra errors,
+a list of extra errors, and whether the test timed out.
+
+=back
+=cut
+
+sub ParseWineTestReport($$$$)
+{
+ my ($FileName, $IsWineTest, $IsSuite, $TaskTimedOut) = @_;
+
+ my $LogFile;
+ if (!open($LogFile, "<", $FileName))
+ {
+ my $BaseName = basename($FileName);
+ return (undef, ["Unable to open '$BaseName' for reading: $!"], undef);
+ }
+
+ my $Parser = {
+ IsWineTest => $IsWineTest,
+ IsSuite => $IsSuite,
+ TaskTimedOut => $TaskTimedOut,
+
+ TimedOut => undef,
+ Failures => undef,
+ Errors => [],
+ };
+
+ my $Cur = _NewCurrentUnit("", "");
+ foreach my $Line (<$LogFile>)
+ {
+ $Cur->{UnitSize} += length($Line);
+ if ($Line =~ m%^([_.a-z0-9-]+):([_a-z0-9]*) (start|skipped) (?:-|[/_.a-z0-9]+) (?:-|[.0-9a-f]+)\r?$%)
+ {
+ my ($Dll, $Unit, $Type) = ($1, $2, $3);
+
+ # Close the previous test unit
+ _CloseTestUnit($Parser, $Cur, 0) if ($Cur->{Dll} ne "");
+ $Cur = _NewCurrentUnit($Dll, $Unit);
+
+ # Recognize skipped messages in case we need to skip tests in the VMs
+ $Cur->{Rc} = 0 if ($Type eq "skipped");
+ }
+ elsif ($Line =~ /^([_a-z0-9]+)\.c:\d+: Test (?:failed|succeeded inside todo block): / or
+ ($Cur->{Unit} ne "" and
+ $Line =~ /($Cur->{Unit})\.c:\d+: Test (?:failed|succeeded inside todo block): /))
+ {
+ _CheckUnit($Parser, $Cur, $1, "failure");
+ $Cur->{LineFailures}++;
+ }
+ elsif ($Line =~ /^([_a-z0-9]+)\.c:\d+: Test marked todo: / or
+ ($Cur->{Unit} ne "" and
+ $Line =~ /($Cur->{Unit})\.c:\d+: Test marked todo: /))
+ {
+ _CheckUnit($Parser, $Cur, $1, "todo");
+ $Cur->{LineTodos}++;
+ }
+ # TestLauncher's skip message is quite broken
+ elsif ($Line =~ /^([_a-z0-9]+)(?:\.c)?:\d+:? Tests? skipped: / or
+ ($Cur->{Unit} ne "" and
+ $Line =~ /($Cur->{Unit})(?:\.c)?:\d+:? Tests? skipped: /))
+ {
+ my $Unit = $1;
+ # Don't complain and don't count misplaced skips. Only complain if they
+ # are misreported (see _CloseTestUnit). Also TestLauncher uses the wrong
+ # name in its skip message when skipping tests.
+ if ($Unit eq $Cur->{Unit} or $Cur->{Unit} eq "" or $Unit eq $Cur->{Dll})
+ {
+ $Cur->{LineSkips}++;
+ }
+ }
+ elsif ($Line =~ /^Fatal: test '([_a-z0-9]+)' does not exist/)
+ {
+ # This also replaces a test summary line.
+ $Cur->{Pids}->{0} = 1;
+ $Cur->{SummaryFailures}++;
+ $Parser->{IsWineTest} = 1;
+
+ $Cur->{LineFailures}++;
+ }
+ elsif ($Line =~ /^(?:([0-9a-f]+):)?([_.a-z0-9]+): unhandled exception [0-9a-fA-F]{8} at / or
+ ($Cur->{Unit} ne "" and
+ $Line =~ /(?:([0-9a-f]+):)?($Cur->{Unit}): unhandled exception [0-9a-fA-F]{8} at /))
+ {
+ my ($Pid, $Unit) = ($1, $2);
+
+ if ($Unit eq $Cur->{Unit})
+ {
+ # This also replaces a test summary line.
+ $Cur->{Pids}->{$Pid || 0} = 1;
+ $Cur->{SummaryFailures}++;
+ }
+ _CheckUnit($Parser, $Cur, $Unit, "unhandled exception");
+ $Cur->{LineFailures}++;
+ }
+ elsif ($Line =~ /^(?:([0-9a-f]+):)?([_a-z0-9]+): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), (\d+) skipped\./ or
+ ($Cur->{Unit} ne "" and
+ $Line =~ /(?:([0-9a-f]+):)?($Cur->{Unit}): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), (\d+) skipped\./))
+ {
+ my ($Pid, $Unit, $Todos, $Failures, $Skips) = ($1, $2, $3, $4, $5);
+
+ # Dlls that have only one test unit will run it even if there is
+ # no argument. Also TestLauncher uses the wrong name in its test
+ # summary line when skipping tests.
+ if ($Unit eq $Cur->{Unit} or $Cur->{Unit} eq "" or $Unit eq $Cur->{Dll})
+ {
+ # There may be more than one summary line due to child processes
+ $Cur->{Pids}->{$Pid || 0} = 1;
+ $Cur->{SummaryFailures} += $Failures;
+ $Cur->{SummaryTodos} += $Todos;
+ $Cur->{SummarySkips} += $Skips;
+ $Parser->{IsWineTest} = 1;
+ }
+ else
+ {
+ _CheckUnit($Parser, $Cur, $Unit, "test summary") if ($Todos or $Failures);
+ }
+ }
+ elsif ($Line =~ /^([_.a-z0-9-]+):([_a-z0-9]*)(?::([0-9a-f]+))? done \((-?\d+)\)(?:\r?$| in)/ or
+ ($Cur->{Dll} ne "" and
+ $Line =~ /(\Q$Cur->{Dll}\E):([_a-z0-9]*)(?::([0-9a-f]+))? done \((-?\d+)\)(?:\r?$| in)/))
+ {
+ my ($Dll, $Unit, $Pid, $Rc) = ($1, $2, $3, $4);
+
+ if ($Parser->{IsWineTest} and ($Dll ne $Cur->{Dll} or $Unit ne $Cur->{Unit}))
+ {
+ # First close the current test unit taking into account
+ # it may have been polluted by the new one.
+ $Cur->{IsBroken} = 1;
+ _CloseTestUnit($Parser, $Cur, 0);
+
+ # Then switch to the new one, warning it's missing a start line,
+ # and that its results may be inconsistent.
+ ($Cur->{Dll}, $Cur->{Unit}) = ($Dll, $Unit);
+ _AddError($Parser, "had no start line (or it is garbled)", $Cur);
+ $Cur->{IsBroken} = 1;
+ }
+
+ if ($Rc == 258)
+ {
+ # The done line will already be shown as a timeout (see JobDetails)
+ # so record the failure but don't add an error message.
+ $Parser->{Failures}++;
+ $Cur->{IsBroken} = 1;
+ $Parser->{TimedOut} = $Parser->{IsSuite};
+ }
+ elsif ((!$Pid and !%{$Cur->{Pids}}) or
+ ($Pid and !$Cur->{Pids}->{$Pid} and !$Cur->{Pids}->{0}))
+ {
+ # The main summary line is missing
+ if ($Rc & 0xc0000000)
+ {
+ _AddError($Parser, sprintf("%s:%s crashed (%08x)", $Dll, $Unit, $Rc & 0xffffffff));
+ $Cur->{IsBroken} = 1;
+ }
+ elsif ($Parser->{IsWineTest} and !$Cur->{IsBroken})
+ {
+ _AddError($Parser, "$Dll:$Unit has no test summary line (early exit of the main process?)");
+ }
+ }
+ elsif ($Rc & 0xc0000000)
+ {
+ # We know the crash happened in the main process which means we got
+ # an "unhandled exception" message. So there is no need to add an
+ # extra message or to increment the failure count. Still note that
+ # there may be inconsistencies (e.g. unreported todos or skips).
+ $Cur->{IsBroken} = 1;
+ }
+ $Cur->{Rc} = $Rc;
+ }
+ }
+ $Cur->{IsBroken} = 1 if ($Parser->{TaskTimedOut});
+ _CloseTestUnit($Parser, $Cur, 1);
+ close($LogFile);
+
+ return ($Parser->{Failures}, $Parser->{Errors}, $Parser->{TimedOut});
+}
+
+
#
# Log querying and formatting
#
--
2.18.0
June 27, 2018
[PATCH 1/3] testbot/WineRunWineTest: Ignore other errors if we get a badpatch error.
by Francois Gouget
Just like finding a success line in the task log proves that it was
successful no matter what happened before, a 'badpatch' line
conclusively determines the task status.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
This is the same patch as yesterday but integrated into this series
since they conflict if applied out of order.
testbot/bin/WineRunWineTest.pl | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index 0aba7ecfc..53a2a0929 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -356,8 +356,8 @@ if (!$Pid)
#
-# From that point on we want to at least try to grab the task
-# log before giving up
+# From that point on we want to at least try to grab the task log
+# before giving up
#
my ($NewStatus, $ErrMessage, $TAError, $TaskTimedOut);
@@ -391,7 +391,9 @@ if ($TA->GetFile("Task.log", "$TaskDir/log"))
}
elsif ($Result eq "badpatch")
{
+ # This too is conclusive enough to ignore other errors.
$NewStatus = "badpatch";
+ $TAError = $ErrMessage = undef;
}
elsif ($Result =~ s/^nolog://)
{
--
2.18.0
June 27, 2018
Bug #45385 related to keyboard and probably wineserver - where to start the search
by John Found
I just reported bug #45385 (https://bugs.winehq.org/show_bug.cgi?id=45385) and want to try to fix it.
So I want to ask about some preliminary directions - where to check the code,
what is the general structure of the code related to the bug subject, possible suspicious places.
Here is the full bug report in order to save you a visit to the bug tracker:
> I noticed that the state of the keys sometimes sticks in pressed state.
>
> This happens when cycling windows with some shortcut key combination.
>
> For example if cycling with Alt+Tab, on pressing Alt, the program gets WM_KEYDOWN and the state of the VK_MENU becomes pressed. But after cycling windows, the program does not get WM_KEYUP because the window is not focused and VK_MENU (and the respective VK_LMENU or VK_RMENU) remain in pressed state.
>
> When cycling back to the program window, the window get focused only after releasing Alt key, so it does not get this event as well.
>
> If cycling windows with another shortcut key combination (for example Alt+Shift+Tab - for backward cycling) both VK_MENU and VK_SHIFT keys stick.
>
> In the same time, GetAsyncKeyState returns the proper state of the keys.
>
> Note1: The problem is obviously in the wineserver code, because it handles the key state tables for the different threads.
>
> Note2: The effect happens only sometimes. It seems the code for proper processing is already there, but some racing conditions have place.
>
> Note3: There is some probability that the effect is in result of my application code, but it never happens on real Windows, so I considered it a bug.
>
> Note4: I tried to workaround this problem by reading the whole table by GetAsyncKeyState and setting it then with SetKeyboardState on WM_ACTIVATE message of the main window. This workaround actually works, but is too ugly IMO.
> The same trick on WM_ACTIVATEAPP does not work.
--
John Found <johnfound(a)asm32.info>
June 27, 2018
[PATCH] msvcp120: Add test for Concurrent_vector_Internal_resize and reverse.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 86 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 2974482ec1..1a20f4ddde 100755
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -124,6 +124,8 @@ static void * (WINAPI *call_thiscall_func5)( void *func, void *this, const void
const void *b, const void *c, const void *d );
static void * (WINAPI *call_thiscall_func6)( void *func, void *this, const void *a,
const void *b, const void *c, const void *d, const void *e );
+static void * (WINAPI *call_thiscall_func7)( void *func, void *this, const void *a,
+ const void *b, const void *c, const void *d, const void *e, const void *f );
static void init_thiscall_thunk(void)
{
@@ -140,6 +142,7 @@ static void init_thiscall_thunk(void)
call_thiscall_func4 = (void *)thunk;
call_thiscall_func5 = (void *)thunk;
call_thiscall_func6 = (void *)thunk;
+ call_thiscall_func7 = (void *)thunk;
}
#define call_func1(func,_this) call_thiscall_func1(func,_this)
@@ -152,6 +155,8 @@ static void init_thiscall_thunk(void)
(const void*)(b),(const void*)(c),(const void*)(d))
#define call_func6(func,_this,a,b,c,d,e) call_thiscall_func6(func,_this,(const void*)(a),\
(const void*)(b),(const void*)(c),(const void*)(d),(const void*)(e))
+#define call_func7(func,_this,a,b,c,d,e,f) call_thiscall_func7(func,_this,(const void*)(a),\
+ (const void*)(b),(const void*)(c),(const void*)(d),(const void*)(e),(const void*)(f))
#else
#define init_thiscall_thunk()
@@ -161,6 +166,7 @@ static void init_thiscall_thunk(void)
#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
#define call_func5(func,_this,a,b,c,d) func(_this,a,b,c,d)
#define call_func6(func,_this,a,b,c,d,e) func(_this,a,b,c,d,e)
+#define call_func7(func,_this,a,b,c,d,e,f) func(_this,a,b,c,d,e,f)
#endif /* __i386__ */
static inline float __port_infinity(void)
@@ -422,6 +428,11 @@ static size_t (__thiscall *p_vector_base_v4__Internal_grow_by)(
vector_base_v4*, size_t, size_t, void (__cdecl*)(void*, const void*, size_t), const void *);
static size_t (__thiscall *p_vector_base_v4__Internal_grow_to_at_least_with_result)(
vector_base_v4*, size_t, size_t, void (__cdecl*)(void*, const void*, size_t), const void *);
+static void (__thiscall *p_vector_base_v4__Internal_reserve)(
+ vector_base_v4*, size_t, size_t, size_t);
+static void (__thiscall *p_vector_base_v4__Internal_resize)(
+ vector_base_v4*, size_t, size_t, size_t, void (__cdecl*)(void*, size_t),
+ void (__cdecl *copy)(void*, const void*, size_t), const void*);
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -576,6 +587,10 @@ static BOOL init(void)
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z");
SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
"?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z");
+ SET(p_vector_base_v4__Internal_reserve,
+ "?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z");
+ SET(p_vector_base_v4__Internal_resize,
+ "?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -699,6 +714,10 @@ static BOOL init(void)
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z");
SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
"?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z");
+ SET(p_vector_base_v4__Internal_reserve,
+ "?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z");
+ SET(p_vector_base_v4__Internal_resize,
+ "?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -750,6 +769,10 @@ static BOOL init(void)
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z");
SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
"?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z");
+ SET(p_vector_base_v4__Internal_reserve,
+ "?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z");
+ SET(p_vector_base_v4__Internal_resize,
+ "?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z");
#endif
}
SET(p__Thrd_equal,
@@ -3082,6 +3105,69 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
+ /* test for _Internal_reserve */
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 2;
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ call_func4(p_vector_base_v4__Internal_reserve,
+ &v2, 3, sizeof(int), 4);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ call_func4(p_vector_base_v4__Internal_reserve,
+ &v2, 5, sizeof(int), 8);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ ok(size == 3, "_Internal_clear returned %ld expected 3\n", (long)size);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
+ /* test for _Internal_resize */
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 2;
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ i = 0;
+ SET_EXPECT(concurrent_vector_int_destroy);
+ call_func7(p_vector_base_v4__Internal_resize,
+ &v2, 1, sizeof(int), 4, concurrent_vector_int_destroy, concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 1, "v2.early_size got %ld expected 1\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ call_func7(p_vector_base_v4__Internal_resize,
+ &v2, 3, sizeof(int), 4, concurrent_vector_int_destroy, concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 3, "v2.early_size got %ld expected 3\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ ok(size == 2, "_Internal_clear returned %ld expected 2\n", (long)size);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
--
2.11.0
June 27, 2018
[PATCH] configure.ac: use -Wno-unused-command-line-argument if supported
by Austin English
This avoids ~9000 warnings like:
austin(a)gcc113:~$ grep 'warning: argument unused during compilation'
without-patch.build.log | sort -u
clang-6.0: warning: argument unused during compilation: '-I ../atl'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
../d3dcompiler_43' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../d3dx11_43'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../d3dx9_36'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
../../../include/msvcrt' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
../../include/msvcrt' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
../../../include' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../../include'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../include'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../msvcm80'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../msvcp90'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../msvcrt'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/include/dbus-1.0' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/include/freetype2' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/include/libpng12' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/include/libxml2' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/include/p11-kit-1' [-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I
/usr/lib/aarch64-linux-gnu/dbus-1.0/include'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../wscript'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ./..'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../..'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I .'
[-Wunused-command-line-argument]
clang-6.0: warning: argument unused during compilation: '-I ../xinput1_3'
[-Wunused-command-line-argument]
June 27, 2018
Re: [PATCH] d3dx9_36: fixed size to MBtoWC
by Matteo Bruni
With the subject changed to something along the lines of "d3dx9/tests:
Fix wide string size in MultiByteToWideChar() call." this is:
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
June 26, 2018
[PATCH] shlwapi/tests: Pass the correct buffer size to WideCharToMultiByte()
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/shlwapi/tests/string.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c
index c7a2f5d346..9114ad88e1 100644
--- a/dlls/shlwapi/tests/string.c
+++ b/dlls/shlwapi/tests/string.c
@@ -694,7 +694,7 @@ static void test_StrFormatKBSizeW(void)
while(result->value)
{
pStrFormatKBSizeW(result->value, szBuffW, 256);
- WideCharToMultiByte(CP_ACP,0,szBuffW,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR),NULL,NULL);
+ WideCharToMultiByte(CP_ACP, 0, szBuffW, -1, szBuff, ARRAY_SIZE(szBuff), NULL, NULL);
ok(!strcmp(result->kb_size, szBuff), "Formatted %s wrong: got %s, expected %s\n",
wine_dbgstr_longlong(result->value), szBuff, result->kb_size);
--
2.14.4
June 26, 2018
[PATCH] shlwapi/tests: Pass the correct buffer size to PathUnExpandEnvStringsW()
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/shlwapi/tests/path.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c
index d25620b3d5..4a6fbd91f6 100644
--- a/dlls/shlwapi/tests/path.c
+++ b/dlls/shlwapi/tests/path.c
@@ -1595,7 +1595,7 @@ static void test_PathUnExpandEnvStrings(void)
buffW[0] = 0;
lstrcpyW(pathW, sysdrvW);
lstrcatW(pathW, sysdrvW);
- ret = pPathUnExpandEnvStringsW(pathW, buffW, sizeof(buff)/sizeof(WCHAR));
+ ret = pPathUnExpandEnvStringsW(pathW, buffW, ARRAY_SIZE(buffW));
ok(ret, "got %d\n", ret);
/* expected string */
lstrcpyW(pathW, sysdriveW);
--
2.14.4
June 26, 2018
[PATCH] shlwapi/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/shlwapi/tests/assoc.c | 8 +++---
dlls/shlwapi/tests/clist.c | 6 ++---
dlls/shlwapi/tests/istream.c | 6 ++---
dlls/shlwapi/tests/ordinal.c | 56 +++++++++++++++++++--------------------
dlls/shlwapi/tests/path.c | 20 +++++++-------
dlls/shlwapi/tests/string.c | 62 ++++++++++++++++++++++----------------------
dlls/shlwapi/tests/url.c | 42 +++++++++++++++---------------
7 files changed, 99 insertions(+), 101 deletions(-)
diff --git a/dlls/shlwapi/tests/assoc.c b/dlls/shlwapi/tests/assoc.c
index 266f3fd44a..4b461128dc 100644
--- a/dlls/shlwapi/tests/assoc.c
+++ b/dlls/shlwapi/tests/assoc.c
@@ -62,7 +62,7 @@ static void test_getstring_bad(void)
"Unexpected result : %08x\n", hr);
ok(len == 0xdeadbeef, "got %u\n", len);
- len = sizeof(buf)/sizeof(buf[0]);
+ len = ARRAY_SIZE(buf);
hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotBad, open, buf, &len);
ok(hr == E_FAIL ||
hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ ||
@@ -70,8 +70,8 @@ static void test_getstring_bad(void)
"Unexpected result : %08x\n", hr);
if (hr == S_OK)
{
- ok(len < sizeof(buf)/sizeof(buf[0]), "got %u\n", len);
- ok(!lstrcmpiW(buf + len - sizeof(openwith)/sizeof(openwith[0]), openwith), "wrong data\n");
+ ok(len < ARRAY_SIZE(buf), "got %u\n", len);
+ ok(!lstrcmpiW(buf + len - ARRAY_SIZE(openwith), openwith), "wrong data\n");
}
len = 0xdeadbeef;
@@ -105,7 +105,7 @@ static void test_getstring_bad(void)
hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND) /* Win8 */ ||
hr == S_FALSE, /* Win10 */
"Unexpected result : %08x\n", hr);
- ok((hr == S_FALSE && len < sizeof(buf)/sizeof(buf[0])) || len == 0xdeadbeef,
+ ok((hr == S_FALSE && len < ARRAY_SIZE(buf)) || len == 0xdeadbeef,
"got hr=%08x and len=%u\n", hr, len);
len = 0xdeadbeef;
diff --git a/dlls/shlwapi/tests/clist.c b/dlls/shlwapi/tests/clist.c
index b930470806..0adb0d47c0 100644
--- a/dlls/shlwapi/tests/clist.c
+++ b/dlls/shlwapi/tests/clist.c
@@ -362,8 +362,7 @@ static void test_CList(void)
if (hRet == S_OK)
{
/* 1 call for each element, + 1 for OK (use our null element for this) */
- ok(streamobj.writecalls == sizeof(SHLWAPI_CLIST_items)/sizeof(SHLWAPI_CLIST),
- "wrong call count\n");
+ ok(streamobj.writecalls == ARRAY_SIZE(SHLWAPI_CLIST_items), "wrong call count\n");
ok(streamobj.readcalls == 0,"called Read() in write\n");
ok(streamobj.seekcalls == 0,"called Seek() in write\n");
}
@@ -433,8 +432,7 @@ static void test_CList(void)
{
ok(streamobj.readbeyondend == FALSE, "read beyond end\n");
/* 2 calls per item, but only 1 for the terminator */
- ok(streamobj.readcalls == sizeof(SHLWAPI_CLIST_items)/sizeof(SHLWAPI_CLIST)*2-1,
- "wrong call count\n");
+ ok(streamobj.readcalls == ARRAY_SIZE(SHLWAPI_CLIST_items) * 2 - 1, "wrong call count\n");
ok(streamobj.writecalls == 0, "called Write() from create\n");
ok(streamobj.seekcalls == 0,"called Seek() from create\n");
diff --git a/dlls/shlwapi/tests/istream.c b/dlls/shlwapi/tests/istream.c
index 926f2f8157..300e9b9c00 100644
--- a/dlls/shlwapi/tests/istream.c
+++ b/dlls/shlwapi/tests/istream.c
@@ -726,12 +726,12 @@ START_TEST(istream)
int i, j, k;
- for (i = 0; i != sizeof(stgm_access)/sizeof(stgm_access[0]); i++) {
- for (j = 0; j != sizeof(stgm_sharing)/sizeof(stgm_sharing[0]); j ++) {
+ for (i = 0; i != ARRAY_SIZE(stgm_access); i++) {
+ for (j = 0; j != ARRAY_SIZE(stgm_sharing); j ++) {
test_SHCreateStreamOnFileA(stgm_access[i], stgm_sharing[j]);
test_SHCreateStreamOnFileW(stgm_access[i], stgm_sharing[j]);
- for (k = 0; k != sizeof(stgm_flags)/sizeof(stgm_flags[0]); k++)
+ for (k = 0; k != ARRAY_SIZE(stgm_flags); k++)
test_SHCreateStreamOnFileEx(stgm_access[i], stgm_sharing[j] | stgm_flags[k]);
}
}
diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c
index db59e625f8..97e4606443 100644
--- a/dlls/shlwapi/tests/ordinal.c
+++ b/dlls/shlwapi/tests/ordinal.c
@@ -1862,14 +1862,14 @@ if (0)
/* all combinations documented as invalid succeeded */
flags = FDTF_SHORTTIME | FDTF_LONGTIME;
SetLastError(0xdeadbeef);
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
flags = FDTF_SHORTDATE | FDTF_LONGDATE;
SetLastError(0xdeadbeef);
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
@@ -1877,7 +1877,7 @@ if (0)
flags = FDTF_SHORTDATE | FDTF_LTRDATE | FDTF_RTLDATE;
SetLastError(0xdeadbeef);
buff[0] = 0; /* NT4 doesn't clear the buffer on failure */
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
ok(GetLastError() == 0xdeadbeef,
@@ -1885,67 +1885,67 @@ if (0)
/* now check returned strings */
flags = FDTF_SHORTTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
SetLastError(0xdeadbeef);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
flags = FDTF_LONGTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
/* both time flags */
flags = FDTF_LONGTIME | FDTF_SHORTTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal string\n");
flags = FDTF_SHORTDATE;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
flags = FDTF_LONGDATE;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
/* both date flags */
flags = FDTF_LONGDATE | FDTF_SHORTDATE;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
/* various combinations of date/time flags */
flags = FDTF_LONGDATE | FDTF_SHORTTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, ARRAY_SIZE(buff3));
ok(ret == lstrlenW(buff3)+1, "expected %d, got %d\n", lstrlenW(buff3)+1, ret);
ok(lstrcmpW(buff3, buff + lstrlenW(buff) - lstrlenW(buff3)) == 0,
"expected (%s), got (%s) for time part\n",
wine_dbgstr_w(buff3), wine_dbgstr_w(buff + lstrlenW(buff) - lstrlenW(buff3)));
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
p1 = buff;
p2 = buff2;
@@ -1963,15 +1963,15 @@ if (0)
wine_dbgstr_w(buff2), wine_dbgstr_w(buff));
flags = FDTF_LONGDATE | FDTF_LONGTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, ARRAY_SIZE(buff3));
ok(ret == lstrlenW(buff3)+1, "expected %d, got %d\n", lstrlenW(buff3)+1, ret);
ok(lstrcmpW(buff3, buff + lstrlenW(buff) - lstrlenW(buff3)) == 0,
"expected (%s), got (%s) for time part\n",
wine_dbgstr_w(buff3), wine_dbgstr_w(buff + lstrlenW(buff) - lstrlenW(buff3)));
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
p1 = buff;
p2 = buff2;
@@ -1989,25 +1989,25 @@ if (0)
wine_dbgstr_w(buff2), wine_dbgstr_w(buff));
flags = FDTF_SHORTDATE | FDTF_SHORTTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
lstrcatW(buff2, spaceW);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, ARRAY_SIZE(buff3));
ok(ret == lstrlenW(buff3)+1, "expected %d, got %d\n", lstrlenW(buff3)+1, ret);
lstrcatW(buff2, buff3);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
flags = FDTF_SHORTDATE | FDTF_LONGTIME;
- ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR));
+ ret = pSHFormatDateTimeW(&filetime, &flags, buff, ARRAY_SIZE(buff));
ok(ret == lstrlenW(buff)+1 || ret == lstrlenW(buff),
"expected %d or %d, got %d\n", lstrlenW(buff)+1, lstrlenW(buff), ret);
- ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR));
+ ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, ARRAY_SIZE(buff2));
ok(ret == lstrlenW(buff2)+1, "expected %d, got %d\n", lstrlenW(buff2)+1, ret);
lstrcatW(buff2, spaceW);
- ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR));
+ ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, ARRAY_SIZE(buff3));
ok(ret == lstrlenW(buff3)+1, "expected %d, got %d\n", lstrlenW(buff3)+1, ret);
lstrcatW(buff2, buff3);
ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n");
@@ -2068,7 +2068,7 @@ static void test_SHGetObjectCompatFlags(void)
{
int j;
- for (j = 0; j < sizeof(values)/sizeof(struct compat_value); j++)
+ for (j = 0; j < ARRAY_SIZE(values); j++)
if (lstrcmpA(values[j].nameA, valueA) == 0)
{
expected |= values[j].value;
diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c
index 91c66b7ef3..d25620b3d5 100644
--- a/dlls/shlwapi/tests/path.c
+++ b/dlls/shlwapi/tests/path.c
@@ -283,7 +283,7 @@ static void test_PathCreateFromUrl(void)
ok(len == 0xdeca, "got %x expected 0xdeca\n", len);
/* Test the decoding itself */
- for(i = 0; i < sizeof(TEST_PATHFROMURL) / sizeof(TEST_PATHFROMURL[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_PATHFROMURL); i++) {
len = INTERNET_MAX_URL_LENGTH;
ret = pPathCreateFromUrlA(TEST_PATHFROMURL[i].url, ret_path, &len, 0);
todo_wine_if (TEST_PATHFROMURL[i].todo & 0x1)
@@ -350,7 +350,7 @@ static void test_PathIsUrl(void)
size_t i;
BOOL ret;
- for(i = 0; i < sizeof(TEST_PATH_IS_URL)/sizeof(TEST_PATH_IS_URL[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_PATH_IS_URL); i++) {
ret = PathIsURLA(TEST_PATH_IS_URL[i].path);
ok(ret == TEST_PATH_IS_URL[i].expect,
"returned %d from path %s, expected %d\n", ret, TEST_PATH_IS_URL[i].path,
@@ -1403,7 +1403,7 @@ static void test_PathCommonPrefixA(void)
static void test_PathUnquoteSpaces(void)
{
int i;
- for(i = 0; i < sizeof(TEST_PATH_UNQUOTE_SPACES) / sizeof(TEST_PATH_UNQUOTE_SPACES[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(TEST_PATH_UNQUOTE_SPACES); i++)
{
char *path = strdupA(TEST_PATH_UNQUOTE_SPACES[i].path);
WCHAR *pathW = GetWideString(TEST_PATH_UNQUOTE_SPACES[i].path);
@@ -1484,10 +1484,10 @@ static void test_PathUnExpandEnvStrings(void)
ret = pPathUnExpandEnvStringsA(envvarA, buff, sizeof(buff));
ok(!ret && GetLastError() == 0xdeadbeef, "got %d, error %d\n", ret, GetLastError());
- ret = GetEnvironmentVariableW(computernameW, envvarW, sizeof(envvarW)/sizeof(WCHAR));
+ ret = GetEnvironmentVariableW(computernameW, envvarW, ARRAY_SIZE(envvarW));
ok(ret, "got %d\n", ret);
SetLastError(0xdeadbeef);
- ret = pPathUnExpandEnvStringsW(envvarW, buffW, sizeof(buffW)/sizeof(WCHAR));
+ ret = pPathUnExpandEnvStringsW(envvarW, buffW, ARRAY_SIZE(buffW));
ok(!ret && GetLastError() == 0xdeadbeef, "got %d, error %d\n", ret, GetLastError());
/* something that can't be represented with env var */
@@ -1559,7 +1559,7 @@ static void test_PathUnExpandEnvStrings(void)
lstrcpyW(pathW, nonpathW);
buffW[0] = 'x'; buffW[1] = 0;
SetLastError(0xdeadbeef);
- ret = pPathUnExpandEnvStringsW(pathW, buffW, sizeof(buffW)/sizeof(WCHAR));
+ ret = pPathUnExpandEnvStringsW(pathW, buffW, ARRAY_SIZE(buffW));
ok(!ret && GetLastError() == 0xdeadbeef, "got %d, error %d\n", ret, GetLastError());
ok(buffW[0] == 'x', "wrong return string %s\n", wine_dbgstr_w(buffW));
@@ -1580,13 +1580,13 @@ static void test_PathUnExpandEnvStrings(void)
/* buffer size is enough to hold variable name only */
buffW[0] = 'x'; buffW[1] = 0;
SetLastError(0xdeadbeef);
- ret = pPathUnExpandEnvStringsW(pathW, buffW, sizeof(sysrootW)/sizeof(WCHAR));
+ ret = pPathUnExpandEnvStringsW(pathW, buffW, ARRAY_SIZE(sysrootW));
ok(!ret && GetLastError() == 0xdeadbeef, "got %d, error %d\n", ret, GetLastError());
ok(buffW[0] == 'x', "wrong return string %s\n", wine_dbgstr_w(buffW));
/* enough size */
buffW[0] = 0;
- ret = pPathUnExpandEnvStringsW(pathW, buffW, sizeof(buffW)/sizeof(WCHAR));
+ ret = pPathUnExpandEnvStringsW(pathW, buffW, ARRAY_SIZE(buffW));
ok(ret, "got %d\n", ret);
ok(!memcmp(buffW, sysrootW, sizeof(sysrootW) - sizeof(WCHAR)), "wrong return string %s\n", wine_dbgstr_w(buffW));
@@ -1626,7 +1626,7 @@ static void test_PathIsRelativeA(void)
return;
}
- num = sizeof(test_path_is_relative) / sizeof(test_path_is_relative[0]);
+ num = ARRAY_SIZE(test_path_is_relative);
for (i = 0; i < num; i++) {
ret = pPathIsRelativeA(test_path_is_relative[i].path);
ok(ret == test_path_is_relative[i].expect,
@@ -1646,7 +1646,7 @@ static void test_PathIsRelativeW(void)
return;
}
- num = sizeof(test_path_is_relative) / sizeof(test_path_is_relative[0]);
+ num = ARRAY_SIZE(test_path_is_relative);
for (i = 0; i < num; i++) {
path = GetWideString(test_path_is_relative[i].path);
diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c
index 7f069a4849..c7a2f5d346 100644
--- a/dlls/shlwapi/tests/string.c
+++ b/dlls/shlwapi/tests/string.c
@@ -412,7 +412,7 @@ static void test_StrCpyW(void)
while(result->value)
{
- MultiByteToWideChar(CP_ACP,0,result->byte_size_64,-1,szSrc,sizeof(szSrc)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->byte_size_64, -1, szSrc, ARRAY_SIZE(szSrc));
lpRes = StrCpyW(szBuff, szSrc);
ok(!StrCmpW(szSrc, szBuff) && lpRes == szBuff, "Copied string %s wrong\n", result->byte_size_64);
@@ -476,7 +476,7 @@ static void test_StrToIntW(void)
while (result->string)
{
- MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->string, -1, szBuff, ARRAY_SIZE(szBuff));
return_val = StrToIntW(szBuff);
ok(return_val == result->str_to_int, "converted '%s' wrong (%d)\n",
result->string, return_val);
@@ -526,7 +526,7 @@ static void test_StrToIntExW(void)
while (result->string)
{
return_val = -1;
- MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->string, -1, szBuff, ARRAY_SIZE(szBuff));
bRet = StrToIntExW(szBuff, 0, &return_val);
ok(!bRet || return_val != -1, "No result returned from '%s'\n",
result->string);
@@ -540,7 +540,7 @@ static void test_StrToIntExW(void)
while (result->string)
{
return_val = -1;
- MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->string, -1, szBuff, ARRAY_SIZE(szBuff));
bRet = StrToIntExW(szBuff, STIF_SUPPORT_HEX, &return_val);
ok(!bRet || return_val != -1, "No result returned from '%s'\n",
result->string);
@@ -605,7 +605,7 @@ static void test_StrToInt64ExW(void)
while (result->string)
{
return_val = -1;
- MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->string, -1, szBuff, ARRAY_SIZE(szBuff));
bRet = pStrToInt64ExW(szBuff, 0, &return_val);
ok(!bRet || return_val != -1, "No result returned from '%s'\n",
result->string);
@@ -619,7 +619,7 @@ static void test_StrToInt64ExW(void)
while (result->string)
{
return_val = -1;
- MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, result->string, -1, szBuff, ARRAY_SIZE(szBuff));
bRet = pStrToInt64ExW(szBuff, STIF_SUPPORT_HEX, &return_val);
ok(!bRet || return_val != -1, "No result returned from '%s'\n",
result->string);
@@ -865,7 +865,7 @@ static void test_StrCpyNXA(void)
}
memset(dest, '\n', sizeof(dest));
- lpszRes = pStrCpyNXA(dest, lpSrc, sizeof(dest)/sizeof(dest[0]));
+ lpszRes = pStrCpyNXA(dest, lpSrc, ARRAY_SIZE(dest));
ok(lpszRes == dest + 5 && !memcmp(dest, "hello\0\n\n", sizeof(dest)),
"StrCpyNXA: expected %p, \"hello\\0\\n\\n\", got %p, \"%d,%d,%d,%d,%d,%d,%d,%d\"\n",
dest + 5, lpszRes, dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
@@ -886,7 +886,7 @@ static void test_StrCpyNXW(void)
}
memcpy(dest, lpInit, sizeof(lpInit));
- lpszRes = pStrCpyNXW(dest, lpSrc, sizeof(dest)/sizeof(dest[0]));
+ lpszRes = pStrCpyNXW(dest, lpSrc, ARRAY_SIZE(dest));
ok(lpszRes == dest + 5 && !memcmp(dest, lpRes, sizeof(dest)),
"StrCpyNXW: expected %p, \"hello\\0\\n\\n\", got %p, \"%d,%d,%d,%d,%d,%d,%d,%d\"\n",
dest + 5, lpszRes, dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
@@ -949,7 +949,7 @@ static void test_SHAnsiToAnsi(void)
}
memset(dest, '\n', sizeof(dest));
- dwRet = pSHAnsiToAnsi("hello", dest, sizeof(dest)/sizeof(dest[0]));
+ dwRet = pSHAnsiToAnsi("hello", dest, ARRAY_SIZE(dest));
ok(dwRet == 6 && !memcmp(dest, "hello\0\n\n", sizeof(dest)),
"SHAnsiToAnsi: expected 6, \"hello\\0\\n\\n\", got %d, \"%d,%d,%d,%d,%d,%d,%d,%d\"\n",
dwRet, dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
@@ -976,7 +976,7 @@ static void test_SHUnicodeToUnicode(void)
}
memcpy(dest, lpInit, sizeof(lpInit));
- dwRet = pSHUnicodeToUnicode(lpSrc, dest, sizeof(dest)/sizeof(dest[0]));
+ dwRet = pSHUnicodeToUnicode(lpSrc, dest, ARRAY_SIZE(dest));
ok(dwRet == 6 && !memcmp(dest, lpRes, sizeof(dest)),
"SHUnicodeToUnicode: expected 6, \"hello\\0\\n\\n\", got %d, \"%d,%d,%d,%d,%d,%d,%d,%d\"\n",
dwRet, dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
@@ -1158,7 +1158,7 @@ static void test_StrStrA(void)
ret = StrStrA("", "");
ok(!ret, "Expected StrStrA to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrA_cases)/sizeof(StrStrA_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrA_cases); i++)
{
ret = StrStrA(deadbeefA, StrStrA_cases[i].search);
ok(ret == StrStrA_cases[i].expect,
@@ -1212,7 +1212,7 @@ static void test_StrStrW(void)
ret = StrStrW(emptyW, emptyW);
ok(!ret, "Expected StrStrW to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrW_cases)/sizeof(StrStrW_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrW_cases); i++)
{
ret = StrStrW(deadbeefW, StrStrW_cases[i].search);
ok(ret == StrStrW_cases[i].expect,
@@ -1260,7 +1260,7 @@ static void test_StrStrIA(void)
ret = StrStrIA("", "");
ok(!ret, "Expected StrStrIA to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrIA_cases)/sizeof(StrStrIA_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrIA_cases); i++)
{
ret = StrStrIA(deadbeefA, StrStrIA_cases[i].search);
ok(ret == StrStrIA_cases[i].expect,
@@ -1316,7 +1316,7 @@ static void test_StrStrIW(void)
ret = StrStrIW(emptyW, emptyW);
ok(!ret, "Expected StrStrIW to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrIW_cases)/sizeof(StrStrIW_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrIW_cases); i++)
{
ret = StrStrIW(deadbeefW, StrStrIW_cases[i].search);
ok(ret == StrStrIW_cases[i].expect,
@@ -1343,13 +1343,13 @@ static void test_StrStrNW(void)
const WCHAR *expect;
} StrStrNW_cases[] =
{
- {emptyW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
- {deadW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW},
- {dead_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
- {adbeW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 2},
- {adbe_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
- {beefW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 4},
- {beef_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
+ {emptyW, ARRAY_SIZE(deadbeefW), NULL},
+ {deadW, ARRAY_SIZE(deadbeefW), deadbeefW},
+ {dead_lowerW, ARRAY_SIZE(deadbeefW), NULL},
+ {adbeW, ARRAY_SIZE(deadbeefW), deadbeefW + 2},
+ {adbe_lowerW, ARRAY_SIZE(deadbeefW), NULL},
+ {beefW, ARRAY_SIZE(deadbeefW), deadbeefW + 4},
+ {beef_lowerW, ARRAY_SIZE(deadbeefW), NULL},
{beefW, 0, NULL},
{beefW, 1, NULL},
{beefW, 2, NULL},
@@ -1386,7 +1386,7 @@ static void test_StrStrNW(void)
ret = pStrStrNW(emptyW, emptyW, 10);
ok(!ret, "Expected StrStrNW to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrNW_cases)/sizeof(StrStrNW_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrNW_cases); i++)
{
ret = pStrStrNW(deadbeefW, StrStrNW_cases[i].search, StrStrNW_cases[i].count);
ok(ret == StrStrNW_cases[i].expect,
@@ -1426,14 +1426,14 @@ static void test_StrStrNIW(void)
const WCHAR *expect;
} StrStrNIW_cases[] =
{
- {emptyW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
- {deadW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW},
- {dead_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW},
- {adbeW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 2},
- {adbe_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 2},
- {beefW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 4},
- {beef_lowerW, sizeof(deadbeefW)/sizeof(WCHAR), deadbeefW + 4},
- {cafeW, sizeof(deadbeefW)/sizeof(WCHAR), NULL},
+ {emptyW, ARRAY_SIZE(deadbeefW), NULL},
+ {deadW, ARRAY_SIZE(deadbeefW), deadbeefW},
+ {dead_lowerW, ARRAY_SIZE(deadbeefW), deadbeefW},
+ {adbeW, ARRAY_SIZE(deadbeefW), deadbeefW + 2},
+ {adbe_lowerW, ARRAY_SIZE(deadbeefW), deadbeefW + 2},
+ {beefW, ARRAY_SIZE(deadbeefW), deadbeefW + 4},
+ {beef_lowerW, ARRAY_SIZE(deadbeefW), deadbeefW + 4},
+ {cafeW, ARRAY_SIZE(deadbeefW), NULL},
{beefW, 0, NULL},
{beefW, 1, NULL},
{beefW, 2, NULL},
@@ -1480,7 +1480,7 @@ static void test_StrStrNIW(void)
ret = pStrStrNIW(emptyW, emptyW, 10);
ok(!ret, "Expected StrStrNIW to return NULL, got %p\n", ret);
- for (i = 0; i < sizeof(StrStrNIW_cases)/sizeof(StrStrNIW_cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(StrStrNIW_cases); i++)
{
ret = pStrStrNIW(deadbeefW, StrStrNIW_cases[i].search, StrStrNIW_cases[i].count);
ok(ret == StrStrNIW_cases[i].expect,
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index ac896b06e4..d30737f60a 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -539,7 +539,7 @@ static void test_UrlApplyScheme(void)
return;
}
- for(i = 0; i < sizeof(TEST_APPLY)/sizeof(TEST_APPLY[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_APPLY); i++) {
len = TEST_APPLY_MAX_LENGTH;
lstrcpyA(newurl, untouchedA);
res = pUrlApplySchemeA(TEST_APPLY[i].url, newurl, &len, TEST_APPLY[i].flags);
@@ -916,7 +916,7 @@ static void test_UrlEscapeA(void)
"got %d, expected %d\n", size, 1);
ok(empty_string[0] == 127, "String has changed, empty_string[0] = %d\n", empty_string[0]);
- for(i=0; i<sizeof(TEST_ESCAPE)/sizeof(TEST_ESCAPE[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_ESCAPE); i++) {
CHAR ret_url[INTERNET_MAX_URL_LENGTH];
size = INTERNET_MAX_URL_LENGTH;
@@ -983,7 +983,7 @@ static void test_UrlEscapeW(void)
/* Check actual escaping */
- size = sizeof(overwrite)/sizeof(WCHAR);
+ size = ARRAY_SIZE(overwrite);
ret = pUrlEscapeW(overwrite, overwrite, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == S_OK, "got %x, expected S_OK\n", ret);
ok(size == 9, "got %d, expected 9\n", size);
@@ -997,12 +997,12 @@ static void test_UrlEscapeW(void)
ok(wc == 127, "String has changed, wc = %d\n", wc);
/* non-ASCII range */
- size = sizeof(ret_urlW)/sizeof(WCHAR);
+ size = ARRAY_SIZE(ret_urlW);
ret = pUrlEscapeW(naW, ret_urlW, &size, 0);
ok(ret == S_OK, "got %x, expected S_OK\n", ret);
ok(!lstrcmpW(naescapedW, ret_urlW), "got %s, expected %s\n", wine_dbgstr_w(ret_urlW), wine_dbgstr_w(naescapedW));
- for (i = 0; i < sizeof(TEST_ESCAPE)/sizeof(TEST_ESCAPE[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_ESCAPE); i++) {
WCHAR *urlW, *expected_urlW;
@@ -1018,7 +1018,7 @@ static void test_UrlEscapeW(void)
FreeWideString(expected_urlW);
}
- for(i=0; i<sizeof(TEST_ESCAPEW)/sizeof(TEST_ESCAPEW[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_ESCAPEW); i++) {
WCHAR ret_url[INTERNET_MAX_URL_LENGTH];
size = INTERNET_MAX_URL_LENGTH;
@@ -1113,7 +1113,7 @@ static void test_UrlCanonicalizeA(void)
test_url_canonicalize(-1, "", 0, S_OK, S_FALSE /* Vista/win2k8 */, "", FALSE);
/* test url-modification */
- for(i=0; i<sizeof(TEST_CANONICALIZE)/sizeof(TEST_CANONICALIZE[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_CANONICALIZE); i++) {
test_url_canonicalize(i, TEST_CANONICALIZE[i].url, TEST_CANONICALIZE[i].flags,
TEST_CANONICALIZE[i].expectret, TEST_CANONICALIZE[i].expectret, TEST_CANONICALIZE[i].expecturl,
TEST_CANONICALIZE[i].todo);
@@ -1185,7 +1185,7 @@ static void test_UrlCanonicalizeW(void)
BOOL choped;
int pos;
- MultiByteToWideChar(CP_ACP, 0, "http://www.winehq.org/X", -1, szUrl, sizeof(szUrl)/sizeof(szUrl[0]));
+ MultiByteToWideChar(CP_ACP, 0, "http://www.winehq.org/X", -1, szUrl, ARRAY_SIZE(szUrl));
pos = lstrlenW(szUrl) - 1;
szUrl[pos] = i;
urllen = INTERNET_MAX_URL_LENGTH;
@@ -1267,7 +1267,7 @@ static void test_url_combine(const char *szUrl1, const char *szUrl2, DWORD dwFla
static void test_UrlCombine(void)
{
unsigned int i;
- for(i=0; i<sizeof(TEST_COMBINE)/sizeof(TEST_COMBINE[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_COMBINE); i++) {
test_url_combine(TEST_COMBINE[i].url1, TEST_COMBINE[i].url2, TEST_COMBINE[i].flags,
TEST_COMBINE[i].expectret, TEST_COMBINE[i].expecturl);
}
@@ -1288,7 +1288,7 @@ static void test_UrlCreateFromPath(void)
return;
}
- for(i = 0; i < sizeof(TEST_URLFROMPATH) / sizeof(TEST_URLFROMPATH[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_URLFROMPATH); i++) {
len = INTERNET_MAX_URL_LENGTH;
ret = pUrlCreateFromPathA(TEST_URLFROMPATH[i].path, ret_url, &len, 0);
ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path %s\n", ret, TEST_URLFROMPATH[i].path);
@@ -1342,8 +1342,8 @@ static void test_UrlIs(void)
test_UrlIs_null(URLIS_OPAQUE);
test_UrlIs_null(URLIS_URL);
- for(i = 0; i < sizeof(TEST_PATH_IS_URL) / sizeof(TEST_PATH_IS_URL[0]); i++) {
- MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, sizeof(wurl)/sizeof(*wurl));
+ for (i = 0; i < ARRAY_SIZE(TEST_PATH_IS_URL); i++) {
+ MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, ARRAY_SIZE(wurl));
ret = pUrlIsA( TEST_PATH_IS_URL[i].path, URLIS_URL );
ok( ret == TEST_PATH_IS_URL[i].expect,
@@ -1357,8 +1357,8 @@ static void test_UrlIs(void)
TEST_PATH_IS_URL[i].path, TEST_PATH_IS_URL[i].expect );
}
}
- for(i = 0; i < sizeof(TEST_URLIS_ATTRIBS) / sizeof(TEST_URLIS_ATTRIBS[0]); i++) {
- MultiByteToWideChar(CP_ACP, 0, TEST_URLIS_ATTRIBS[i].url, -1, wurl, sizeof(wurl)/sizeof(*wurl));
+ for (i = 0; i < ARRAY_SIZE(TEST_URLIS_ATTRIBS); i++) {
+ MultiByteToWideChar(CP_ACP, 0, TEST_URLIS_ATTRIBS[i].url, -1, wurl, ARRAY_SIZE(wurl));
ret = pUrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_OPAQUE);
ok( ret == TEST_URLIS_ATTRIBS[i].expectOpaque,
@@ -1403,7 +1403,7 @@ static void test_UrlUnescape(void)
win_skip("UrlUnescapeA not found\n");
return;
}
- for(i=0; i<sizeof(TEST_URL_UNESCAPE)/sizeof(TEST_URL_UNESCAPE[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(TEST_URL_UNESCAPE); i++) {
dwEscaped=INTERNET_MAX_URL_LENGTH;
res = pUrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, &dwEscaped, 0);
ok(res == S_OK,
@@ -1494,7 +1494,7 @@ static void test_ParseURL(void)
PARSEDURLW parsedw;
HRESULT hres;
- for(test = parse_url_tests; test < parse_url_tests + sizeof(parse_url_tests)/sizeof(*parse_url_tests); test++) {
+ for (test = parse_url_tests; test < parse_url_tests + ARRAY_SIZE(parse_url_tests); test++) {
memset(&parseda, 0xd0, sizeof(parseda));
parseda.cbSize = sizeof(parseda);
hres = pParseURLA(test->url, &parseda);
@@ -1516,7 +1516,7 @@ static void test_ParseURL(void)
ok(parseda.nScheme == 0xd0d0d0d0, "nScheme = %d\n", parseda.nScheme);
}
- MultiByteToWideChar(CP_ACP, 0, test->url, -1, url, sizeof(url)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, test->url, -1, url, ARRAY_SIZE(url));
memset(&parsedw, 0xd0, sizeof(parsedw));
parsedw.cbSize = sizeof(parsedw);
@@ -1595,23 +1595,23 @@ static void test_HashData(void)
"Expected HashData to return E_INVALIDARG, got 0x%08x\n", res);
/* Test passing valid pointers with sizes of zero. */
- for (i = 0; i < sizeof(input)/sizeof(BYTE); i++)
+ for (i = 0; i < ARRAY_SIZE(input); i++)
input[i] = 0x00;
- for (i = 0; i < sizeof(output)/sizeof(BYTE); i++)
+ for (i = 0; i < ARRAY_SIZE(output); i++)
output[i] = 0xFF;
res = pHashData(input, 0, output, 0);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
/* The buffers should be unchanged. */
- for (i = 0; i < sizeof(input)/sizeof(BYTE); i++)
+ for (i = 0; i < ARRAY_SIZE(input); i++)
{
ok(input[i] == 0x00, "Expected the input buffer to be unchanged\n");
if(input[i] != 0x00) break;
}
- for (i = 0; i < sizeof(output)/sizeof(BYTE); i++)
+ for (i = 0; i < ARRAY_SIZE(output); i++)
{
ok(output[i] == 0xFF, "Expected the output buffer to be unchanged\n");
if(output[i] != 0xFF) break;
--
2.14.4
June 26, 2018
Re: [PATCH vkd3d 10/12] libs/vkd3d: Add support for 2D array render target views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 11/12] tests: Add simple test for layered rendering.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 12/12] libs/vkd3d-shader: Fix returning multiple components from dot product instructions.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 09/12] libs/vkd3d-shader: Do not emit output setup for ret in geometry shaders.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 08/12] libs/vkd3d-shader: Generate correct SPIR-V code for arrayed shader inputs.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 07/12] libs/vkd3d-shader: Pass register index to vkd3d_find_signature_element_for_reg().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 06/12] libs/vkd3d-shader: Simplify vkd3d_dxbc_compiler_emit_input().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 05/12] libs/vkd3d-shader: Enable "geometry" capability for SpvBuiltInLayer.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 04/12] libs/vkd3d-shader: Do not force input register type to float4.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 03/12] libs/vkd3d-shader: Add initial support for typed registers.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 02/12] libs/vkd3d-shader: Do not generate code in vkd3d_dxbc_compiler_get_register_info().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
Re: [PATCH vkd3d 01/12] libs/vkd3d-shader: Split SPIR-V built-ins table into two tables.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
June 26, 2018
[PATCH] ntoskrnl.exe: add stub for IoUnregisterPlugPlayNotification
by Louis Lenders
Fr https://bugs.winehq.org/show_bug.cgi?id=45378
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 +++++++++
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index e4c1c3530b..c8f9173738 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2763,6 +2763,15 @@ NTSTATUS WINAPI IoRegisterPlugPlayNotification(IO_NOTIFICATION_EVENT_CATEGORY ca
return STATUS_SUCCESS;
}
+/*****************************************************
+ * IoUnregisterPlugPlayNotification (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI IoUnregisterPlugPlayNotification(PVOID notification)
+{
+ FIXME("stub: %p\n", notification);
+ return STATUS_SUCCESS;
+}
+
/*****************************************************
* IoCsqInitialize (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 4129542cdc..64597c41df 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -472,7 +472,7 @@
@ stub IoThreadToProcess
@ stdcall IoUnregisterFileSystem(ptr)
@ stub IoUnregisterFsRegistrationChange
-@ stub IoUnregisterPlugPlayNotification
+@ stdcall IoUnregisterPlugPlayNotification(ptr)
@ stdcall IoUnregisterShutdownNotification(ptr)
@ stub IoUpdateShareAccess
@ stub IoValidateDeviceIoControlAccess
--
2.17.1
June 26, 2018
[PATCH] icinfo: vsnprintfW takes characters as buffer size not bytes
by Marcus Meissner
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
programs/icinfo/icinfo.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/programs/icinfo/icinfo.c b/programs/icinfo/icinfo.c
index bfbef6b69b..601ec8c8b3 100644
--- a/programs/icinfo/icinfo.c
+++ b/programs/icinfo/icinfo.c
@@ -26,14 +26,14 @@
static int mywprintf(const WCHAR *format, ...)
{
static char output_bufA[65536];
- static WCHAR output_bufW[sizeof(output_bufA) / sizeof(WCHAR)];
+ static WCHAR output_bufW[sizeof(output_bufA)];
va_list parms;
DWORD nOut;
BOOL res = FALSE;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
va_start(parms, format);
- vsnprintfW(output_bufW, sizeof(output_bufW), format, parms);
+ vsnprintfW(output_bufW, sizeof(output_bufW)/sizeof(output_bufW[0]), format, parms);
va_end(parms);
/* Try to write as unicode whenever we think it's a console */
--
2.17.1
June 26, 2018
[PATCH] shlwapi: SHGetIniStringW buffer size is in characters
by Marcus Meissner
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
dlls/shlwapi/tests/ordinal.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c
index f192849cd4..db59e625f8 100644
--- a/dlls/shlwapi/tests/ordinal.c
+++ b/dlls/shlwapi/tests/ordinal.c
@@ -2724,8 +2724,8 @@ static void test_SHGetIniString(void)
if(0){
/* these crash on Windows */
pSHGetIniStringW(NULL, NULL, NULL, 0, NULL);
- pSHGetIniStringW(NULL, AKeyW, out, sizeof(out), pathW);
- pSHGetIniStringW(TestAppW, AKeyW, NULL, sizeof(out), pathW);
+ pSHGetIniStringW(NULL, AKeyW, out, ARRAY_SIZE(out), pathW);
+ pSHGetIniStringW(TestAppW, AKeyW, NULL, ARRAY_SIZE(out), pathW);
}
ret = pSHGetIniStringW(TestAppW, AKeyW, out, 0, pathW);
@@ -2734,21 +2734,21 @@ static void test_SHGetIniString(void)
/* valid arguments */
out[0] = 0;
SetLastError(0xdeadbeef);
- ret = pSHGetIniStringW(TestAppW, NULL, out, sizeof(out), pathW);
+ ret = pSHGetIniStringW(TestAppW, NULL, out, ARRAY_SIZE(out), pathW);
ok(ret == 4, "SHGetIniStringW should have given 4, instead: %d\n", ret);
ok(!lstrcmpW(out, AKeyW), "Expected %s, got: %s, %d\n",
wine_dbgstr_w(AKeyW), wine_dbgstr_w(out), GetLastError());
- ret = pSHGetIniStringW(TestAppW, AKeyW, out, sizeof(out), pathW);
+ ret = pSHGetIniStringW(TestAppW, AKeyW, out, ARRAY_SIZE(out), pathW);
ok(ret == 1, "SHGetIniStringW should have given 1, instead: %d\n", ret);
ok(!strcmp_wa(out, "1"), "Expected L\"1\", got: %s\n", wine_dbgstr_w(out));
- ret = pSHGetIniStringW(TestAppW, AnotherKeyW, out, sizeof(out), pathW);
+ ret = pSHGetIniStringW(TestAppW, AnotherKeyW, out, ARRAY_SIZE(out), pathW);
ok(ret == 4, "SHGetIniStringW should have given 4, instead: %d\n", ret);
ok(!strcmp_wa(out, "asdf"), "Expected L\"asdf\", got: %s\n", wine_dbgstr_w(out));
out[0] = 1;
- ret = pSHGetIniStringW(TestAppW, JunkKeyW, out, sizeof(out), pathW);
+ ret = pSHGetIniStringW(TestAppW, JunkKeyW, out, ARRAY_SIZE(out), pathW);
ok(ret == 0, "SHGetIniStringW should have given 0, instead: %d\n", ret);
ok(*out == 0, "Expected L\"\", got: %s\n", wine_dbgstr_w(out));
--
2.17.1
June 26, 2018
[PATCH] psapi: GetProcessImageFileName gets character count as argument
by Marcus Meissner
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
dlls/psapi/tests/psapi_main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c
index ec74716651..13205b3b8f 100644
--- a/dlls/psapi/tests/psapi_main.c
+++ b/dlls/psapi/tests/psapi_main.c
@@ -645,7 +645,7 @@ static void test_GetProcessImageFileName(void)
}
SetLastError(0xdeadbeef);
- pGetProcessImageFileNameW(NULL, szImgPathW, sizeof(szImgPathW));
+ pGetProcessImageFileNameW(NULL, szImgPathW, ARRAY_SIZE(szImgPathW));
ok(GetLastError() == ERROR_INVALID_HANDLE, "expected error=ERROR_INVALID_HANDLE but got %d\n", GetLastError());
/* no information about correct buffer size returned: */
--
2.17.1
June 26, 2018
Re: [PATCH 3/5] devenum: Make some variables static.
by Zebediah Figura
On 26/06/18 06:34, Alexandre Julliard wrote:
> Zebediah Figura <z.figura12(a)gmail.com> writes:
>
>> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
>> ---
>> dlls/devenum/createdevenum.c | 14 ++++++--------
>> dlls/devenum/devenum_main.c | 13 ++++---------
>> dlls/devenum/devenum_private.h | 4 +---
>> dlls/devenum/mediacatenum.c | 4 +++-
>> 4 files changed, 14 insertions(+), 21 deletions(-)
>
> It doesn't work here:
>
> ../../../tools/runtest -q -P wine -T ../../.. -M devenum.dll -p devenum_test.exe.so devenum && touch devenum.ok
> devenum.c:585: Test failed: filter should be registered
> devenum.c:592: Test failed: Read failed: 0x80070002
> devenum.c:595: Test failed: expected L"{DEADBEEF-CF51-43E6-B6C5-299EA8B6B591}", got L"\58e1\e0f1\cb04\11d0\4ebd\a000\11c9\86ce\2a92\37e9\d9aa\11d2\84bf\f28e\55b1\ed5a\29d1\e306\27e5\11ce\5d87\6000\b78c\6680\29d2\e306\27e5\11ce\5d87\6000\b78c\6680\9faf\0558\c356\11ce\01bf\aa00\5500\5a59\ca52\2ca8\3c3f\11d2\3db7\c000\b64f\3dbd\a762\33d9\90c8\11d0\43bd\a000\11c9\86ce\8d32\a5ea\253d\11d1\f1b3"...
> devenum.c:600: Test failed: Read failed: 0x80070002
> devenum.c:601: Test failed: expected L"{DEADBEEF-CF51-43E6-B6C5-299EA8B6B591}", got L"\58e1\e0f1\cb04\11d0\4ebd\a000\11c9\86ce\2a92\37e9\d9aa\11d2\84bf\f28e\55b1\ed5a\29d1\e306\27e5\11ce\5d87\6000\b78c\6680\29d2\e306\27e5\11ce\5d87\6000\b78c\6680\9faf\0558\c356\11ce\01bf\aa00\5500\5a59\ca52\2ca8\3c3f\11d2\3db7\c000\b64f\3dbd\a762\33d9\90c8\11d0\43bd\a000\11c9\86ce\8d32\a5ea\253d\11d1\f1b3"...
> Makefile:183: recipe for target 'devenum.ok' failed
> make: *** [devenum.ok] Error 5
>
Apologies; I missed a spot. Resent.
June 26, 2018
[PATCH v2 5/5] include: Make fil_data.idl a common header.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/Makefile.in | 3 +-
dlls/devenum/createdevenum.c | 2 +-
dlls/devenum/fil_data.idl | 47 --------------------------
dlls/dxdiagn/Makefile.in | 3 +-
dlls/dxdiagn/provider.c | 2 +-
dlls/quartz/Makefile.in | 1 -
dlls/quartz/fil_data.idl | 52 -----------------------------
dlls/quartz/filtermapper.c | 2 +-
dlls/quartz/tests/Makefile.in | 1 -
dlls/quartz/tests/fil_data.idl | 52 -----------------------------
dlls/quartz/tests/filtermapper.c | 2 +-
include/Makefile.in | 1 +
{dlls/dxdiagn => include/wine}/fil_data.idl | 21 ++----------
13 files changed, 10 insertions(+), 179 deletions(-)
delete mode 100644 dlls/devenum/fil_data.idl
delete mode 100644 dlls/quartz/fil_data.idl
delete mode 100644 dlls/quartz/tests/fil_data.idl
rename {dlls/dxdiagn => include/wine}/fil_data.idl (67%)
diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in
index d1407a9..2760eed 100644
--- a/dlls/devenum/Makefile.in
+++ b/dlls/devenum/Makefile.in
@@ -9,7 +9,6 @@ C_SRCS = \
parsedisplayname.c
IDL_SRCS = \
- devenum_classes.idl \
- fil_data.idl
+ devenum_classes.idl
RC_SRCS = devenum.rc
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index e3ae54f..4b2feca 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -37,7 +37,7 @@
#include "mmddk.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
diff --git a/dlls/devenum/fil_data.idl b/dlls/devenum/fil_data.idl
deleted file mode 100644
index 7e37a75..0000000
--- a/dlls/devenum/fil_data.idl
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
index 3a1017e..c16396e 100644
--- a/dlls/dxdiagn/Makefile.in
+++ b/dlls/dxdiagn/Makefile.in
@@ -9,5 +9,4 @@ C_SRCS = \
RC_SRCS = dxdiagn.rc
IDL_SRCS = \
- dxdiagn.idl \
- fil_data.idl
+ dxdiagn.idl
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 4f964ad..1fdab5e 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -35,7 +35,7 @@
#include "d3d9.h"
#include "strmif.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
#include "psapi.h"
#include "wbemcli.h"
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index e938865..5eb8d44 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -30,7 +30,6 @@ RC_SRCS = version.rc
IDL_SRCS = \
control_tlb.idl \
- fil_data.idl \
quartz_strmif.idl
dlldata_EXTRADEFS = -DENTRY_PREFIX=QUARTZ_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL
diff --git a/dlls/quartz/fil_data.idl b/dlls/quartz/fil_data.idl
deleted file mode 100644
index ab93499..0000000
--- a/dlls/quartz/fil_data.idl
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- *
- * Notes:
- * - This interface is deprecated and IFilterMapper2 should be used instead.
- * - There is no full replacement for IAMFilterData::ParseFilterData short of manually
- * parsing out the REGFILTER2 struct from the binary blob.
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c
index 20c7e3a..d78f643 100644
--- a/dlls/quartz/filtermapper.c
+++ b/dlls/quartz/filtermapper.c
@@ -37,7 +37,7 @@
#include "wine/unicode.h"
#include "uuids.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
#include "wine/debug.h"
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in
index 4f54666..6b880c3 100644
--- a/dlls/quartz/tests/Makefile.in
+++ b/dlls/quartz/tests/Makefile.in
@@ -12,7 +12,6 @@ C_SRCS = \
referenceclock.c \
videorenderer.c
-IDL_SRCS = fil_data.idl
RC_SRCS = \
rsrc.rc
diff --git a/dlls/quartz/tests/fil_data.idl b/dlls/quartz/tests/fil_data.idl
deleted file mode 100644
index ab93499..0000000
--- a/dlls/quartz/tests/fil_data.idl
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- *
- * Notes:
- * - This interface is deprecated and IFilterMapper2 should be used instead.
- * - There is no full replacement for IAMFilterData::ParseFilterData short of manually
- * parsing out the REGFILTER2 struct from the binary blob.
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/quartz/tests/filtermapper.c b/dlls/quartz/tests/filtermapper.c
index 5a43785..7b6a018 100644
--- a/dlls/quartz/tests/filtermapper.c
+++ b/dlls/quartz/tests/filtermapper.c
@@ -26,7 +26,7 @@
#include "dshow.h"
#include "winternl.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
diff --git a/include/Makefile.in b/include/Makefile.in
index 39f2691..995544a 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -664,6 +664,7 @@ SOURCES = \
windowsx.h \
wine/debug.h \
wine/exception.h \
+ wine/fil_data.idl \
wine/itss.idl \
wine/library.h \
wine/svcctl.idl \
diff --git a/dlls/dxdiagn/fil_data.idl b/include/wine/fil_data.idl
similarity index 67%
rename from dlls/dxdiagn/fil_data.idl
rename to include/wine/fil_data.idl
index 7e37a75..19dfa8a 100644
--- a/dlls/dxdiagn/fil_data.idl
+++ b/include/wine/fil_data.idl
@@ -16,16 +16,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
import "unknwn.idl";
+import "strmif.idl";
-
-/*****************************************************************************
- * IAMFilterData interface
- */
[
object,
uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
@@ -33,15 +26,7 @@ import "unknwn.idl";
]
interface IAMFilterData : IUnknown
{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
+ HRESULT ParseFilterData( [in] BYTE *data, [in] ULONG size, [out] BYTE **regfilter );
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
+ HRESULT CreateFilterData( [in] REGFILTER2 *regfilter, [out] BYTE **data, [out] ULONG *size );
}
--
2.7.4
June 26, 2018
[PATCH v2 4/5] devenum: Remove an unused typedef.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/devenum_main.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 98ad1ad..b17bc93 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -28,13 +28,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(devenum);
DECLSPEC_HIDDEN LONG dll_refs;
static HINSTANCE devenum_instance;
-typedef struct
-{
- REFCLSID clsid;
- LPCWSTR friendly_name;
- BOOL instance;
-} register_info;
-
/***********************************************************************
* DllEntryPoint
*/
--
2.7.4
June 26, 2018
[PATCH v2 3/5] devenum: Make some variables static.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/createdevenum.c | 15 +++++++--------
dlls/devenum/devenum_main.c | 13 ++++---------
dlls/devenum/devenum_private.h | 4 +---
dlls/devenum/mediacatenum.c | 4 +++-
4 files changed, 15 insertions(+), 21 deletions(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 06c264c..e3ae54f 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -41,8 +41,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
-extern HINSTANCE DEVENUM_hInstance;
-
static const WCHAR wszFilterKeyName[] = {'F','i','l','t','e','r',0};
static const WCHAR wszMeritName[] = {'M','e','r','i','t',0};
static const WCHAR wszPins[] = {'P','i','n','s',0};
@@ -424,6 +422,7 @@ static void register_legacy_filters(void)
TRACE("Registering %s\n", debugstr_w(wszFilterSubkeyName));
strcpyW(wszRegKey, clsidW);
+ strcatW(wszRegKey, backslashW);
strcatW(wszRegKey, wszFilterSubkeyName);
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszRegKey, 0, KEY_READ, &classkey) != ERROR_SUCCESS)
@@ -460,7 +459,7 @@ static void register_legacy_filters(void)
V_VT(&var) = VT_BSTR;
if (!(V_BSTR(&var) = SysAllocString(wszFilterSubkeyName)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -537,7 +536,7 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
StringFromGUID2(&CLSID_DSoundRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -620,7 +619,7 @@ static void register_waveout_devices(void)
StringFromGUID2(&CLSID_AudioRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -693,7 +692,7 @@ static void register_wavein_devices(void)
StringFromGUID2(&CLSID_AudioRecord, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -765,7 +764,7 @@ static void register_midiout_devices(void)
StringFromGUID2(&CLSID_AVIMIDIRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -854,7 +853,7 @@ static void register_vfw_codecs(void)
StringFromGUID2(&CLSID_AVICo, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 3499f99..98ad1ad 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -26,7 +26,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
DECLSPEC_HIDDEN LONG dll_refs;
-DECLSPEC_HIDDEN HINSTANCE DEVENUM_hInstance;
+static HINSTANCE devenum_instance;
typedef struct
{
@@ -36,11 +36,6 @@ typedef struct
} register_info;
/***********************************************************************
- * Global string constant definitions
- */
-const WCHAR clsid_keyname[6] = { 'C', 'L', 'S', 'I', 'D', 0 };
-
-/***********************************************************************
* DllEntryPoint
*/
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
@@ -49,7 +44,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
- DEVENUM_hInstance = hinstDLL;
+ devenum_instance = hinstDLL;
DisableThreadLibraryCalls(hinstDLL);
break;
}
@@ -166,7 +161,7 @@ HRESULT WINAPI DllRegisterServer(void)
TRACE("\n");
- res = __wine_register_resources( DEVENUM_hInstance );
+ res = __wine_register_resources( devenum_instance );
if (FAILED(res))
return res;
@@ -214,5 +209,5 @@ HRESULT WINAPI DllRegisterServer(void)
HRESULT WINAPI DllUnregisterServer(void)
{
FIXME("stub!\n");
- return __wine_unregister_resources( DEVENUM_hInstance );
+ return __wine_unregister_resources( devenum_instance );
}
diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h
index ea4e017..e18c57d 100644
--- a/dlls/devenum/devenum_private.h
+++ b/dlls/devenum/devenum_private.h
@@ -83,7 +83,7 @@ extern IParseDisplayName DEVENUM_ParseDisplayName DECLSPEC_HIDDEN;
*/
static const WCHAR backslashW[] = {'\\',0};
-static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
+static const WCHAR clsidW[] = {'C','L','S','I','D',0};
static const WCHAR instanceW[] = {'\\','I','n','s','t','a','n','c','e',0};
static const WCHAR wszActiveMovieKey[] = {'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
@@ -93,5 +93,3 @@ static const WCHAR deviceW[] = {'@','d','e','v','i','c','e',':',0};
static const WCHAR dmoW[] = {'d','m','o',':',0};
static const WCHAR swW[] = {'s','w',':',0};
static const WCHAR cmW[] = {'c','m',':',0};
-
-extern const WCHAR clsid_keyname[6] DECLSPEC_HIDDEN;
diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c
index c4338a2..660e81c 100644
--- a/dlls/devenum/mediacatenum.c
+++ b/dlls/devenum/mediacatenum.c
@@ -347,6 +347,7 @@ static HRESULT create_PropertyBag(MediaCatMoniker *mon, IPropertyBag **ppBag)
else if (rpb->type == DEVICE_FILTER)
{
strcpyW(rpb->path, clsidW);
+ strcatW(rpb->path, backslashW);
if (mon->has_class)
{
StringFromGUID2(&mon->class, rpb->path + strlenW(rpb->path), CHARS_IN_GUID);
@@ -496,7 +497,7 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToObject(IMoniker *iface, IBi
if (SUCCEEDED(res))
{
V_VT(&var) = VT_LPWSTR;
- res = IPropertyBag_Read(pProp, clsid_keyname, &var, NULL);
+ res = IPropertyBag_Read(pProp, clsidW, &var, NULL);
}
if (SUCCEEDED(res))
{
@@ -1027,6 +1028,7 @@ HRESULT create_EnumMoniker(REFCLSID class, IEnumMoniker **ppEnumMoniker)
pEnumMoniker->class = *class;
strcpyW(buffer, clsidW);
+ strcatW(buffer, backslashW);
StringFromGUID2(class, buffer + strlenW(buffer), CHARS_IN_GUID);
strcatW(buffer, instanceW);
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &pEnumMoniker->sw_key))
--
2.7.4
June 26, 2018
[PATCH v2 2/5] devenum: Use separate factories for CLSID_SystemDeviceEnum and CLSID_CDeviceMoniker.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/devenum_main.c | 46 +++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 7bfc593..3499f99 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -56,6 +56,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
return TRUE;
}
+struct class_factory
+{
+ IClassFactory IClassFactory_iface;
+ IUnknown *obj;
+};
+
+static inline struct class_factory *impl_from_IClassFactory( IClassFactory *iface )
+{
+ return CONTAINING_RECORD( iface, struct class_factory, IClassFactory_iface );
+}
+
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID iid, void **obj)
{
TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), obj);
@@ -87,24 +98,15 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface,
IUnknown *outer, REFIID iid, void **obj)
{
+ struct class_factory *This = impl_from_IClassFactory( iface );
+
TRACE("(%p, %s, %p)\n", outer, debugstr_guid(iid), obj);
if (!obj) return E_POINTER;
if (outer) return CLASS_E_NOAGGREGATION;
- if (IsEqualGUID(&IID_ICreateDevEnum, iid))
- {
- *obj = &DEVENUM_CreateDevEnum;
- return S_OK;
- }
- if (IsEqualGUID(&IID_IParseDisplayName, iid))
- {
- *obj = &DEVENUM_ParseDisplayName;
- return S_OK;
- }
-
- return CLASS_E_CLASSNOTAVAILABLE;
+ return IUnknown_QueryInterface(This->obj, iid, obj);
}
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL lock)
@@ -124,24 +126,24 @@ static const IClassFactoryVtbl ClassFactory_vtbl = {
ClassFactory_LockServer
};
-static IClassFactory devenum_cf = { &ClassFactory_vtbl };
+static struct class_factory create_devenum_cf = { { &ClassFactory_vtbl }, (IUnknown *)&DEVENUM_CreateDevEnum };
+static struct class_factory device_moniker_cf = { { &ClassFactory_vtbl }, (IUnknown *)&DEVENUM_ParseDisplayName };
/***********************************************************************
* DllGetClassObject (DEVENUM.@)
*/
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
+HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **obj)
{
- TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+ TRACE("(%s, %s, %p)\n", debugstr_guid(clsid), debugstr_guid(iid), obj);
- *ppv = NULL;
+ *obj = NULL;
- /* FIXME: we should really have two class factories.
- * Oh well - works just fine as it is */
- if (IsEqualGUID(rclsid, &CLSID_SystemDeviceEnum) ||
- IsEqualGUID(rclsid, &CLSID_CDeviceMoniker))
- return IClassFactory_QueryInterface(&devenum_cf, iid, ppv);
+ if (IsEqualGUID(clsid, &CLSID_SystemDeviceEnum))
+ return IClassFactory_QueryInterface(&create_devenum_cf.IClassFactory_iface, iid, obj);
+ else if (IsEqualGUID(clsid, &CLSID_CDeviceMoniker))
+ return IClassFactory_QueryInterface(&device_moniker_cf.IClassFactory_iface, iid, obj);
- FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
+ FIXME("class %s not available\n", debugstr_guid(clsid));
return CLASS_E_CLASSNOTAVAILABLE;
}
--
2.7.4
June 26, 2018
[PATCH v2 1/5] devenum: Merge factory.c into devenum_main.c.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/Makefile.in | 1 -
dlls/devenum/devenum_main.c | 74 ++++++++++++++++++++++-
dlls/devenum/devenum_private.h | 10 ---
dlls/devenum/factory.c | 134 -----------------------------------------
4 files changed, 72 insertions(+), 147 deletions(-)
delete mode 100644 dlls/devenum/factory.c
diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in
index ae138b6..d1407a9 100644
--- a/dlls/devenum/Makefile.in
+++ b/dlls/devenum/Makefile.in
@@ -5,7 +5,6 @@ DELAYIMPORTS = msvfw32
C_SRCS = \
createdevenum.c \
devenum_main.c \
- factory.c \
mediacatenum.c \
parsedisplayname.c
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index cb4b454..7bfc593 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -1,5 +1,5 @@
/*
- * exported dll functions for devenum.dll
+ * Device Enumeration
*
* Copyright (C) 2002 John K. Hohm
* Copyright (C) 2002 Robert Shearman
@@ -56,6 +56,76 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
return TRUE;
}
+static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID iid, void **obj)
+{
+ TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), obj);
+
+ if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IClassFactory))
+ {
+ IClassFactory_AddRef(iface);
+ *obj = iface;
+ return S_OK;
+ }
+
+ *obj = NULL;
+ WARN("no interface for %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
+{
+ DEVENUM_LockModule();
+ return 2;
+}
+
+static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
+{
+ DEVENUM_UnlockModule();
+ return 1;
+}
+
+static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface,
+ IUnknown *outer, REFIID iid, void **obj)
+{
+ TRACE("(%p, %s, %p)\n", outer, debugstr_guid(iid), obj);
+
+ if (!obj) return E_POINTER;
+
+ if (outer) return CLASS_E_NOAGGREGATION;
+
+ if (IsEqualGUID(&IID_ICreateDevEnum, iid))
+ {
+ *obj = &DEVENUM_CreateDevEnum;
+ return S_OK;
+ }
+ if (IsEqualGUID(&IID_IParseDisplayName, iid))
+ {
+ *obj = &DEVENUM_ParseDisplayName;
+ return S_OK;
+ }
+
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL lock)
+{
+ if (lock)
+ DEVENUM_LockModule();
+ else
+ DEVENUM_UnlockModule();
+ return S_OK;
+}
+
+static const IClassFactoryVtbl ClassFactory_vtbl = {
+ ClassFactory_QueryInterface,
+ ClassFactory_AddRef,
+ ClassFactory_Release,
+ ClassFactory_CreateInstance,
+ ClassFactory_LockServer
+};
+
+static IClassFactory devenum_cf = { &ClassFactory_vtbl };
+
/***********************************************************************
* DllGetClassObject (DEVENUM.@)
*/
@@ -69,7 +139,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
* Oh well - works just fine as it is */
if (IsEqualGUID(rclsid, &CLSID_SystemDeviceEnum) ||
IsEqualGUID(rclsid, &CLSID_CDeviceMoniker))
- return IClassFactory_QueryInterface(&DEVENUM_ClassFactory.IClassFactory_iface, iid, ppv);
+ return IClassFactory_QueryInterface(&devenum_cf, iid, ppv);
FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
return CLASS_E_CLASSNOTAVAILABLE;
diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h
index df0080d..ea4e017 100644
--- a/dlls/devenum/devenum_private.h
+++ b/dlls/devenum/devenum_private.h
@@ -51,15 +51,6 @@ extern LONG dll_refs DECLSPEC_HIDDEN;
static inline void DEVENUM_LockModule(void) { InterlockedIncrement(&dll_refs); }
static inline void DEVENUM_UnlockModule(void) { InterlockedDecrement(&dll_refs); }
-
-/**********************************************************************
- * ClassFactory declaration for devenum.dll
- */
-typedef struct
-{
- IClassFactory IClassFactory_iface;
-} ClassFactoryImpl;
-
enum device_type
{
DEVICE_FILTER,
@@ -84,7 +75,6 @@ typedef struct
MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct(void) DECLSPEC_HIDDEN;
HRESULT create_EnumMoniker(REFCLSID class, IEnumMoniker **enum_mon) DECLSPEC_HIDDEN;
-extern ClassFactoryImpl DEVENUM_ClassFactory DECLSPEC_HIDDEN;
extern ICreateDevEnum DEVENUM_CreateDevEnum DECLSPEC_HIDDEN;
extern IParseDisplayName DEVENUM_ParseDisplayName DECLSPEC_HIDDEN;
diff --git a/dlls/devenum/factory.c b/dlls/devenum/factory.c
deleted file mode 100644
index c808fa5..0000000
--- a/dlls/devenum/factory.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * ClassFactory implementation for DEVENUM.dll
- *
- * Copyright (C) 2002 John K. Hohm
- * Copyright (C) 2002 Robert Shearman
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "devenum_private.h"
-
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(devenum);
-
-/**********************************************************************
- * DEVENUM_IClassFactory_QueryInterface (also IUnknown)
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_QueryInterface(IClassFactory *iface, REFIID riid,
- void **ppvObj)
-{
- TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObj);
-
- if (ppvObj == NULL) return E_POINTER;
-
- if (IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IClassFactory))
- {
- *ppvObj = iface;
- IClassFactory_AddRef(iface);
- return S_OK;
- }
- else if (IsEqualGUID(riid, &IID_IParseDisplayName))
- {
- return IClassFactory_CreateInstance(iface, NULL, riid, ppvObj);
- }
-
- FIXME("- no interface IID: %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_AddRef (also IUnknown)
- */
-static ULONG WINAPI DEVENUM_IClassFactory_AddRef(IClassFactory *iface)
-{
- TRACE("\n");
-
- DEVENUM_LockModule();
-
- return 2; /* non-heap based object */
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_Release (also IUnknown)
- */
-static ULONG WINAPI DEVENUM_IClassFactory_Release(IClassFactory *iface)
-{
- TRACE("\n");
-
- DEVENUM_UnlockModule();
-
- return 1; /* non-heap based object */
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_CreateInstance
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_CreateInstance(IClassFactory *iface,
- IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
-{
- TRACE("(%p)->(%p, %s, %p)\n", iface, pUnkOuter, debugstr_guid(riid), ppvObj);
-
- if (ppvObj == NULL) return E_POINTER;
-
- /* Don't support aggregation (Windows doesn't) */
- if (pUnkOuter != NULL) return CLASS_E_NOAGGREGATION;
-
- if (IsEqualGUID(&IID_ICreateDevEnum, riid))
- {
- *ppvObj = &DEVENUM_CreateDevEnum;
- return S_OK;
- }
- if (IsEqualGUID(&IID_IParseDisplayName, riid))
- {
- *ppvObj = &DEVENUM_ParseDisplayName;
- return S_OK;
- }
-
- return CLASS_E_CLASSNOTAVAILABLE;
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_LockServer
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
-{
- TRACE("\n");
-
- if (fLock)
- DEVENUM_LockModule();
- else
- DEVENUM_UnlockModule();
- return S_OK;
-}
-
-/**********************************************************************
- * IClassFactory_Vtbl
- */
-static const IClassFactoryVtbl IClassFactory_Vtbl =
-{
- DEVENUM_IClassFactory_QueryInterface,
- DEVENUM_IClassFactory_AddRef,
- DEVENUM_IClassFactory_Release,
- DEVENUM_IClassFactory_CreateInstance,
- DEVENUM_IClassFactory_LockServer
-};
-
-/**********************************************************************
- * static ClassFactory instance
- */
-ClassFactoryImpl DEVENUM_ClassFactory = { { &IClassFactory_Vtbl } };
--
2.7.4
June 26, 2018
[PATCH] kernel32: GetVolumePathNamesForVolumeNameW gets character as buffer size
by Marcus Meissner
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
dlls/kernel32/tests/volume.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index c47043d288..f673fd2917 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -983,7 +983,7 @@ static void test_GetVolumePathNamesForVolumeNameW(void)
return;
}
- ret = pGetVolumeNameForVolumeMountPointW( drive_c, volume, sizeof(volume)/sizeof(volume[0]) );
+ ret = pGetVolumeNameForVolumeMountPointW( drive_c, volume, ARRAY_SIZE(volume) );
ok(ret, "failed to get volume name %u\n", GetLastError());
SetLastError( 0xdeadbeef );
@@ -1005,16 +1005,16 @@ static void test_GetVolumePathNamesForVolumeNameW(void)
ok(error == ERROR_MORE_DATA, "expected ERROR_MORE_DATA got %u\n", error);
if (0) { /* crash */
- ret = pGetVolumePathNamesForVolumeNameW( volume, NULL, sizeof(buffer), NULL );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, NULL, ARRAY_SIZE(buffer), NULL );
ok(ret, "failed to get path names %u\n", GetLastError());
}
- ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, sizeof(buffer), NULL );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, ARRAY_SIZE(buffer), NULL );
ok(ret, "failed to get path names %u\n", GetLastError());
len = 0;
memset( buffer, 0xff, sizeof(buffer) );
- ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, sizeof(buffer), &len );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, ARRAY_SIZE(buffer), &len );
ok(ret, "failed to get path names %u\n", GetLastError());
ok(len == 5, "expected 5 got %u\n", len);
ok(!buffer[4], "expected double null-terminated buffer\n");
@@ -1023,7 +1023,7 @@ static void test_GetVolumePathNamesForVolumeNameW(void)
volume[1] = '?';
volume[lstrlenW( volume ) - 1] = 0;
SetLastError( 0xdeadbeef );
- ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, sizeof(buffer), &len );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, ARRAY_SIZE(buffer), &len );
error = GetLastError();
ok(!ret, "expected failure\n");
ok(error == ERROR_INVALID_NAME, "expected ERROR_INVALID_NAME got %u\n", error);
@@ -1032,7 +1032,7 @@ static void test_GetVolumePathNamesForVolumeNameW(void)
volume[0] = '\\';
volume[1] = 0;
SetLastError( 0xdeadbeef );
- ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, sizeof(buffer), &len );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, ARRAY_SIZE(buffer), &len );
error = GetLastError();
ok(!ret, "expected failure\n");
todo_wine ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error);
@@ -1040,7 +1040,7 @@ static void test_GetVolumePathNamesForVolumeNameW(void)
len = 0;
lstrcpyW( volume, volume_null );
SetLastError( 0xdeadbeef );
- ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, sizeof(buffer), &len );
+ ret = pGetVolumePathNamesForVolumeNameW( volume, buffer, ARRAY_SIZE(buffer), &len );
error = GetLastError();
ok(!ret, "expected failure\n");
ok(error == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND got %u\n", error);
--
2.17.1
June 26, 2018
[PATCH] kernel32: GetCalendarInfoW gets character sizes
by Marcus Meissner
found by grep
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
dlls/kernel32/tests/time.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/time.c b/dlls/kernel32/tests/time.c
index e6e779c703..8bbad2b8a2 100644
--- a/dlls/kernel32/tests/time.c
+++ b/dlls/kernel32/tests/time.c
@@ -697,7 +697,7 @@ static void test_GetCalendarInfo(void)
ok( ret == 5, "wrong size %u\n", ret );
ok( atoi( bufferA ) == val1, "wrong value %s/%u\n", bufferA, val1 );
- ret = pGetCalendarInfoW( 0x0409, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, bufferW, sizeof(bufferW), NULL );
+ ret = pGetCalendarInfoW( 0x0409, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, bufferW, ARRAY_SIZE(bufferW), NULL );
ok( ret, "GetCalendarInfoW failed err %u\n", GetLastError() );
ok( ret == 5, "wrong size %u\n", ret );
memset( bufferA, 0x55, sizeof(bufferA) );
@@ -731,7 +731,7 @@ static void test_GetCalendarInfo(void)
ok( ret == ret2, "got %d, expected %d\n", ret2, ret );
ret2 = pGetCalendarInfoW( LANG_SYSTEM_DEFAULT, CAL_GREGORIAN, CAL_SDAYNAME1,
- bufferW, sizeof(bufferW), NULL);
+ bufferW, ARRAY_SIZE(bufferW), NULL);
ok( ret2, "GetCalendarInfoW failed err %u\n", GetLastError() );
ret2 = WideCharToMultiByte( CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL );
ok( ret == ret2, "got %d, expected %d\n", ret, ret2 );
--
2.17.1
June 26, 2018
[PATCH 5/5] winmm: Support TIME_MIDI position in MIDI stream.
by Akihiro Sagawa
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
dlls/winmm/tests/midi.c | 4 ++--
dlls/winmm/winmm.c | 19 ++++++++++++++++---
2 files changed, 18 insertions(+), 5 deletions(-)
June 26, 2018
[PATCH 4/5] winmm: Make TIME_TICKS position continuous.
by Akihiro Sagawa
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
dlls/winmm/tests/midi.c | 2 +-
dlls/winmm/winmm.c | 28 ++++++++++++++++++++++++++--
2 files changed, 27 insertions(+), 3 deletions(-)
June 26, 2018
[PATCH 3/5] winmm/tests: Add more MIDI stream position tests.
by Akihiro Sagawa
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
dlls/winmm/tests/midi.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
June 26, 2018
[PATCH 2/5] winmm: Preserve fractions in microseconds to compensate rounding errors.
by Akihiro Sagawa
Otherwise, a song is played faster than expected in some cases.
For instance, we assume that 40 pan control change (CC#10) messages are
expressed in 12.5ms each,
* Prior art omits fractions, i.e. 12ms + 12ms + ... = 480ms.
* Proposal technique saves fractions, i.e. 12ms + 13ms + ... = 500ms.
Ideal duration is 500ms. So, the proposed method is better than prior one.
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
dlls/winmm/winmm.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
June 26, 2018
[PATCH 1/5] winmm: Don't allow to set time division property while playing.
by Akihiro Sagawa
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
dlls/winmm/tests/midi.c | 6 ++++++
dlls/winmm/winmm.c | 8 ++++++--
2 files changed, 12 insertions(+), 2 deletions(-)
June 26, 2018
[PATCH] testbot/WineRunTask: Better detect standard Wine tests.
by Francois Gouget
It's better to take the step dependencies into account and to verify
that the previous step was dealing with a Wine patch.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunTask.pl | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index ff8aab9f4..9fa263eea 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -441,9 +441,10 @@ if ($Step->Type eq "single")
}
$Script .= "> $RptFileName\r\n";
- # If StepNo is 1 then the user gave us an executable. Then there is no
- # telling if it's going to follow the Wine test standards.
- $IsWineTest = ($StepNo != 1);
+ # If the user gave us an executable there is no telling
+ # if it is going going to follow the Wine test standards.
+ $IsWineTest = (defined $Step->PreviousNo and
+ $Job->Steps->GetItem($Step->PreviousNo)->FileType eq "patchdlls");
}
elsif ($Step->Type eq "suite")
{
--
2.18.0
June 26, 2018
[PATCH] testbot/WineRun*: Standardize a couple of TestBot error messages.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 2 +-
testbot/bin/WineRunTask.pl | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index ff04ded0c..176ade6b6 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -458,7 +458,7 @@ foreach my $TestInfo (values %{$Impacts->{Tests}})
}
elsif ($TA->GetLastError() !~ /: No such file or directory/)
{
- FatalTAError($TA, "Could not retrieve '$Local'");
+ FatalTAError($TA, "An error occurred while retrieving '$Local'");
}
}
}
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 9fa263eea..9faae28c3 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -482,7 +482,7 @@ elsif ($Step->Type eq "suite")
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
if (!$TA->SendFileFromString($Script, "script.bat", $TestAgent::SENDFILE_EXE))
{
- FatalTAError($TA, "Could not send the script to the VM");
+ FatalTAError($TA, "Could not send the task script to the VM");
}
--
2.18.0
June 26, 2018
[PATCH] testbot: Rename the Makefiles patch impact to MakeMakefiles.
by Francois Gouget
This makes it clearer that it does not mean a makefile was modified, but
that the make_makefiles script should be rerun.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/build/Build.pl | 2 +-
testbot/bin/build/WineTest.pl | 2 +-
testbot/lib/WineTestBot/PatchUtils.pm | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/testbot/bin/build/Build.pl b/testbot/bin/build/Build.pl
index 4df107005..a3cb170a0 100755
--- a/testbot/bin/build/Build.pl
+++ b/testbot/bin/build/Build.pl
@@ -103,7 +103,7 @@ sub ApplyPatch($)
}
my $Impacts = GetPatchImpact($PatchFile, "nounits");
- if ($Impacts->{Makefiles})
+ if ($Impacts->{MakeMakefiles})
{
InfoMsg "\nRunning make_makefiles\n";
system("cd '$DataDir/wine' && set -x && ./tools/make_makefiles");
diff --git a/testbot/bin/build/WineTest.pl b/testbot/bin/build/WineTest.pl
index 01396f9bf..032ee4640 100755
--- a/testbot/bin/build/WineTest.pl
+++ b/testbot/bin/build/WineTest.pl
@@ -100,7 +100,7 @@ sub ApplyPatch($)
}
my $Impacts = GetPatchImpact($PatchFile, "nounits");
- if ($Impacts->{Makefiles})
+ if ($Impacts->{MakeMakefiles})
{
InfoMsg "\nRunning make_makefiles\n";
system("cd '$DataDir/wine' && set -x && ./tools/make_makefiles");
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index c37a1d3ab..b2bfe6a9a 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -178,7 +178,7 @@ sub _HandleFile($$$)
if ($Change eq "new" or $Change eq "rm")
{
# This adds / removes a directory
- $Impacts->{Makefiles} = 1;
+ $Impacts->{MakeMakefiles} = 1;
}
return;
}
@@ -216,7 +216,7 @@ sub _HandleFile($$$)
{
# This may or may not be a Wine patch but the new Makefile.in will be
# added to the build by make_makefiles.
- $Impacts->{WineBuild} = $Impacts->{Makefiles} = 1;
+ $Impacts->{WineBuild} = $Impacts->{MakeMakefiles} = 1;
}
}
}
@@ -289,7 +289,7 @@ sub GetPatchImpact($;$$)
}
elsif ($Line =~ m=^--- \w+/tools/make_makefiles$=)
{
- $Impacts->{WineBuild} = $Impacts->{Makefiles} = 1;
+ $Impacts->{WineBuild} = $Impacts->{MakeMakefiles} = 1;
$Impacts->{IsWinePatch} = 1;
}
elsif ($Line =~ m=^--- /dev/null$=)
--
2.18.0
June 26, 2018
[PATCH vkd3d 12/12] libs/vkd3d-shader: Fix returning multiple components from dot product instructions.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 76 +++++++++++++++++++++++++----------------------
tests/d3d12.c | 23 ++++++++++++++
2 files changed, 64 insertions(+), 35 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index a5e51c9643cb..bfa2bc0dacf7 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2219,6 +2219,35 @@ static uint32_t vkd3d_dxbc_compiler_emit_array_variable(struct vkd3d_dxbc_compil
return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
}
+static uint32_t vkd3d_dxbc_compiler_emit_construct_vector(struct vkd3d_dxbc_compiler *compiler,
+ enum vkd3d_component_type component_type, unsigned int component_count,
+ uint32_t val_id, unsigned int val_component_idx, unsigned int val_component_count)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t components[VKD3D_VEC4_SIZE];
+ uint32_t type_id, result_id;
+ unsigned int i;
+
+ assert(val_component_idx < val_component_count);
+
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
+ if (val_component_count == 1)
+ {
+ for (i = 0; i < component_count; ++i)
+ components[i] = val_id;
+ result_id = vkd3d_spirv_build_op_composite_construct(builder,
+ type_id, components, component_count);
+ }
+ else
+ {
+ for (i = 0; i < component_count; ++i)
+ components[i] = val_component_idx;
+ result_id = vkd3d_spirv_build_op_vector_shuffle(builder,
+ type_id, val_id, val_id, components, component_count);
+ }
+ return result_id;
+}
+
static uint32_t vkd3d_dxbc_compiler_emit_load_src(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_src_param *src, DWORD write_mask);
@@ -4202,11 +4231,13 @@ static void vkd3d_dxbc_compiler_emit_dot(struct vkd3d_dxbc_compiler *compiler,
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
const struct vkd3d_shader_dst_param *dst = instruction->dst;
const struct vkd3d_shader_src_param *src = instruction->src;
+ enum vkd3d_component_type component_type;
uint32_t type_id, val_id, src_ids[2];
+ unsigned int component_count, i;
DWORD write_mask;
- unsigned int i;
- assert(vkd3d_write_mask_component_count(dst->write_mask) == 1);
+ component_count = vkd3d_write_mask_component_count(dst->write_mask);
+ component_type = vkd3d_component_type_from_data_type(dst->reg.data_type);
if (instruction->handler_idx == VKD3DSIH_DP4)
write_mask = VKD3DSP_WRITEMASK_ALL;
@@ -4219,11 +4250,15 @@ static void vkd3d_dxbc_compiler_emit_dot(struct vkd3d_dxbc_compiler *compiler,
for (i = 0; i < ARRAY_SIZE(src_ids); ++i)
src_ids[i] = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[i], write_mask);
- type_id = vkd3d_spirv_get_type_id(builder,
- vkd3d_component_type_from_data_type(dst->reg.data_type), 1);
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
val_id = vkd3d_spirv_build_op_tr2(builder, &builder->function_stream,
SpvOpDot, type_id, src_ids[0], src_ids[1]);
+ if (component_count > 1)
+ {
+ val_id = vkd3d_dxbc_compiler_emit_construct_vector(compiler,
+ component_type, component_count, val_id, 0, 1);
+ }
vkd3d_dxbc_compiler_emit_store_dst(compiler, dst, val_id);
}
@@ -5270,35 +5305,6 @@ static void vkd3d_dxbc_compiler_emit_ld_raw_structured(struct vkd3d_dxbc_compile
}
}
-static uint32_t vkd3d_dxbc_compiler_emit_construct_vec4(struct vkd3d_dxbc_compiler *compiler,
- uint32_t val_id, enum vkd3d_component_type component_type,
- unsigned int component_idx, unsigned int component_count)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t components[VKD3D_VEC4_SIZE];
- uint32_t type_id, result_id;
- unsigned int i;
-
- assert(component_idx < component_count);
-
- type_id = vkd3d_spirv_get_type_id(builder, component_type, VKD3D_VEC4_SIZE);
- if (component_count == 1)
- {
- for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
- components[i] = val_id;
- result_id = vkd3d_spirv_build_op_composite_construct(builder,
- type_id, components, VKD3D_VEC4_SIZE);
- }
- else
- {
- for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
- components[i] = component_idx;
- result_id = vkd3d_spirv_build_op_vector_shuffle(builder,
- type_id, val_id, val_id, components, VKD3D_VEC4_SIZE);
- }
- return result_id;
-}
-
static void vkd3d_dxbc_compiler_emit_store_uav_raw_structured(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_instruction *instruction)
{
@@ -5325,8 +5331,8 @@ static void vkd3d_dxbc_compiler_emit_store_uav_raw_structured(struct vkd3d_dxbc_
for (component_idx = 0; component_idx < component_count; ++component_idx)
{
/* Mesa Vulkan drivers require the texel parameter to be a vector. */
- texel_id = vkd3d_dxbc_compiler_emit_construct_vec4(compiler,
- val_id, VKD3D_TYPE_UINT, component_idx, component_count);
+ texel_id = vkd3d_dxbc_compiler_emit_construct_vector(compiler,
+ VKD3D_TYPE_UINT, VKD3D_VEC4_SIZE, val_id, component_idx, component_count);
coordinate_id = base_coordinate_id;
if (component_idx)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index a761c0d3cad4..c6220aa0113d 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -4919,6 +4919,26 @@ static void test_shader_instructions(void)
0x00000000, 0x0100003e,
};
static const D3D12_SHADER_BYTECODE ps_dot2 = {ps_dot2_code, sizeof(ps_dot2_code)};
+ static const DWORD ps_dot3_code[] =
+ {
+#if 0
+ float4 src0;
+ float3 src1;
+
+ float4 main() : SV_Target
+ {
+ return dot(src0, src1);
+ }
+#endif
+ 0x43425844, 0xa75a4a95, 0x5d09936e, 0xdc5c694f, 0x68b6b04f, 0x00000001, 0x000000c8, 0x00000003,
+ 0x0000002c, 0x0000003c, 0x00000070, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f,
+ 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
+ 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000050, 0x00000050, 0x00000014,
+ 0x0100086a, 0x04000059, 0x00208e46, 0x00000000, 0x00000002, 0x03000065, 0x001020f2, 0x00000000,
+ 0x09000010, 0x001020f2, 0x00000000, 0x00208246, 0x00000000, 0x00000000, 0x00208246, 0x00000000,
+ 0x00000001, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE ps_dot3 = {ps_dot3_code, sizeof(ps_dot3_code)};
static const DWORD ps_eq_code[] =
{
#if 0
@@ -6119,6 +6139,9 @@ static void test_shader_instructions(void)
{&ps_dot2, {{1.0f, 1.0f}, {1.0f, 1.0f}}, {{2.0f}}},
{&ps_dot2, {{1.0f, 1.0f}, {2.0f, 3.0f}}, {{5.0f}}},
+ {&ps_dot3, {{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 1.0f, 1.0f, 1.0f}}, {{6.0f, 6.0f, 6.0f, 6.0f}}},
+ {&ps_dot3, {{1.0f, 2.0f, 3.0f}, {3.0f, 1.0f, 2.0f}}, {{11.0f, 11.0f, 11.0f, 11.0f}}},
+
{&ps_eq, {{0.0f}, {0.0f}}, {.u = {0xffffffff}}},
{&ps_eq, {{1.0f}, {0.0f}}, {.u = {0x00000000}}},
{&ps_eq, {{0.0f}, {1.0f}}, {.u = {0x00000000}}},
--
2.16.4
June 26, 2018
[PATCH vkd3d 11/12] tests: Add simple test for layered rendering.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++-
tests/vkd3d_d3d12_test.h | 6 +-
2 files changed, 211 insertions(+), 5 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 0e35fc866bbc..a761c0d3cad4 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -663,7 +663,7 @@ static void check_sub_resource_float_(unsigned int line, ID3D12Resource *texture
{
struct resource_readback rb;
- get_texture_readback_with_command_list(texture, 0, &rb, queue, command_list);
+ get_texture_readback_with_command_list(texture, sub_resource_idx, &rb, queue, command_list);
check_readback_data_float_(line, &rb, NULL, expected, max_diff);
release_resource_readback(&rb);
}
@@ -745,7 +745,7 @@ static void check_sub_resource_uint16_(unsigned int line, ID3D12Resource *textur
{
struct resource_readback rb;
- get_texture_readback_with_command_list(texture, 0, &rb, queue, command_list);
+ get_texture_readback_with_command_list(texture, sub_resource_idx, &rb, queue, command_list);
check_readback_data_uint16_(line, &rb, NULL, expected, max_diff);
release_resource_readback(&rb);
}
@@ -17034,6 +17034,211 @@ static void test_geometry_shader(void)
destroy_test_context(&context);
}
+static void test_layered_rendering(void)
+{
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc;
+ ID3D12GraphicsCommandList *command_list;
+ D3D12_INPUT_LAYOUT_DESC input_layout;
+ struct test_context_desc desc;
+ D3D12_VERTEX_BUFFER_VIEW vbv;
+ struct test_context context;
+ ID3D12CommandQueue *queue;
+ ID3D12PipelineState *pso;
+ ID3D12Device *device;
+ ID3D12Resource *vb;
+ HRESULT hr;
+
+ static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ static const struct
+ {
+ uint32_t color;
+ struct vec4 position;
+ uint32_t layer;
+ }
+ vertices[] =
+ {
+ {0x00000000, {-1.0f, -1.0f, 0.0f, 1.0f}, 2},
+ {0x00000000, {-1.0f, 1.0f, 0.0f, 1.0f}, 2},
+ {0x00000000, { 1.0f, -1.0f, 0.0f, 1.0f}, 2},
+ {0x00000000, { 1.0f, 1.0f, 0.0f, 1.0f}, 2},
+ {0xff00ff00, {-1.0f, -1.0f, 0.0f, 1.0f}, 0},
+ {0xff00ff00, {-1.0f, 1.0f, 0.0f, 1.0f}, 0},
+ {0xff00ff00, { 1.0f, -1.0f, 0.0f, 1.0f}, 0},
+ {0xff00ff00, { 1.0f, 1.0f, 0.0f, 1.0f}, 0},
+ {0xffffff00, {-1.0f, -1.0f, 0.0f, 1.0f}, 3},
+ {0xffffff00, {-1.0f, 1.0f, 0.0f, 1.0f}, 3},
+ {0xffffff00, { 1.0f, -1.0f, 0.0f, 1.0f}, 3},
+ {0xffffff00, { 1.0f, 1.0f, 0.0f, 1.0f}, 3},
+ };
+ static const D3D12_INPUT_ELEMENT_DESC layout_desc[] =
+ {
+ {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
+ {"SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 4, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
+ {"LAYER", 0, DXGI_FORMAT_R32_UINT, 0, 20, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
+ };
+ static const DWORD vs_code[] =
+ {
+#if 0
+ struct vertex
+ {
+ float4 color : COLOR;
+ float4 position : SV_Position;
+ uint layer : LAYER;
+ };
+
+ struct vertex main(in vertex v)
+ {
+ return v;
+ }
+#endif
+ 0x43425844, 0x96d7f39a, 0x03d06cd5, 0x32c1fa04, 0xd509128f, 0x00000001, 0x000001ac, 0x00000003,
+ 0x0000002c, 0x0000009c, 0x0000010c, 0x4e475349, 0x00000068, 0x00000003, 0x00000008, 0x00000050,
+ 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x00000056, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000001, 0x00000f0f, 0x00000062, 0x00000000, 0x00000000, 0x00000001, 0x00000002,
+ 0x00000101, 0x4f4c4f43, 0x56530052, 0x736f505f, 0x6f697469, 0x414c006e, 0x00524559, 0x4e47534f,
+ 0x00000068, 0x00000003, 0x00000008, 0x00000050, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
+ 0x0000000f, 0x00000056, 0x00000000, 0x00000001, 0x00000003, 0x00000001, 0x0000000f, 0x00000062,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000e01, 0x4f4c4f43, 0x56530052, 0x736f505f,
+ 0x6f697469, 0x414c006e, 0x00524559, 0x58454853, 0x00000098, 0x00010050, 0x00000026, 0x0100086a,
+ 0x0300005f, 0x001010f2, 0x00000000, 0x0300005f, 0x001010f2, 0x00000001, 0x0300005f, 0x00101012,
+ 0x00000002, 0x03000065, 0x001020f2, 0x00000000, 0x04000067, 0x001020f2, 0x00000001, 0x00000001,
+ 0x03000065, 0x00102012, 0x00000002, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000,
+ 0x05000036, 0x001020f2, 0x00000001, 0x00101e46, 0x00000001, 0x05000036, 0x00102012, 0x00000002,
+ 0x0010100a, 0x00000002, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE vs = {vs_code, sizeof(vs_code)};
+ static const DWORD gs_code[] =
+ {
+#if 0
+ struct gs_in
+ {
+ float4 color : COLOR;
+ float4 position : SV_Position;
+ uint layer : LAYER;
+ };
+
+ struct gs_out
+ {
+ float4 color : COLOR;
+ float4 position : SV_Position;
+ uint layer : SV_RenderTargetArrayIndex;
+ };
+
+ [maxvertexcount(3)]
+ void main(triangle gs_in vin[3], inout TriangleStream<gs_out> vout)
+ {
+ gs_out o;
+
+ o.color = vin[0].color;
+ o.position = vin[0].position;
+ o.layer = vin[0].layer;
+ vout.Append(o);
+
+ o.color = vin[1].color;
+ o.position = vin[1].position;
+ o.layer = vin[1].layer;
+ vout.Append(o);
+
+ o.color = vin[2].color;
+ o.position = vin[2].position;
+ o.layer = vin[2].layer;
+ vout.Append(o);
+ }
+#endif
+ 0x43425844, 0x29d7c0a0, 0xcf146fd1, 0x5cd36ca7, 0xab2b10ff, 0x00000001, 0x000002bc, 0x00000003,
+ 0x0000002c, 0x0000009c, 0x0000012c, 0x4e475349, 0x00000068, 0x00000003, 0x00000008, 0x00000050,
+ 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x00000056, 0x00000000, 0x00000001,
+ 0x00000003, 0x00000001, 0x00000f0f, 0x00000062, 0x00000000, 0x00000000, 0x00000001, 0x00000002,
+ 0x00000101, 0x4f4c4f43, 0x56530052, 0x736f505f, 0x6f697469, 0x414c006e, 0x00524559, 0x3547534f,
+ 0x00000088, 0x00000003, 0x00000008, 0x00000000, 0x0000005c, 0x00000000, 0x00000000, 0x00000003,
+ 0x00000000, 0x0000000f, 0x00000000, 0x00000062, 0x00000000, 0x00000001, 0x00000003, 0x00000001,
+ 0x0000000f, 0x00000000, 0x0000006e, 0x00000000, 0x00000004, 0x00000001, 0x00000002, 0x00000e01,
+ 0x4f4c4f43, 0x56530052, 0x736f505f, 0x6f697469, 0x5653006e, 0x6e65525f, 0x54726564, 0x65677261,
+ 0x72724174, 0x6e497961, 0x00786564, 0x58454853, 0x00000188, 0x00020050, 0x00000062, 0x0100086a,
+ 0x0400005f, 0x002010f2, 0x00000003, 0x00000000, 0x05000061, 0x002010f2, 0x00000003, 0x00000001,
+ 0x00000001, 0x0400005f, 0x00201012, 0x00000003, 0x00000002, 0x0100185d, 0x0300008f, 0x00110000,
+ 0x00000000, 0x0100285c, 0x03000065, 0x001020f2, 0x00000000, 0x04000067, 0x001020f2, 0x00000001,
+ 0x00000001, 0x04000067, 0x00102012, 0x00000002, 0x00000004, 0x0200005e, 0x00000003, 0x06000036,
+ 0x001020f2, 0x00000000, 0x00201e46, 0x00000000, 0x00000000, 0x06000036, 0x001020f2, 0x00000001,
+ 0x00201e46, 0x00000000, 0x00000001, 0x06000036, 0x00102012, 0x00000002, 0x0020100a, 0x00000000,
+ 0x00000002, 0x03000075, 0x00110000, 0x00000000, 0x06000036, 0x001020f2, 0x00000000, 0x00201e46,
+ 0x00000001, 0x00000000, 0x06000036, 0x001020f2, 0x00000001, 0x00201e46, 0x00000001, 0x00000001,
+ 0x06000036, 0x00102012, 0x00000002, 0x0020100a, 0x00000001, 0x00000002, 0x03000075, 0x00110000,
+ 0x00000000, 0x06000036, 0x001020f2, 0x00000000, 0x00201e46, 0x00000002, 0x00000000, 0x06000036,
+ 0x001020f2, 0x00000001, 0x00201e46, 0x00000002, 0x00000001, 0x06000036, 0x00102012, 0x00000002,
+ 0x0020100a, 0x00000002, 0x00000002, 0x03000075, 0x00110000, 0x00000000, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE gs = {gs_code, sizeof(gs_code)};
+ static const DWORD ps_code[] =
+ {
+#if 0
+ float4 main(float4 color : COLOR) : SV_Target0
+ {
+ return color;
+ }
+#endif
+ 0x43425844, 0xdccf00bf, 0xcc96375e, 0xba21f157, 0xe47b8b1c, 0x00000001, 0x000000d4, 0x00000003,
+ 0x0000002c, 0x0000005c, 0x00000090, 0x4e475349, 0x00000028, 0x00000001, 0x00000008, 0x00000020,
+ 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x4f4c4f43, 0xabab0052, 0x4e47534f,
+ 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
+ 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000003c, 0x00000050, 0x0000000f,
+ 0x0100086a, 0x03001062, 0x001010f2, 0x00000000, 0x03000065, 0x001020f2, 0x00000000, 0x05000036,
+ 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE ps = {ps_code, sizeof(ps_code)};
+
+ memset(&desc, 0, sizeof(desc));
+ desc.rt_array_size = 4;
+ desc.root_signature_flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ desc.no_pipeline = true;
+ if (!init_test_context(&context, &desc))
+ return;
+ device = context.device;
+ command_list = context.list;
+ queue = context.queue;
+
+ input_layout.pInputElementDescs = layout_desc;
+ input_layout.NumElements = ARRAY_SIZE(layout_desc);
+
+ init_pipeline_state_desc(&pso_desc, context.root_signature,
+ context.render_target_desc.Format, &vs, &ps, &input_layout);
+ pso_desc.GS = gs;
+ hr = ID3D12Device_CreateGraphicsPipelineState(device, &pso_desc,
+ &IID_ID3D12PipelineState, (void **)&pso);
+ ok(hr == S_OK, "Failed to create graphics pipeline state, hr %#x.\n", hr);
+
+ vb = create_upload_buffer(context.device, sizeof(vertices), vertices);
+ vbv.BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb);
+ vbv.StrideInBytes = sizeof(*vertices);
+ vbv.SizeInBytes = sizeof(vertices);
+
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, white, 0, NULL);
+
+ ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, FALSE, NULL);
+ ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context.scissor_rect);
+ ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context.viewport);
+ ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, pso);
+ ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ ID3D12GraphicsCommandList_IASetVertexBuffers(command_list, 0, 1, &vbv);
+ ID3D12GraphicsCommandList_DrawInstanced(command_list, 12, 1, 0, 0);
+
+ transition_resource_state(command_list, context.render_target,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+
+ check_sub_resource_uint(context.render_target, 0, queue, command_list, 0xff00ff00, 0);
+ reset_command_list(command_list, context.allocator);
+ check_sub_resource_uint(context.render_target, 1, queue, command_list, 0xffffffff, 0);
+ reset_command_list(command_list, context.allocator);
+ check_sub_resource_uint(context.render_target, 2, queue, command_list, 0x00000000, 0);
+ reset_command_list(command_list, context.allocator);
+ check_sub_resource_uint(context.render_target, 3, queue, command_list, 0xffffff00, 0);
+
+ ID3D12Resource_Release(vb);
+ ID3D12PipelineState_Release(pso);
+ destroy_test_context(&context);
+}
+
static void test_render_a8(void)
{
static const float black[] = {0.0f, 0.0f, 0.0f, 0.0f};
@@ -17191,5 +17396,6 @@ START_TEST(d3d12)
run_test(test_face_culling);
run_test(test_multithread_command_queue_exec);
run_test(test_geometry_shader);
+ run_test(test_layered_rendering);
run_test(test_render_a8);
}
diff --git a/tests/vkd3d_d3d12_test.h b/tests/vkd3d_d3d12_test.h
index 538479e922c1..b4a9a442a5d2 100644
--- a/tests/vkd3d_d3d12_test.h
+++ b/tests/vkd3d_d3d12_test.h
@@ -313,7 +313,7 @@ static void check_sub_resource_uint_(unsigned int line, ID3D12Resource *texture,
{
struct resource_readback rb;
- get_texture_readback_with_command_list(texture, 0, &rb, queue, command_list);
+ get_texture_readback_with_command_list(texture, sub_resource_idx, &rb, queue, command_list);
check_readback_data_uint_(line, &rb, NULL, expected, max_diff);
release_resource_readback(&rb);
}
@@ -492,7 +492,7 @@ static ID3D12PipelineState *create_pipeline_state_(unsigned int line, ID3D12Devi
struct test_context_desc
{
- unsigned int rt_width, rt_height;
+ unsigned int rt_width, rt_height, rt_array_size;
DXGI_FORMAT rt_format;
unsigned int rt_descriptor_count;
unsigned int root_signature_flags;
@@ -540,7 +540,7 @@ static void create_render_target_(unsigned int line, struct test_context *contex
resource_desc.Alignment = 0;
resource_desc.Width = desc && desc->rt_width ? desc->rt_width : 32;
resource_desc.Height = desc && desc->rt_height ? desc->rt_height : 32;
- resource_desc.DepthOrArraySize = 1;
+ resource_desc.DepthOrArraySize = desc && desc->rt_array_size ? desc->rt_array_size : 1;
resource_desc.MipLevels = 1;
resource_desc.Format = desc && desc->rt_format ? desc->rt_format : DXGI_FORMAT_R8G8B8A8_UNORM;
resource_desc.SampleDesc.Count = 1;
--
2.16.4
June 26, 2018
[PATCH vkd3d 10/12] libs/vkd3d: Add support for 2D array render target views.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/command.c | 41 +++++++++++++++++++++++------------------
libs/vkd3d/resource.c | 8 ++++++--
libs/vkd3d/vkd3d_private.h | 2 ++
3 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 82a99fda2511..ee1d3f6e1018 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1583,7 +1583,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_ClearState(ID3D12GraphicsCom
}
static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
- uint32_t *width, uint32_t *height)
+ uint32_t *width, uint32_t *height, uint32_t *layer_count)
{
struct d3d12_device *device = list->device;
@@ -1591,11 +1591,15 @@ static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
{
*width = list->fb_width;
*height = list->fb_height;
+ if (layer_count)
+ *layer_count = list->fb_layer_count;
}
else
{
*width = device->vk_info.device_limits.maxFramebufferWidth;
*height = device->vk_info.device_limits.maxFramebufferHeight;
+ if (layer_count)
+ *layer_count = 1;
}
}
@@ -1620,8 +1624,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
fb_desc.renderPass = list->state->u.graphics.render_pass;
fb_desc.attachmentCount = list->state->u.graphics.attachment_count;
fb_desc.pAttachments = &list->views[start_idx];
- d3d12_command_list_get_fb_extent(list, &fb_desc.width, &fb_desc.height);
- fb_desc.layers = 1;
+ d3d12_command_list_get_fb_extent(list, &fb_desc.width, &fb_desc.height, &fb_desc.layers);
if ((vr = VK_CALL(vkCreateFramebuffer(device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0)
{
WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr);
@@ -2212,7 +2215,7 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
begin_desc.renderArea.offset.x = 0;
begin_desc.renderArea.offset.y = 0;
d3d12_command_list_get_fb_extent(list,
- &begin_desc.renderArea.extent.width, &begin_desc.renderArea.extent.height);
+ &begin_desc.renderArea.extent.width, &begin_desc.renderArea.extent.height, NULL);
begin_desc.clearValueCount = 0;
begin_desc.pClearValues = NULL;
VK_CALL(vkCmdBeginRenderPass(list->vk_command_buffer, &begin_desc, VK_SUBPASS_CONTENTS_INLINE));
@@ -3438,6 +3441,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
list->fb_width = 0;
list->fb_height = 0;
+ list->fb_layer_count = 0;
for (i = 0; i < render_target_descriptor_count; ++i)
{
if (single_descriptor_handle)
@@ -3448,10 +3452,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
d3d12_command_list_track_resource_usage(list, rtv_desc->resource);
list->views[i + 1] = rtv_desc->vk_view;
- if (rtv_desc->width > list->fb_width)
- list->fb_width = rtv_desc->width;
- if (rtv_desc->height > list->fb_height)
- list->fb_height = rtv_desc->height;
+ list->fb_width = max(list->fb_width, rtv_desc->width);
+ list->fb_height = max(list->fb_height, rtv_desc->height);
+ list->fb_layer_count = max(list->fb_layer_count, rtv_desc->layer_count);
}
if (depth_stencil_descriptor)
@@ -3460,10 +3463,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
d3d12_command_list_track_resource_usage(list, dsv_desc->resource);
- if (dsv_desc->width > list->fb_width)
- list->fb_width = dsv_desc->width;
- if (dsv_desc->height > list->fb_height)
- list->fb_height = dsv_desc->height;
+ list->fb_width = max(list->fb_width, dsv_desc->width);
+ list->fb_height = max(list->fb_height, dsv_desc->height);
+ list->fb_layer_count = max(list->fb_layer_count, 1);
list->views[0] = dsv_desc->vk_view;
}
@@ -3471,9 +3473,10 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
d3d12_command_list_invalidate_current_framebuffer(list);
}
-static void d3d12_command_list_clear(struct d3d12_command_list *list, const struct vkd3d_vk_device_procs *vk_procs,
- const struct VkAttachmentDescription *attachment_desc, const struct VkAttachmentReference *color_reference,
- const struct VkAttachmentReference *ds_reference, VkImageView vk_view, size_t width, size_t height,
+static void d3d12_command_list_clear(struct d3d12_command_list *list,
+ const struct vkd3d_vk_device_procs *vk_procs, const struct VkAttachmentDescription *attachment_desc,
+ const struct VkAttachmentReference *color_reference, const struct VkAttachmentReference *ds_reference,
+ VkImageView vk_view, size_t width, size_t height, unsigned int layer_count,
const union VkClearValue *clear_value, unsigned int rect_count, const D3D12_RECT *rects)
{
struct VkSubpassDescription sub_pass_desc;
@@ -3538,7 +3541,7 @@ static void d3d12_command_list_clear(struct d3d12_command_list *list, const stru
fb_desc.pAttachments = &vk_view;
fb_desc.width = width;
fb_desc.height = height;
- fb_desc.layers = 1;
+ fb_desc.layers = layer_count;
if ((vr = VK_CALL(vkCreateFramebuffer(list->device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0)
{
WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr);
@@ -3615,7 +3618,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearDepthStencilView(ID3D12Gra
ds_reference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
d3d12_command_list_clear(list, &list->device->vk_procs, &attachment_desc, NULL, &ds_reference,
- dsv_desc->vk_view, dsv_desc->width, dsv_desc->height, &clear_value, rect_count, rects);
+ dsv_desc->vk_view, dsv_desc->width, dsv_desc->height, 1, &clear_value, rect_count, rects);
}
static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12GraphicsCommandList *iface,
@@ -3646,7 +3649,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12Gra
color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
d3d12_command_list_clear(list, &list->device->vk_procs, &attachment_desc, &color_reference, NULL,
- rtv_desc->vk_view, rtv_desc->width, rtv_desc->height, &clear_value, rect_count, rects);
+ rtv_desc->vk_view, rtv_desc->width, rtv_desc->height, rtv_desc->layer_count,
+ &clear_value, rect_count, rects);
}
static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID3D12GraphicsCommandList *iface,
@@ -4005,6 +4009,7 @@ static HRESULT d3d12_command_list_init(struct d3d12_command_list *list, struct d
memset(list->views, 0, sizeof(list->views));
list->fb_width = 0;
list->fb_height = 0;
+ list->fb_layer_count = 0;
list->current_framebuffer = VK_NULL_HANDLE;
list->current_pipeline = VK_NULL_HANDLE;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 2ccb84797514..e45c90083229 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1534,6 +1534,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc)
{
const struct vkd3d_format *format;
+ VkImageViewType vk_view_type;
uint32_t miplevel_idx;
d3d12_rtv_desc_destroy(rtv_desc, device);
@@ -1566,13 +1567,16 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
miplevel_idx = desc ? desc->u.Texture2D.MipSlice : 0;
- if (vkd3d_create_texture_view(device, resource, format, VK_IMAGE_VIEW_TYPE_2D,
- miplevel_idx, 1, 0, 1, false, &rtv_desc->vk_view) < 0)
+ vk_view_type = resource->desc.DepthOrArraySize > 1
+ ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D;
+ if (vkd3d_create_texture_view(device, resource, format, vk_view_type,
+ miplevel_idx, 1, 0, VK_REMAINING_ARRAY_LAYERS, false, &rtv_desc->vk_view) < 0)
return;
rtv_desc->format = format->vk_format;
rtv_desc->width = d3d12_resource_desc_get_width(&resource->desc, miplevel_idx);
rtv_desc->height = d3d12_resource_desc_get_height(&resource->desc, miplevel_idx);
+ rtv_desc->layer_count = resource->desc.DepthOrArraySize;
rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
rtv_desc->resource = resource;
}
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 7506471fbe6c..38f0bf38e215 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -287,6 +287,7 @@ struct d3d12_rtv_desc
VkFormat format;
uint64_t width;
unsigned int height;
+ unsigned int layer_count;
VkImageView vk_view;
struct d3d12_resource *resource;
};
@@ -587,6 +588,7 @@ struct d3d12_command_list
VkImageView views[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
unsigned int fb_width;
unsigned int fb_height;
+ unsigned int fb_layer_count;
VkFramebuffer current_framebuffer;
VkPipeline current_pipeline;
--
2.16.4
June 26, 2018
[PATCH vkd3d 09/12] libs/vkd3d-shader: Do not emit output setup for ret in geometry shaders.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 1961ba62f202..a5e51c9643cb 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4541,7 +4541,8 @@ static void vkd3d_dxbc_compiler_emit_return(struct vkd3d_dxbc_compiler *compiler
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- vkd3d_dxbc_compiler_emit_output_setup_invocation(compiler);
+ if (compiler->shader_type != VKD3D_SHADER_TYPE_GEOMETRY)
+ vkd3d_dxbc_compiler_emit_output_setup_invocation(compiler);
vkd3d_spirv_build_op_return(builder);
}
--
2.16.4
June 26, 2018
[PATCH vkd3d 08/12] libs/vkd3d-shader: Generate correct SPIR-V code for arrayed shader inputs.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 41 ++++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 881f8109ea3d..1961ba62f202 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2983,16 +2983,17 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
const struct vkd3d_shader_signature_element *signature_element;
const struct vkd3d_shader_register *reg = &dst->reg;
+ uint32_t type_id, ptr_type_id, float_type_id;
const struct vkd3d_spirv_builtin *builtin;
enum vkd3d_component_type component_type;
uint32_t val_id, input_id, var_id;
- uint32_t type_id, float_type_id;
struct vkd3d_symbol reg_symbol;
SpvStorageClass storage_class;
struct rb_entry *entry = NULL;
bool use_private_var = false;
unsigned int array_size;
unsigned int reg_idx;
+ uint32_t i, index;
assert(!reg->idx[0].rel_addr);
assert(!reg->idx[1].rel_addr);
@@ -3071,22 +3072,36 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
if (use_private_var)
{
type_id = vkd3d_spirv_get_type_id(builder, component_type, input_component_count);
- val_id = vkd3d_spirv_build_op_load(builder, type_id, input_id, SpvMemoryAccessMaskNone);
+ for (i = 0; i < max(array_size, 1); ++i)
+ {
+ struct vkd3d_shader_register dst_reg = *reg;
- if (builtin && builtin->fixup_pfn)
- val_id = builtin->fixup_pfn(compiler, val_id);
+ val_id = input_id;
+ if (array_size)
+ {
+ ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, SpvStorageClassInput, type_id);
+ index = vkd3d_dxbc_compiler_get_constant_uint(compiler, i);
+ val_id = vkd3d_spirv_build_op_in_bounds_access_chain(builder,
+ ptr_type_id, input_id, &index, 1);
+ dst_reg.idx[0].offset = i;
+ }
+ val_id = vkd3d_spirv_build_op_load(builder, type_id, val_id, SpvMemoryAccessMaskNone);
- if (component_type != VKD3D_TYPE_FLOAT)
- {
- float_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, input_component_count);
- val_id = vkd3d_spirv_build_op_bitcast(builder, float_type_id, val_id);
- }
+ if (builtin && builtin->fixup_pfn)
+ val_id = builtin->fixup_pfn(compiler, val_id);
- if (input_component_count != component_count)
- val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
- val_id, VKD3D_TYPE_FLOAT, VKD3D_NO_SWIZZLE, dst->write_mask);
+ if (component_type != VKD3D_TYPE_FLOAT)
+ {
+ float_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, input_component_count);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, float_type_id, val_id);
+ }
- vkd3d_dxbc_compiler_emit_store_reg(compiler, reg, dst->write_mask, val_id);
+ if (input_component_count != component_count)
+ val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
+ val_id, VKD3D_TYPE_FLOAT, VKD3D_NO_SWIZZLE, dst->write_mask);
+
+ vkd3d_dxbc_compiler_emit_store_reg(compiler, &dst_reg, dst->write_mask, val_id);
+ }
}
return input_id;
--
2.16.4
June 26, 2018
[PATCH vkd3d 07/12] libs/vkd3d-shader: Pass register index to vkd3d_find_signature_element_for_reg().
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 28cfb8977ea2..881f8109ea3d 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2949,13 +2949,13 @@ static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(enum vkd3d_shad
static const struct vkd3d_shader_signature_element *vkd3d_find_signature_element_for_reg(
const struct vkd3d_shader_signature *signature, unsigned int *signature_element_index,
- const struct vkd3d_shader_register *reg, DWORD write_mask)
+ unsigned int reg_idx, DWORD write_mask)
{
unsigned int signature_idx;
for (signature_idx = 0; signature_idx < signature->element_count; ++signature_idx)
{
- if (signature->elements[signature_idx].register_index == reg->idx[0].offset
+ if (signature->elements[signature_idx].register_index == reg_idx
&& (signature->elements[signature_idx].mask & 0xff) == write_mask)
{
if (signature_element_index)
@@ -2965,7 +2965,7 @@ static const struct vkd3d_shader_signature_element *vkd3d_find_signature_element
}
FIXME("Could not find shader signature element (register %u, write mask %#x).\n",
- reg->idx[0].offset, write_mask);
+ reg_idx, write_mask);
if (signature_element_index)
*signature_element_index = ~0u;
return NULL;
@@ -3020,7 +3020,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
else
{
signature_element = vkd3d_find_signature_element_for_reg(compiler->input_signature,
- NULL, reg, dst->write_mask);
+ NULL, reg_idx, dst->write_mask);
component_type = signature_element ? signature_element->component_type : VKD3D_TYPE_FLOAT;
input_component_count = component_count;
}
@@ -3164,7 +3164,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *comp
uint32_t id, var_id;
signature_element = vkd3d_find_signature_element_for_reg(compiler->output_signature,
- &signature_idx, reg, dst->write_mask);
+ &signature_idx, reg->idx[0].offset, dst->write_mask);
builtin = vkd3d_get_spirv_builtin(dst->reg.type, sysval);
component_idx = vkd3d_write_mask_get_component_idx(dst->write_mask);
--
2.16.4
June 26, 2018
[PATCH vkd3d 06/12] libs/vkd3d-shader: Simplify vkd3d_dxbc_compiler_emit_input().
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 40 ++++++++++++++++++----------------------
1 file changed, 18 insertions(+), 22 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index f2a1b1141e23..28cfb8977ea2 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2985,7 +2985,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
const struct vkd3d_shader_register *reg = &dst->reg;
const struct vkd3d_spirv_builtin *builtin;
enum vkd3d_component_type component_type;
- uint32_t val_id = 0, input_id, var_id;
+ uint32_t val_id, input_id, var_id;
uint32_t type_id, float_type_id;
struct vkd3d_symbol reg_symbol;
SpvStorageClass storage_class;
@@ -3043,26 +3043,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
vkd3d_spirv_build_op_decorate1(builder, input_id, SpvDecorationComponent, component_idx);
}
- if (component_type != VKD3D_TYPE_FLOAT || component_count != VKD3D_VEC4_SIZE)
- {
- type_id = vkd3d_spirv_get_type_id(builder, component_type, input_component_count);
- val_id = vkd3d_spirv_build_op_load(builder, type_id, input_id, SpvMemoryAccessMaskNone);
-
- if (builtin && builtin->fixup_pfn)
- val_id = builtin->fixup_pfn(compiler, val_id);
-
- if (component_type != VKD3D_TYPE_FLOAT)
- {
- float_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, input_component_count);
- val_id = vkd3d_spirv_build_op_bitcast(builder, float_type_id, val_id);
- }
-
- use_private_var = true;
- }
-
- if (val_id && input_component_count != component_count)
- val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
- val_id, VKD3D_TYPE_FLOAT, VKD3D_NO_SWIZZLE, dst->write_mask);
+ use_private_var = component_type != VKD3D_TYPE_FLOAT || component_count != VKD3D_VEC4_SIZE;
vkd3d_symbol_make_register(®_symbol, reg);
@@ -3089,7 +3070,22 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
if (use_private_var)
{
- assert(val_id);
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, input_component_count);
+ val_id = vkd3d_spirv_build_op_load(builder, type_id, input_id, SpvMemoryAccessMaskNone);
+
+ if (builtin && builtin->fixup_pfn)
+ val_id = builtin->fixup_pfn(compiler, val_id);
+
+ if (component_type != VKD3D_TYPE_FLOAT)
+ {
+ float_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, input_component_count);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, float_type_id, val_id);
+ }
+
+ if (input_component_count != component_count)
+ val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
+ val_id, VKD3D_TYPE_FLOAT, VKD3D_NO_SWIZZLE, dst->write_mask);
+
vkd3d_dxbc_compiler_emit_store_reg(compiler, reg, dst->write_mask, val_id);
}
--
2.16.4
June 26, 2018
[PATCH vkd3d 05/12] libs/vkd3d-shader: Enable "geometry" capability for SpvBuiltInLayer.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index cf4fbf6d7a3a..f2a1b1141e23 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2770,8 +2770,21 @@ static void vkd3d_dxbc_compiler_decorate_builtin(struct vkd3d_dxbc_compiler *com
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL && builtin == SpvBuiltInPosition)
- builtin = SpvBuiltInFragCoord;
+ switch (builtin)
+ {
+ case SpvBuiltInPosition:
+ if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL)
+ builtin = SpvBuiltInFragCoord;
+ break;
+ case SpvBuiltInFragDepth:
+ vkd3d_spirv_enable_depth_replacing(builder);
+ break;
+ case SpvBuiltInLayer:
+ vkd3d_spirv_enable_capability(builder, SpvCapabilityGeometry);
+ break;
+ default:
+ break;
+ }
vkd3d_spirv_build_op_decorate1(builder, target_id, SpvDecorationBuiltIn, builtin);
}
@@ -3228,9 +3241,6 @@ static uint32_t vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *comp
compiler->output_setup_function_id = vkd3d_spirv_alloc_id(builder);
}
- if (builtin && builtin->spirv_builtin == SpvBuiltInFragDepth)
- vkd3d_spirv_enable_depth_replacing(builder);
-
return id;
}
--
2.16.4
June 26, 2018
[PATCH vkd3d 04/12] libs/vkd3d-shader: Do not force input register type to float4.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Produces slightly smaller and cleaner SPIR-V code.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 76 +++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 71db4be6b493..cf4fbf6d7a3a 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2886,26 +2886,51 @@ vkd3d_register_builtins[] =
{VKD3DSPR_DEPTHOUT, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInFragDepth}},
};
-static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(enum vkd3d_shader_register_type reg_type,
+static const struct vkd3d_spirv_builtin *get_spirv_builtin_for_sysval(
enum vkd3d_shader_input_sysval_semantic sysval)
{
unsigned int i;
+ if (!sysval)
+ return NULL;
+
for (i = 0; i < ARRAY_SIZE(vkd3d_system_value_builtins); ++i)
{
if (vkd3d_system_value_builtins[i].sysval == sysval)
return &vkd3d_system_value_builtins[i].builtin;
}
+ FIXME("Unhandled builtin (sysval %#x).\n", sysval);
+
+ return NULL;
+}
+
+static const struct vkd3d_spirv_builtin *get_spirv_builtin_for_register(
+ enum vkd3d_shader_register_type reg_type)
+{
+ unsigned int i;
+
for (i = 0; i < ARRAY_SIZE(vkd3d_register_builtins); ++i)
{
if (vkd3d_register_builtins[i].reg_type == reg_type)
return &vkd3d_register_builtins[i].builtin;
}
- if (sysval != VKD3D_SIV_NONE
- || (reg_type != VKD3DSPR_INPUT && reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_COLOROUT))
- FIXME("Unhandled builtin (register type %#x, semantic %#x).\n", reg_type, sysval);
+ return NULL;
+}
+
+static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(enum vkd3d_shader_register_type reg_type,
+ enum vkd3d_shader_input_sysval_semantic sysval)
+{
+ const struct vkd3d_spirv_builtin *builtin;
+
+ if ((builtin = get_spirv_builtin_for_sysval(sysval)))
+ return builtin;
+ if ((builtin = get_spirv_builtin_for_register(reg_type)))
+ return builtin;
+
+ if (sysval != VKD3D_SIV_NONE || (reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_COLOROUT))
+ FIXME("Unhandled builtin (register type %#x, sysval %#x).\n", reg_type, sysval);
return NULL;
}
@@ -2970,7 +2995,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
reg_idx = reg->idx[0].offset;
}
- builtin = vkd3d_get_spirv_builtin(reg->type, sysval);
+ builtin = get_spirv_builtin_for_sysval(sysval);
component_idx = vkd3d_write_mask_get_component_idx(dst->write_mask);
component_count = vkd3d_write_mask_component_count(dst->write_mask);
@@ -3058,6 +3083,40 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
return input_id;
}
+static void vkd3d_dxbc_compiler_emit_input_register(struct vkd3d_dxbc_compiler *compiler,
+ const struct vkd3d_shader_dst_param *dst)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ const struct vkd3d_shader_register *reg = &dst->reg;
+ const struct vkd3d_spirv_builtin *builtin;
+ struct vkd3d_symbol reg_symbol;
+ uint32_t input_id;
+
+ assert(!reg->idx[0].rel_addr);
+ assert(!reg->idx[1].rel_addr);
+ assert(reg->idx[1].offset == ~0u);
+
+ if (!(builtin = get_spirv_builtin_for_register(reg->type)))
+ {
+ FIXME("Unhandled register %#x.\n", reg->type);
+ return;
+ }
+
+ input_id = vkd3d_dxbc_compiler_emit_variable(compiler,
+ &builder->global_stream, SpvStorageClassInput,
+ builtin->component_type, builtin->component_count);
+ vkd3d_spirv_add_iface_variable(builder, input_id);
+ vkd3d_dxbc_compiler_decorate_builtin(compiler, input_id, builtin->spirv_builtin);
+
+ vkd3d_symbol_make_register(®_symbol, reg);
+ reg_symbol.id = input_id;
+ reg_symbol.info.reg.storage_class = SpvStorageClassInput;
+ reg_symbol.info.reg.component_type = builtin->component_type;
+ reg_symbol.info.reg.write_mask = vkd3d_write_mask_from_component_count(builtin->component_count);
+ vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
+ vkd3d_dxbc_compiler_emit_register_debug_name(builder, input_id, reg);
+}
+
static unsigned int vkd3d_dxbc_compiler_get_output_variable_index(
struct vkd3d_dxbc_compiler *compiler, unsigned int register_idx)
{
@@ -3649,7 +3708,12 @@ static void vkd3d_dxbc_compiler_emit_dcl_tgsm_structured(struct vkd3d_dxbc_compi
static void vkd3d_dxbc_compiler_emit_dcl_input(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_instruction *instruction)
{
- vkd3d_dxbc_compiler_emit_input(compiler, &instruction->declaration.dst, VKD3D_SIV_NONE);
+ const struct vkd3d_shader_dst_param *dst = &instruction->declaration.dst;
+
+ if (dst->reg.type != VKD3DSPR_INPUT)
+ vkd3d_dxbc_compiler_emit_input_register(compiler, dst);
+ else
+ vkd3d_dxbc_compiler_emit_input(compiler, dst, VKD3D_SIV_NONE);
}
static void vkd3d_dxbc_compiler_emit_interpolation_decorations(struct vkd3d_dxbc_compiler *compiler,
--
2.16.4
June 26, 2018
[PATCH vkd3d 03/12] libs/vkd3d-shader: Add initial support for typed registers.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 119 ++++++++++++++++++++++++-------
libs/vkd3d-shader/vkd3d_shader_private.h | 6 ++
2 files changed, 98 insertions(+), 27 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 8f6a833cd313..71db4be6b493 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -1667,6 +1667,8 @@ struct vkd3d_symbol_register_data
{
SpvStorageClass storage_class;
uint32_t member_idx;
+ enum vkd3d_component_type component_type;
+ unsigned int write_mask;
unsigned int structure_stride;
};
@@ -2243,6 +2245,8 @@ struct vkd3d_shader_register_info
{
uint32_t id;
SpvStorageClass storage_class;
+ enum vkd3d_component_type component_type;
+ unsigned int write_mask;
uint32_t member_idx;
unsigned int structure_stride;
};
@@ -2260,6 +2264,8 @@ static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co
assert(reg->idx[0].offset < compiler->temp_count);
register_info->id = compiler->temp_id + reg->idx[0].offset;
register_info->storage_class = SpvStorageClassFunction;
+ register_info->component_type = VKD3D_TYPE_FLOAT;
+ register_info->write_mask = VKD3DSP_WRITEMASK_ALL;
register_info->member_idx = 0;
return true;
}
@@ -2275,6 +2281,8 @@ static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co
symbol = RB_ENTRY_VALUE(entry, struct vkd3d_symbol, entry);
register_info->id = symbol->id;
register_info->storage_class = symbol->info.reg.storage_class;
+ register_info->component_type = symbol->info.reg.component_type;
+ register_info->write_mask = symbol->info.reg.write_mask;
register_info->structure_stride = symbol->info.reg.structure_stride;
register_info->member_idx = symbol->info.reg.member_idx;
@@ -2356,14 +2364,15 @@ static uint32_t vkd3d_dxbc_compiler_get_register_id(struct vkd3d_dxbc_compiler *
}
}
-static uint32_t vkd3d_dxbc_compiler_emit_swizzle(struct vkd3d_dxbc_compiler *compiler,
- uint32_t val_id, enum vkd3d_component_type component_type, DWORD swizzle, DWORD write_mask)
+static uint32_t vkd3d_dxbc_compiler_emit_swizzle_ext(struct vkd3d_dxbc_compiler *compiler,
+ uint32_t val_id, unsigned int val_write_mask, enum vkd3d_component_type component_type,
+ unsigned int swizzle, unsigned int write_mask)
{
+ unsigned int i, component_idx, component_count, val_component_count;
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- unsigned int i, component_idx, component_count;
uint32_t type_id, components[VKD3D_VEC4_SIZE];
- if (swizzle == VKD3D_NO_SWIZZLE && write_mask == VKD3DSP_WRITEMASK_ALL)
+ if (swizzle == VKD3D_NO_SWIZZLE && write_mask == val_write_mask)
return val_id;
component_count = vkd3d_write_mask_component_count(write_mask);
@@ -2376,6 +2385,20 @@ static uint32_t vkd3d_dxbc_compiler_emit_swizzle(struct vkd3d_dxbc_compiler *com
return vkd3d_spirv_build_op_composite_extract1(builder, type_id, val_id, component_idx);
}
+ val_component_count = vkd3d_write_mask_component_count(val_write_mask);
+ if (val_component_count == 1)
+ {
+ for (i = 0, component_idx = 0; i < VKD3D_VEC4_SIZE; ++i)
+ {
+ if (write_mask & (VKD3DSP_WRITEMASK_0 << i))
+ {
+ assert(VKD3DSP_WRITEMASK_0 << vkd3d_swizzle_get_component(swizzle, i) == val_write_mask);
+ components[component_idx++] = val_id;
+ }
+ }
+ return vkd3d_spirv_build_op_composite_construct(builder, type_id, components, component_count);
+ }
+
for (i = 0, component_idx = 0; i < VKD3D_VEC4_SIZE; ++i)
{
if (write_mask & (VKD3DSP_WRITEMASK_0 << i))
@@ -2385,6 +2408,13 @@ static uint32_t vkd3d_dxbc_compiler_emit_swizzle(struct vkd3d_dxbc_compiler *com
type_id, val_id, val_id, components, component_count);
}
+static uint32_t vkd3d_dxbc_compiler_emit_swizzle(struct vkd3d_dxbc_compiler *compiler,
+ uint32_t val_id, enum vkd3d_component_type component_type, DWORD swizzle, DWORD write_mask)
+{
+ return vkd3d_dxbc_compiler_emit_swizzle_ext(compiler,
+ val_id, VKD3DSP_WRITEMASK_ALL, component_type, swizzle, write_mask);
+}
+
static uint32_t vkd3d_dxbc_compiler_emit_load_constant(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_register *reg, DWORD swizzle, DWORD write_mask)
{
@@ -2416,36 +2446,44 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_scalar(struct vkd3d_dxbc_compiler
const struct vkd3d_shader_register *reg, DWORD swizzle, DWORD write_mask)
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, ptr_type_id, indexes[1], chain_id, val_id;
+ uint32_t type_id, ptr_type_id, indexes[1], reg_id, val_id;
+ unsigned int component_idx, reg_component_count;
struct vkd3d_shader_register_info reg_info;
- unsigned int component_idx;
+ enum vkd3d_component_type component_type;
assert(reg->type != VKD3DSPR_IMMCONST);
assert(vkd3d_write_mask_component_count(write_mask) == 1);
component_idx = vkd3d_write_mask_get_component_idx(write_mask);
component_idx = vkd3d_swizzle_get_component(swizzle, component_idx);
+ component_type = vkd3d_component_type_from_data_type(reg->data_type);
if (!vkd3d_dxbc_compiler_get_register_info(compiler, reg, ®_info))
{
- type_id = vkd3d_spirv_get_type_id(builder,
- vkd3d_component_type_from_data_type(reg->data_type), 1);
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
return vkd3d_spirv_build_op_undef(builder, &builder->global_stream, type_id);
}
vkd3d_dxbc_compiler_emit_dereference_register(compiler, reg, ®_info);
+ reg_component_count = vkd3d_write_mask_component_count(reg_info.write_mask);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, 1);
- ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, reg_info.storage_class, type_id);
- indexes[0] = vkd3d_dxbc_compiler_get_constant_uint(compiler, component_idx);
- chain_id = vkd3d_spirv_build_op_in_bounds_access_chain(builder,
- ptr_type_id, reg_info.id, indexes, ARRAY_SIZE(indexes));
+ if (component_idx > reg_component_count)
+ ERR("Invalid component_idx for register %#x, %u.\n", reg->type, reg->idx[0].offset);
- val_id = vkd3d_spirv_build_op_load(builder, type_id, chain_id, SpvMemoryAccessMaskNone);
+ type_id = vkd3d_spirv_get_type_id(builder, reg_info.component_type, 1);
+ reg_id = reg_info.id;
+ if (reg_component_count != 1)
+ {
+ ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, reg_info.storage_class, type_id);
+ indexes[0] = vkd3d_dxbc_compiler_get_constant_uint(compiler, component_idx);
+ reg_id = vkd3d_spirv_build_op_in_bounds_access_chain(builder,
+ ptr_type_id, reg_id, indexes, ARRAY_SIZE(indexes));
+ }
- if (reg->data_type != VKD3D_DATA_FLOAT)
+ val_id = vkd3d_spirv_build_op_load(builder, type_id, reg_id, SpvMemoryAccessMaskNone);
+
+ if (component_type != reg_info.component_type)
{
- type_id = vkd3d_spirv_get_type_id(builder,
- vkd3d_component_type_from_data_type(reg->data_type), 1);
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
}
@@ -2456,8 +2494,10 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_reg(struct vkd3d_dxbc_compiler *co
const struct vkd3d_shader_register *reg, DWORD swizzle, DWORD write_mask)
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t src_id, type_id, val_id;
+ struct vkd3d_shader_register_info reg_info;
+ enum vkd3d_component_type component_type;
unsigned int component_count;
+ uint32_t type_id, val_id;
if (reg->type == VKD3DSPR_IMMCONST)
return vkd3d_dxbc_compiler_emit_load_constant(compiler, reg, swizzle, write_mask);
@@ -2466,17 +2506,24 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_reg(struct vkd3d_dxbc_compiler *co
if (component_count == 1)
return vkd3d_dxbc_compiler_emit_load_scalar(compiler, reg, swizzle, write_mask);
- src_id = vkd3d_dxbc_compiler_get_register_id(compiler, reg);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, VKD3D_VEC4_SIZE);
- val_id = vkd3d_spirv_build_op_load(builder, type_id, src_id, SpvMemoryAccessMaskNone);
+ component_type = vkd3d_component_type_from_data_type(reg->data_type);
+ if (!vkd3d_dxbc_compiler_get_register_info(compiler, reg, ®_info))
+ {
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
+ return vkd3d_spirv_build_op_undef(builder, &builder->global_stream, type_id);
+ }
+ vkd3d_dxbc_compiler_emit_dereference_register(compiler, reg, ®_info);
- val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
- val_id, VKD3D_TYPE_FLOAT, swizzle, write_mask);
+ type_id = vkd3d_spirv_get_type_id(builder,
+ reg_info.component_type, vkd3d_write_mask_component_count(reg_info.write_mask));
+ val_id = vkd3d_spirv_build_op_load(builder, type_id, reg_info.id, SpvMemoryAccessMaskNone);
- if (reg->data_type != VKD3D_DATA_FLOAT)
+ val_id = vkd3d_dxbc_compiler_emit_swizzle_ext(compiler,
+ val_id, reg_info.write_mask, reg_info.component_type, swizzle, write_mask);
+
+ if (component_type != reg_info.component_type)
{
- type_id = vkd3d_spirv_get_type_id(builder,
- vkd3d_component_type_from_data_type(reg->data_type), component_count);
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
}
@@ -2995,6 +3042,8 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
{
reg_symbol.id = var_id;
reg_symbol.info.reg.storage_class = storage_class;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_FLOAT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_ALL;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
vkd3d_dxbc_compiler_emit_register_debug_name(builder, var_id, reg);
@@ -3105,6 +3154,8 @@ static uint32_t vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *comp
{
reg_symbol.id = var_id;
reg_symbol.info.reg.storage_class = storage_class;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_FLOAT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_ALL;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
vkd3d_dxbc_compiler_emit_register_debug_name(builder, var_id, reg);
@@ -3221,6 +3272,8 @@ static void vkd3d_dxbc_compiler_emit_push_constant_buffers(struct vkd3d_dxbc_com
reg_symbol.id = var_id;
reg_symbol.info.reg.storage_class = storage_class;
reg_symbol.info.reg.member_idx = j;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_FLOAT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_ALL;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
++j;
@@ -3281,6 +3334,8 @@ static void vkd3d_dxbc_compiler_emit_dcl_constant_buffer(struct vkd3d_dxbc_compi
reg_symbol.id = var_id;
reg_symbol.info.reg.storage_class = storage_class;
reg_symbol.info.reg.member_idx = 0;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_FLOAT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_ALL;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
}
@@ -3314,6 +3369,8 @@ static void vkd3d_dxbc_compiler_emit_dcl_immediate_constant_buffer(struct vkd3d_
vkd3d_symbol_make_register(®_symbol, ®);
reg_symbol.id = icb_id;
reg_symbol.info.reg.storage_class = SpvStorageClassPrivate;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_FLOAT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_ALL;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
}
@@ -3566,6 +3623,8 @@ static void vkd3d_dxbc_compiler_emit_workgroup_memory(struct vkd3d_dxbc_compiler
reg_symbol.id = var_id;
reg_symbol.info.reg.storage_class = storage_class;
reg_symbol.info.reg.member_idx = 0;
+ reg_symbol.info.reg.component_type = VKD3D_TYPE_UINT;
+ reg_symbol.info.reg.write_mask = VKD3DSP_WRITEMASK_0;
reg_symbol.info.reg.structure_stride = structure_stride;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
}
@@ -3959,13 +4018,19 @@ static void vkd3d_dxbc_compiler_emit_mov(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_dst_param *dst = instruction->dst;
const struct vkd3d_shader_src_param *src = instruction->src;
uint32_t val_id, dst_val_id, type_id, dst_id, src_id;
+ struct vkd3d_shader_register_info reg_info;
uint32_t components[VKD3D_VEC4_SIZE];
unsigned int i, component_count;
component_count = vkd3d_write_mask_component_count(dst->write_mask);
+ memset(®_info, 0, sizeof(reg_info));
+ if (src->reg.type != VKD3DSPR_IMMCONST)
+ vkd3d_dxbc_compiler_get_register_info(compiler, &src->reg, ®_info);
+
if (component_count == 1 || component_count == VKD3D_VEC4_SIZE
- || dst->modifiers || src->modifiers || src->reg.type == VKD3DSPR_IMMCONST)
+ || dst->modifiers || src->modifiers || src->reg.type == VKD3DSPR_IMMCONST
+ || reg_info.component_type != VKD3D_TYPE_FLOAT || reg_info.write_mask != VKD3DSP_WRITEMASK_ALL)
{
val_id = vkd3d_dxbc_compiler_emit_load_src(compiler, src, dst->write_mask);
vkd3d_dxbc_compiler_emit_store_dst(compiler, dst, val_id);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 7fc42627f820..9eb2c126332d 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -872,6 +872,12 @@ static inline unsigned int vkd3d_write_mask_component_count(DWORD write_mask)
return count;
}
+static inline unsigned int vkd3d_write_mask_from_component_count(unsigned int component_count)
+{
+ assert(component_count <= 4);
+ return (VKD3DSP_WRITEMASK_0 << component_count) - 1;
+}
+
static inline unsigned int vkd3d_swizzle_get_component(DWORD swizzle,
unsigned int idx)
{
--
2.16.4
June 26, 2018
[PATCH vkd3d 02/12] libs/vkd3d-shader: Do not generate code in vkd3d_dxbc_compiler_get_register_info().
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 27 ++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 289797de9f01..8f6a833cd313 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2243,18 +2243,15 @@ struct vkd3d_shader_register_info
{
uint32_t id;
SpvStorageClass storage_class;
+ uint32_t member_idx;
unsigned int structure_stride;
};
static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_register *reg, struct vkd3d_shader_register_info *register_info)
{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
struct vkd3d_symbol reg_symbol, *symbol;
- uint32_t type_id, ptr_type_id;
- uint32_t index_count = 0;
struct rb_entry *entry;
- uint32_t indexes[2];
assert(reg->type != VKD3DSPR_IMMCONST);
@@ -2263,6 +2260,7 @@ static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co
assert(reg->idx[0].offset < compiler->temp_count);
register_info->id = compiler->temp_id + reg->idx[0].offset;
register_info->storage_class = SpvStorageClassFunction;
+ register_info->member_idx = 0;
return true;
}
@@ -2278,11 +2276,23 @@ static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co
register_info->id = symbol->id;
register_info->storage_class = symbol->info.reg.storage_class;
register_info->structure_stride = symbol->info.reg.structure_stride;
+ register_info->member_idx = symbol->info.reg.member_idx;
+
+ return true;
+}
+
+static void vkd3d_dxbc_compiler_emit_dereference_register(struct vkd3d_dxbc_compiler *compiler,
+ const struct vkd3d_shader_register *reg, struct vkd3d_shader_register_info *register_info)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id, ptr_type_id;
+ unsigned int index_count = 0;
+ uint32_t indexes[2];
if (reg->type == VKD3DSPR_CONSTBUFFER)
{
assert(!reg->idx[0].rel_addr);
- indexes[index_count++] = vkd3d_dxbc_compiler_get_constant_uint(compiler, symbol->info.reg.member_idx);
+ indexes[index_count++] = vkd3d_dxbc_compiler_get_constant_uint(compiler, register_info->member_idx);
indexes[index_count++] = vkd3d_dxbc_compiler_emit_register_addressing(compiler, ®->idx[1]);
}
else if (reg->type == VKD3DSPR_IMMCONSTBUFFER)
@@ -2306,8 +2316,6 @@ static bool vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co
register_info->id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id,
register_info->id, indexes, index_count);
}
-
- return true;
}
static uint32_t vkd3d_dxbc_compiler_get_register_id(struct vkd3d_dxbc_compiler *compiler,
@@ -2331,7 +2339,10 @@ static uint32_t vkd3d_dxbc_compiler_get_register_id(struct vkd3d_dxbc_compiler *
case VKD3DSPR_LOCALTHREADINDEX:
case VKD3DSPR_THREADGROUPID:
if (vkd3d_dxbc_compiler_get_register_info(compiler, reg, ®ister_info))
+ {
+ vkd3d_dxbc_compiler_emit_dereference_register(compiler, reg, ®ister_info);
return register_info.id;
+ }
return vkd3d_dxbc_compiler_emit_variable(compiler, &builder->global_stream,
SpvStorageClassPrivate, VKD3D_TYPE_FLOAT, VKD3D_VEC4_SIZE);
case VKD3DSPR_IMMCONST:
@@ -2421,6 +2432,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_scalar(struct vkd3d_dxbc_compiler
vkd3d_component_type_from_data_type(reg->data_type), 1);
return vkd3d_spirv_build_op_undef(builder, &builder->global_stream, type_id);
}
+ vkd3d_dxbc_compiler_emit_dereference_register(compiler, reg, ®_info);
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, 1);
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, reg_info.storage_class, type_id);
@@ -2565,6 +2577,7 @@ static void vkd3d_dxbc_compiler_emit_store_scalar(struct vkd3d_dxbc_compiler *co
if (!vkd3d_dxbc_compiler_get_register_info(compiler, reg, ®_info))
return;
+ vkd3d_dxbc_compiler_emit_dereference_register(compiler, reg, ®_info);
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, 1);
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, reg_info.storage_class, type_id);
--
2.16.4
June 26, 2018
[PATCH vkd3d 01/12] libs/vkd3d-shader: Split SPIR-V built-ins table into two tables.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 75 +++++++++++++++++++++++++++--------------------
1 file changed, 43 insertions(+), 32 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 10806a5a9a2f..289797de9f01 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2747,7 +2747,7 @@ typedef uint32_t (*vkd3d_spirv_builtin_fixup_pfn)(struct vkd3d_dxbc_compiler *co
uint32_t val_id);
/* Substitute "InstanceIndex - BaseInstance" for SV_InstanceID. */
-static uint32_t vkd3d_spirv_instance_id_fixup(struct vkd3d_dxbc_compiler *compiler,
+static uint32_t sv_instance_id_fixup(struct vkd3d_dxbc_compiler *compiler,
uint32_t instance_index_id)
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
@@ -2773,47 +2773,57 @@ static uint32_t vkd3d_spirv_instance_id_fixup(struct vkd3d_dxbc_compiler *compil
type_id, instance_index_id, base_instance_id);
}
-static uint32_t vkd3d_spirv_front_facing_fixup(struct vkd3d_dxbc_compiler *compiler,
+static uint32_t sv_front_face_fixup(struct vkd3d_dxbc_compiler *compiler,
uint32_t front_facing_id)
{
return vkd3d_dxbc_compiler_emit_bool_to_int(compiler, 1, front_facing_id);
}
-/*
- * The following table is based on the "14.6. Built-In Variables" section from
- * the Vulkan spec.
- */
-static const struct vkd3d_spirv_builtin
+struct vkd3d_spirv_builtin
{
- enum vkd3d_shader_input_sysval_semantic sysval;
- enum vkd3d_shader_register_type reg_type;
-
enum vkd3d_component_type component_type;
unsigned int component_count;
SpvBuiltIn spirv_builtin;
vkd3d_spirv_builtin_fixup_pfn fixup_pfn;
+};
+
+/*
+ * The following tables are based on the "14.6. Built-In Variables" section
+ * from the Vulkan spec.
+ */
+static const struct
+{
+ enum vkd3d_shader_input_sysval_semantic sysval;
+ struct vkd3d_spirv_builtin builtin;
}
-vkd3d_spirv_builtin_table[] =
+vkd3d_system_value_builtins[] =
{
- {VKD3D_SIV_NONE, VKD3DSPR_THREADID, VKD3D_TYPE_INT, 3, SpvBuiltInGlobalInvocationId},
- {VKD3D_SIV_NONE, VKD3DSPR_LOCALTHREADID, VKD3D_TYPE_INT, 3, SpvBuiltInLocalInvocationId},
- {VKD3D_SIV_NONE, VKD3DSPR_LOCALTHREADINDEX, VKD3D_TYPE_INT, 1, SpvBuiltInLocalInvocationIndex},
- {VKD3D_SIV_NONE, VKD3DSPR_THREADGROUPID, VKD3D_TYPE_INT, 3, SpvBuiltInWorkgroupId},
+ {VKD3D_SIV_POSITION, {VKD3D_TYPE_FLOAT, 4, SpvBuiltInPosition}},
+ {VKD3D_SIV_VERTEX_ID, {VKD3D_TYPE_INT, 1, SpvBuiltInVertexIndex}},
+ {VKD3D_SIV_INSTANCE_ID, {VKD3D_TYPE_INT, 1, SpvBuiltInInstanceIndex, sv_instance_id_fixup}},
- {VKD3D_SIV_NONE, VKD3DSPR_GSINSTID, VKD3D_TYPE_INT, 1, SpvBuiltInInvocationId},
- {VKD3D_SIV_NONE, VKD3DSPR_OUTPOINTID, VKD3D_TYPE_INT, 1, SpvBuiltInInvocationId},
+ {VKD3D_SIV_RENDER_TARGET_ARRAY_INDEX, {VKD3D_TYPE_INT, 1, SpvBuiltInLayer}},
- {VKD3D_SIV_NONE, VKD3DSPR_TESSCOORD, VKD3D_TYPE_FLOAT, 3, SpvBuiltInTessCoord},
-
- {VKD3D_SIV_NONE, VKD3DSPR_DEPTHOUT, VKD3D_TYPE_FLOAT, 1, SpvBuiltInFragDepth},
+ {VKD3D_SIV_IS_FRONT_FACE, {VKD3D_TYPE_BOOL, 1, SpvBuiltInFrontFacing, sv_front_face_fixup}},
+};
+static const struct
+{
+ enum vkd3d_shader_register_type reg_type;
+ struct vkd3d_spirv_builtin builtin;
+}
+vkd3d_register_builtins[] =
+{
+ {VKD3DSPR_THREADID, {VKD3D_TYPE_INT, 3, SpvBuiltInGlobalInvocationId}},
+ {VKD3DSPR_LOCALTHREADID, {VKD3D_TYPE_INT, 3, SpvBuiltInLocalInvocationId}},
+ {VKD3DSPR_LOCALTHREADINDEX, {VKD3D_TYPE_INT, 1, SpvBuiltInLocalInvocationIndex}},
+ {VKD3DSPR_THREADGROUPID, {VKD3D_TYPE_INT, 3, SpvBuiltInWorkgroupId}},
- {VKD3D_SIV_POSITION, ~0u, VKD3D_TYPE_FLOAT, 4, SpvBuiltInPosition},
- {VKD3D_SIV_VERTEX_ID, ~0u, VKD3D_TYPE_INT, 1, SpvBuiltInVertexIndex},
- {VKD3D_SIV_INSTANCE_ID, ~0u, VKD3D_TYPE_INT, 1, SpvBuiltInInstanceIndex, vkd3d_spirv_instance_id_fixup},
+ {VKD3DSPR_GSINSTID, {VKD3D_TYPE_INT, 1, SpvBuiltInInvocationId}},
+ {VKD3DSPR_OUTPOINTID, {VKD3D_TYPE_INT, 1, SpvBuiltInInvocationId}},
- {VKD3D_SIV_RENDER_TARGET_ARRAY_INDEX, ~0u, VKD3D_TYPE_INT, 1, SpvBuiltInLayer},
+ {VKD3DSPR_TESSCOORD, {VKD3D_TYPE_FLOAT, 3, SpvBuiltInTessCoord}},
- {VKD3D_SIV_IS_FRONT_FACE, ~0u, VKD3D_TYPE_BOOL, 1, SpvBuiltInFrontFacing, vkd3d_spirv_front_facing_fixup},
+ {VKD3DSPR_DEPTHOUT, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInFragDepth}},
};
static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(enum vkd3d_shader_register_type reg_type,
@@ -2821,15 +2831,16 @@ static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(enum vkd3d_shad
{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(vkd3d_spirv_builtin_table); ++i)
+ for (i = 0; i < ARRAY_SIZE(vkd3d_system_value_builtins); ++i)
{
- const struct vkd3d_spirv_builtin* current = &vkd3d_spirv_builtin_table[i];
-
- if (current->sysval == VKD3D_SIV_NONE && current->reg_type == reg_type)
- return current;
+ if (vkd3d_system_value_builtins[i].sysval == sysval)
+ return &vkd3d_system_value_builtins[i].builtin;
+ }
- if (current->reg_type == ~0u && current->sysval == sysval)
- return current;
+ for (i = 0; i < ARRAY_SIZE(vkd3d_register_builtins); ++i)
+ {
+ if (vkd3d_register_builtins[i].reg_type == reg_type)
+ return &vkd3d_register_builtins[i].builtin;
}
if (sysval != VKD3D_SIV_NONE
--
2.16.4
June 26, 2018
[PATCH] testbot/web: Adjust the GetFile MIME type based on Step->FileType.
by Francois Gouget
This lets the browser offer to open the patches in a text editor instead
of systematically suggesting to save them to disk.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
Not an urgent or very important patch but I believe it will make some
people pretty happy.
testbot/web/GetFile.pl | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/testbot/web/GetFile.pl b/testbot/web/GetFile.pl
index 7e274a8bf..1fe140788 100644
--- a/testbot/web/GetFile.pl
+++ b/testbot/web/GetFile.pl
@@ -84,9 +84,11 @@ sub GetFile($$$)
# HTTP/1.0
$Request->headers_out->add("Pragma", "no-cache");
-
- # Binary file
- $Request->content_type("application/octet-stream");
+
+ # Text or binary file
+ my $MIME = $Step->FileType eq "patchdlls" ? "text/plain" :
+ "application/octet-stream";
+ $Request->content_type($MIME);
$Request->headers_out->add("Content-Disposition",
'attachment; filename="' . $Step->FileName . '"');
--
2.18.0
June 26, 2018
Re: [PATCH 3/5] devenum: Make some variables static.
by Alexandre Julliard
Zebediah Figura <z.figura12(a)gmail.com> writes:
> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> ---
> dlls/devenum/createdevenum.c | 14 ++++++--------
> dlls/devenum/devenum_main.c | 13 ++++---------
> dlls/devenum/devenum_private.h | 4 +---
> dlls/devenum/mediacatenum.c | 4 +++-
> 4 files changed, 14 insertions(+), 21 deletions(-)
It doesn't work here:
../../../tools/runtest -q -P wine -T ../../.. -M devenum.dll -p devenum_test.exe.so devenum && touch devenum.ok
devenum.c:585: Test failed: filter should be registered
devenum.c:592: Test failed: Read failed: 0x80070002
devenum.c:595: Test failed: expected L"{DEADBEEF-CF51-43E6-B6C5-299EA8B6B591}", got L"\58e1\e0f1\cb04\11d0\4ebd\a000\11c9\86ce\2a92\37e9\d9aa\11d2\84bf\f28e\55b1\ed5a\29d1\e306\27e5\11ce\5d87\6000\b78c\6680\29d2\e306\27e5\11ce\5d87\6000\b78c\6680\9faf\0558\c356\11ce\01bf\aa00\5500\5a59\ca52\2ca8\3c3f\11d2\3db7\c000\b64f\3dbd\a762\33d9\90c8\11d0\43bd\a000\11c9\86ce\8d32\a5ea\253d\11d1\f1b3"...
devenum.c:600: Test failed: Read failed: 0x80070002
devenum.c:601: Test failed: expected L"{DEADBEEF-CF51-43E6-B6C5-299EA8B6B591}", got L"\58e1\e0f1\cb04\11d0\4ebd\a000\11c9\86ce\2a92\37e9\d9aa\11d2\84bf\f28e\55b1\ed5a\29d1\e306\27e5\11ce\5d87\6000\b78c\6680\29d2\e306\27e5\11ce\5d87\6000\b78c\6680\9faf\0558\c356\11ce\01bf\aa00\5500\5a59\ca52\2ca8\3c3f\11d2\3db7\c000\b64f\3dbd\a762\33d9\90c8\11d0\43bd\a000\11c9\86ce\8d32\a5ea\253d\11d1\f1b3"...
Makefile:183: recipe for target 'devenum.ok' failed
make: *** [devenum.ok] Error 5
--
Alexandre Julliard
julliard(a)winehq.org
June 26, 2018
[PATCH 7/7] testbot/WineSendLog: Fix detection of new errors.
by Francois Gouget
Comparing the compilation log with the reference WineTest report makes
no sense. So handle the WineTest reports and task logs separately.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineSendLog.pl | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index 53b184cff..29da4a04d 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -439,13 +439,23 @@ EOF
my $TaskDir = $StepTask->GetTaskDir();
my ($BotFailure, $MessagesFromErr) = CheckErrLog("$TaskDir/err");
- if (! $BotFailure)
+ if ($BotFailure)
+ {
+ # TestBot errors are not the developer's fault and prevent us from doing
+ # any meaningful analysis. So skip.
+ Error "A TestBot error was found in $TaskDir/err\n";
+ next;
+ }
+
+ my $MessagesFromLog = "";
+ my $LogFiles = GetLogFileNames($TaskDir);
+ my $LogName = $LogFiles->[0] || "log";
+ if ($LogName =~ /\.report$/)
{
$StepTask->FileName =~ m/^(.*)_test(64)?\.exe$/;
my ($BaseName, $Bits) = ($1, $2 || "32");
my $LatestName = "$DataDir/latest/" . $StepTask->VM->Name . "_$Bits";
my ($LatestBotFailure, $Dummy) = CheckErrLog("$LatestName.err");
- my $MessagesFromLog = "";
if (! $LatestBotFailure)
{
if (defined($StepTask->CmdLineArg))
@@ -463,15 +473,20 @@ EOF
{
Error "BotFailure found in ${LatestName}.err\n";
}
- if ($MessagesFromErr || $MessagesFromLog)
+ }
+ elsif (open(my $LogFile, "<", "$TaskDir/$LogName"))
+ {
+ foreach my $Line (<$LogFile>)
{
- $Messages .= "\n=== " . $StepTask->GetTitle() . " ===\n" .
- $MessagesFromLog . $MessagesFromErr;
+ my $Category = GetLogLineCategory($Line);
+ $MessagesFromLog .= $Line if ($Category eq "error");
}
+ close($LogFile);
}
- elsif ($BotFailure)
+ if ($MessagesFromErr || $MessagesFromLog)
{
- Error "BotFailure found in $TaskDir/err\n";
+ $Messages .= "\n=== " . $StepTask->GetTitle() . " ===\n" .
+ $MessagesFromLog . $MessagesFromErr;
}
}
--
2.18.0
June 26, 2018
[PATCH 6/7] testbot/WineSendLog: Use LogUtils to get the report / log filename.
by Francois Gouget
Currently we will either have a test report or a task log file so it's
ok to only take into account the first file returned by
GetLogFileNames().
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineSendLog.pl | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index 33978095e..53b184cff 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -272,11 +272,13 @@ EOF
foreach my $Key (@SortedKeys)
{
my $StepTask = $StepsTasks->GetItem($Key);
+ my $TaskDir = $StepTask->GetTaskDir();
print SENDMAIL "\n=== ", $StepTask->GetTitle(), " ===\n";
- my $TaskDir = $StepTask->GetTaskDir();
- if (open LOGFILE, "<$TaskDir/log")
+ my $LogFiles = GetLogFileNames($TaskDir);
+ my $LogName = $LogFiles->[0] || "log";
+ if (open LOGFILE, "<$TaskDir/$LogName")
{
my $HasLogEntries = !1;
my $PrintedSomething = !1;
@@ -376,6 +378,7 @@ EOF
foreach my $Key (@SortedKeys)
{
my $StepTask = $StepsTasks->GetItem($Key);
+ my $TaskDir = $StepTask->GetTaskDir();
print SENDMAIL <<"EOF";
--$PART_BOUNDARY
@@ -387,9 +390,10 @@ EOF
$StepTask->VM->Name, ".log\n\n";
print SENDMAIL "Not dumping logs in debug mode\n" if ($Debug);
+ my $LogFiles = GetLogFileNames($TaskDir);
+ my $LogName = $LogFiles->[0] || "log";
my $PrintSeparator = !1;
- my $TaskDir = $StepTask->GetTaskDir();
- if (open LOGFILE, "<$TaskDir/log")
+ if (open LOGFILE, "<$TaskDir/$LogName")
{
my $Line;
while (defined($Line = <LOGFILE>))
@@ -432,8 +436,8 @@ EOF
foreach my $Key (@FailureKeys)
{
my $StepTask = $StepsTasks->GetItem($Key);
-
my $TaskDir = $StepTask->GetTaskDir();
+
my ($BotFailure, $MessagesFromErr) = CheckErrLog("$TaskDir/err");
if (! $BotFailure)
{
@@ -449,7 +453,9 @@ EOF
# Filter out failures that happened in the full test suite:
# the test suite is run against code which is already in Wine
# so any failure it reported is not caused by this patch.
- $MessagesFromLog = CompareLogs("$LatestName.log", "$TaskDir/log",
+ my $LogFiles = GetLogFileNames($TaskDir);
+ my $LogName = $LogFiles->[0] || "log";
+ $MessagesFromLog = CompareLogs("$LatestName.log", "$TaskDir/$LogName",
$BaseName, $StepTask->CmdLineArg);
}
}
@@ -537,11 +543,14 @@ EOF
foreach my $Key (@SortedKeys)
{
my $StepTask = $StepsTasks->GetItem($Key);
+ my $TaskDir = $StepTask->GetTaskDir();
+
print $result "\n=== ", $StepTask->GetTitle(), " ===\n";
+ my $LogFiles = GetLogFileNames($TaskDir);
+ my $LogName = $LogFiles->[0] || "log";
my $PrintSeparator = !1;
- my $TaskDir = $StepTask->GetTaskDir();
- if (open(my $logfile, "<", "$TaskDir/log"))
+ if (open(my $logfile, "<", "$TaskDir/$LogName"))
{
my $Line;
while (defined($Line = <$logfile>))
--
2.18.0
June 26, 2018
[PATCH 5/7] testbot/WineSendLog: Use LogUtils to identify errors in the log files.
by Francois Gouget
GetLogLineCategory()'s error detection is much more complete and this
avoids code duplication.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineSendLog.pl | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index 2f097796e..33978095e 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -45,6 +45,7 @@ use Algorithm::Diff;
use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::Log;
+use WineTestBot::LogUtils;
use WineTestBot::StepsTasks;
@@ -290,8 +291,8 @@ EOF
{
$CurrentDll = $1;
}
- if ($Line =~ m/: Test failed: / || $Line =~ m/ done \(258\)/ ||
- $Line =~ m/: unhandled exception [0-9a-fA-F]{8} at /)
+ my $Category = GetLogLineCategory($Line);
+ if ($Category eq "error")
{
if ($PrintedDll ne $CurrentDll)
{
--
2.18.0
June 26, 2018
[PATCH 4/7] testbot: Avoid duplicating the part boundary uuid.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineSendLog.pl | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index ed3453b80..2f097796e 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -48,6 +48,9 @@ use WineTestBot::Log;
use WineTestBot::StepsTasks;
+my $PART_BOUNDARY = "==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47==";
+
+
#
# Logging and error handling helpers
#
@@ -241,9 +244,9 @@ sub SendLog($)
}
print SENDMAIL <<"EOF";
MIME-Version: 1.0
-Content-Type: multipart/mixed; boundary="==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47=="
+Content-Type: multipart/mixed; boundary="$PART_BOUNDARY"
---==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47==
+--$PART_BOUNDARY
Content-Type: text/plain; charset="UTF-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
@@ -374,7 +377,7 @@ EOF
my $StepTask = $StepsTasks->GetItem($Key);
print SENDMAIL <<"EOF";
---==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47==
+--$PART_BOUNDARY
Content-Type: text/plain; charset="UTF-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
@@ -414,7 +417,7 @@ EOF
}
}
- print SENDMAIL "--==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47==--\n";
+ print SENDMAIL "--$PART_BOUNDARY--\n";
close(SENDMAIL);
# This is all for jobs submitted from the website
--
2.18.0
June 26, 2018
[PATCH 3/7] testbot/WineSendLog: Add proper command line handling and options.
by Francois Gouget
When run in --debug mode WineSendLog prints the emails it would normally
send instead of piping them to sendmail.
Also the script now prints the error messages to stderr by default to
make it easier to figure things out when running it on the command
line. The --log-only option can be used when that's not desired.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/Engine.pl | 2 +-
testbot/bin/WineSendLog.pl | 193 +++++++++++++++++++++++++++++++------
2 files changed, 164 insertions(+), 31 deletions(-)
diff --git a/testbot/bin/Engine.pl b/testbot/bin/Engine.pl
index ce3509440..464b6db45 100755
--- a/testbot/bin/Engine.pl
+++ b/testbot/bin/Engine.pl
@@ -320,7 +320,7 @@ sub HandleJobStatusChange($$$)
CloseAllDBBackEnds();
WineTestBot::Log::SetupRedirects();
- exec("$BinDir/${ProjectName}SendLog.pl $JobKey") or
+ exec("$BinDir/${ProjectName}SendLog.pl --log-only $JobKey") or
LogMsg "Unable to exec ${ProjectName}SendLog.pl: $!\n";
exit(1);
}
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index e03395af1..ed3453b80 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -36,14 +36,47 @@ sub BEGIN
unshift @INC, "$::RootDir/lib";
}
}
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
+
use Algorithm::Diff;
+
use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::Log;
use WineTestBot::StepsTasks;
+#
+# Logging and error handling helpers
+#
+
+my $Debug;
+sub Debug(@)
+{
+ print STDERR @_ if ($Debug);
+}
+
+sub DebugTee($@)
+{
+ my ($File) = shift;
+ print $File @_;
+ Debug(@_);
+}
+
+my $LogOnly;
+sub Error(@)
+{
+ print STDERR "$Name0:error: ", @_ if (!$LogOnly);
+ LogMsg @_;
+}
+
+
+#
+# Log analysis
+#
+
sub IsBotFailure($)
{
my ($ErrLine) = @_;
@@ -121,7 +154,7 @@ sub ReadLog($$$)
}
else
{
- LogMsg "Unable to open '$LogName' for reading: $!\n";
+ Error "Unable to open '$LogName' for reading: $!\n";
}
return \@Messages;
@@ -179,7 +212,19 @@ sub SendLog($)
my $StepsTasks = CreateStepsTasks(undef, $Job);
my @SortedKeys = sort @{$StepsTasks->GetKeys()};
- open (SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq");
+ #
+ # Send a job summary and all the logs as attachments to the developer
+ #
+
+ Debug("-------------------- Developer email --------------------\n");
+ if ($Debug)
+ {
+ open(SENDMAIL, ">>&=", 1);
+ }
+ else
+ {
+ open (SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq");
+ }
print SENDMAIL "From: $RobotEMail\n";
print SENDMAIL "To: $To\n";
my $Subject = "TestBot job " . $Job->Id . " results";
@@ -218,6 +263,7 @@ EOF
$TestFailures;
}
+ # Print the job summary
my @FailureKeys;
foreach my $Key (@SortedKeys)
{
@@ -322,6 +368,7 @@ EOF
}
}
+ # Print the log attachments
foreach my $Key (@SortedKeys)
{
my $StepTask = $StepsTasks->GetItem($Key);
@@ -334,6 +381,7 @@ Content-Transfer-Encoding: 8bit
EOF
print SENDMAIL "Content-Disposition: attachment; filename=",
$StepTask->VM->Name, ".log\n\n";
+ print SENDMAIL "Not dumping logs in debug mode\n" if ($Debug);
my $PrintSeparator = !1;
my $TaskDir = $StepTask->GetTaskDir();
@@ -343,7 +391,7 @@ EOF
while (defined($Line = <LOGFILE>))
{
$Line =~ s/\s*$//;
- print SENDMAIL "$Line\n";
+ print SENDMAIL "$Line\n" if (!$Debug);
$PrintSeparator = 1;
}
close LOGFILE;
@@ -356,11 +404,11 @@ EOF
{
if ($PrintSeparator)
{
- print SENDMAIL "\n";
+ print SENDMAIL "\n" if (!$Debug);
$PrintSeparator = !1;
}
$Line =~ s/\s*$//;
- print SENDMAIL "$Line\n";
+ print SENDMAIL "$Line\n" if (!$Debug);
}
close ERRFILE;
}
@@ -369,10 +417,12 @@ EOF
print SENDMAIL "--==13F70BD1-BA1B-449A-9CCB-B6A8E90CED47==--\n";
close(SENDMAIL);
- if (! defined($Job->Patch))
- {
- return;
- }
+ # This is all for jobs submitted from the website
+ return if (!defined $Job->Patch);
+
+ #
+ # Build a job summary with only the new errors
+ #
my $Messages = "";
foreach my $Key (@FailureKeys)
@@ -401,7 +451,7 @@ EOF
}
else
{
- LogMsg "BotFailure found in ${LatestName}.err\n";
+ Error "BotFailure found in ${LatestName}.err\n";
}
if ($MessagesFromErr || $MessagesFromLog)
{
@@ -411,15 +461,28 @@ EOF
}
elsif ($BotFailure)
{
- LogMsg "BotFailure found in $TaskDir/err\n";
+ Error "BotFailure found in $TaskDir/err\n";
}
}
+ #
+ # Send a summary of the new errors to the mailing list
+ #
+
+ Debug("\n-------------------- Mailing list email --------------------\n");
+
my $WebSite = ($UseSSL ? "https://" : "http://") . $WebHostName;
if ($Messages)
{
- open (SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq");
+ if ($Debug)
+ {
+ open(SENDMAIL, ">>&=", 1);
+ }
+ else
+ {
+ open (SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq");
+ }
print SENDMAIL "From: $RobotEMail\n";
print SENDMAIL "To: $To\n";
print SENDMAIL "Cc: $WinePatchCc\n";
@@ -445,6 +508,14 @@ EOF
print SENDMAIL $Messages;
close SENDMAIL;
}
+ else
+ {
+ Debug("Found no error to report to the mailing list\n");
+ }
+
+ #
+ # Create a .testbot file for the patches website
+ #
my $Patch = $Job->Patch;
if (defined $Patch->WebPatchId and -d "$DataDir/webpatches")
@@ -452,9 +523,12 @@ EOF
my $BaseName = "$DataDir/webpatches/" . $Patch->WebPatchId;
if (open (my $result, ">", "$BaseName.testbot"))
{
- print $result "Status: " . ($Messages ? "Failed" : "OK") . "\n";
- print $result "Job-ID: " . $Job->Id . "\n";
- print $result "URL: $WebSite/JobDetails.pl?Key=" . $Job->GetKey() . "\n";
+ Debug("\n-------------------- WebPatches report --------------------\n");
+ # Only take into account new errors to decide whether the job was
+ # successful or not.
+ DebugTee($result, "Status: ". ($Messages ? "Failed" : "OK") ."\n");
+ DebugTee($result, "Job-ID: ". $Job->Id ."\n");
+ DebugTee($result, "URL: $WebSite/JobDetails.pl?Key=". $Job->GetKey() ."\n");
foreach my $Key (@SortedKeys)
{
@@ -496,7 +570,7 @@ EOF
}
else
{
- LogMsg "Job " . $Job->Id . ": Unable to open '$BaseName.testbot' for writing: $!";
+ Error "Job ". $Job->Id .": Unable to open '$BaseName.testbot' for writing: $!";
}
}
}
@@ -509,37 +583,96 @@ EOF
$ENV{PATH} = "/usr/bin:/bin";
delete $ENV{ENV};
-my $JobId = $ARGV[0];
-if (! $JobId)
+my $Usage;
+sub ValidateNumber($$)
+{
+ my ($Name, $Value) = @_;
+
+ # Validate and untaint the value
+ return $1 if ($Value =~ /^(\d+)$/);
+ Error "$Value is not a valid $Name\n";
+ $Usage = 2;
+ return undef;
+}
+
+my ($JobId);
+while (@ARGV)
{
- die "Usage: WineSendLog.pl JobId";
+ my $Arg = shift @ARGV;
+ if ($Arg eq "--debug")
+ {
+ $Debug = 1;
+ }
+ elsif ($Arg eq "--log-only")
+ {
+ $LogOnly = 1;
+ }
+ elsif ($Arg =~ /^(?:-\?|-h|--help)$/)
+ {
+ $Usage = 0;
+ last;
+ }
+ elsif ($Arg =~ /^-/)
+ {
+ Error "unknown option '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+ elsif (!defined $JobId)
+ {
+ $JobId = ValidateNumber('job id', $Arg);
+ }
+ else
+ {
+ Error "unexpected argument '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
}
-# Untaint parameters
-if ($JobId =~ /^(\d+)$/)
+# Check parameters
+if (!defined $Usage)
{
- $JobId = $1;
+ if (!defined $JobId)
+ {
+ Error "you must specify the job id\n";
+ $Usage = 2;
+ }
}
-else
+if (defined $Usage)
{
- LogMsg "Invalid JobId $JobId\n";
- exit(1);
+ if ($Usage)
+ {
+ Error "try '$Name0 --help' for more information\n";
+ exit $Usage;
+ }
+ print "Usage: $Name0 [--debug] [--help] JOBID\n";
+ print "\n";
+ print "Analyze the job's logs and notifies the developer and the patches website.\n";
+ print "\n";
+ print "Where:\n";
+ print " JOBID Id of the job to report on.\n";
+ print " --debug More verbose messages for debugging.\n";
+ print " --log-only Only send error messages to the log instead of also printing them\n";
+ print " on stderr.\n";
+ print " --help Shows this usage message.\n";
+ exit 0;
}
my $Job = CreateJobs()->GetItem($JobId);
-if (! defined($Job))
+if (!defined $Job)
{
- LogMsg "Job $JobId doesn't exist\n";
- exit(1);
+ Error "Job $JobId doesn't exist\n";
+ exit 1;
}
#
-# Analyze the log and notify the developer
+# Analyze the log, notify the developer and the Patches website
#
SendLog($Job);
LogMsg "Log for job $JobId sent\n";
-exit(0);
+exit 0;
--
2.18.0
June 26, 2018
[PATCH 2/7] testbot/web: Let LogUtils build the list of task reports and logs.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/LogUtils.pm | 55 ++++++++++++++++++++++++++++-
testbot/web/JobDetails.pl | 20 ++++-------
2 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index daa9c0bd8..3dfd7c5e7 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -27,7 +27,7 @@ WineTestBot::LogUtils - Provides functions to parse task logs
use Exporter 'import';
-our @EXPORT = qw(GetLogLineCategory ParseTaskLog);
+our @EXPORT = qw(GetLogFileNames GetLogLabel GetLogLineCategory ParseTaskLog);
#
@@ -133,4 +133,57 @@ sub GetLogLineCategory($)
return "none";
}
+=pod
+=over 12
+
+=item C<GetLogFileNames()>
+
+Scans the directory for test reports and task logs and returns their filenames.
+The filenames are returned in the order in which the logs are meant to be
+presented.
+
+=back
+=cut
+
+sub GetLogFileNames($;$)
+{
+ my ($Dir, $IncludeOld) = @_;
+
+ my @Candidates = ("exe32.report", "exe64.report",
+ "log", "err");
+ push @Candidates, "log.old", "err.old" if ($IncludeOld);
+
+ my @Logs;
+ foreach my $FileName (@Candidates)
+ {
+ push @Logs, $FileName if (-f "$Dir/$FileName" and !-z "$Dir/$FileName");
+ }
+ return \@Logs;
+}
+
+my %_LogFileLabels = (
+ "exe32.report" => "32 bit Windows report",
+ "exe64.report" => "64 bit Windows report",
+ "err" => "task errors",
+ "log" => "task log",
+ "err.old" => "old task errors",
+ "log.old" => "old logs",
+);
+
+=pod
+=over 12
+
+=item C<GetLogLabel()>
+
+Returns a user-friendly description of the content of the specified log file.
+
+=back
+=cut
+
+sub GetLogLabel($)
+{
+ my ($LogFileName) = @_;
+ return $_LogFileLabels{$LogFileName};
+}
+
1;
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index 07924f4e6..e5f792929 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -261,14 +261,6 @@ sub GetHtmlLine($$$)
return $Html;
}
-my @MILogFiles = qw(exe32.report exe64.report log log.old);
-my %MILogLabels = (
- "exe32.report" => "32 bit Windows report",
- "exe64.report" => "64 bit Windows report",
- "log" => "task log",
- "log.old" => "old logs",
-);
-
sub InitMoreInfo($)
{
my ($self) = @_;
@@ -282,15 +274,15 @@ sub InitMoreInfo($)
my $Value = $self->GetParam("f$Key");
my $TaskDir = $StepTask->GetTaskDir();
- foreach my $Log (@MILogFiles)
+ foreach my $Log (@{GetLogFileNames($TaskDir, 1)})
{
- if (!-f "$TaskDir/$Log" or -z "$TaskDir/$Log")
+ if ($Log =~ s/^err/log/)
{
- my $Err = $Log;
- next if ($Err !~ s/^log/err/ or !-f "$TaskDir/$Err" or -z "$TaskDir/$Err");
+ # We don't want separate entries for log* and err* but we also want a
+ # log* entry even if only err* exists.
+ next if (($More->{$Key}->{Logs}->[-1] || "") eq $Log);
}
push @{$More->{$Key}->{Logs}}, $Log;
-
$More->{$Key}->{Full} = $Log if (uri_escape($Log) eq $Value);
}
$More->{$Key}->{Full} ||= "";
@@ -385,7 +377,7 @@ sub GenerateBody($)
foreach my $Log (@{$MoreInfo->{Logs}})
{
- $self->GenerateMoreInfoLink($Key, $MILogLabels{$Log}, "Full", $Log);
+ $self->GenerateMoreInfoLink($Key, GetLogLabel($Log), "Full", $Log);
}
print "</div>\n";
--
2.18.0
June 26, 2018
[PATCH 1/7] testbot: Move log line categorization to LogUtils and simplify line highlighting.
by Francois Gouget
GetLogLineCategory() identifies log lines of interest which makes it
possible to decide how to display them.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
This makes it reusable in WineSendLog.pl.
testbot/lib/WineTestBot/LogUtils.pm | 61 +++++++++++++++++++++-
testbot/web/JobDetails.pl | 78 +++++++++++------------------
2 files changed, 88 insertions(+), 51 deletions(-)
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index 3e40fbc35..daa9c0bd8 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -27,7 +27,7 @@ WineTestBot::LogUtils - Provides functions to parse task logs
use Exporter 'import';
-our @EXPORT = qw(ParseTaskLog);
+our @EXPORT = qw(GetLogLineCategory ParseTaskLog);
#
@@ -74,4 +74,63 @@ sub ParseTaskLog($$)
return "nolog:Unable to open the task log for reading: $!";
}
+
+#
+# Log querying and formatting
+#
+
+=pod
+=over 12
+
+=item C<GetLogLineCategory()>
+
+Identifies the category of the given log line: an error message, a todo, just
+an informational message or none of these. The category can then be used to
+decide whether to hide the line or, on the contrary, highlight it.
+
+=back
+=cut
+
+sub GetLogLineCategory($)
+{
+ my ($Line) = @_;
+
+ if ($Line =~ /: Test marked todo: /)
+ {
+ return "todo";
+ }
+ if ($Line =~ /: Tests skipped: / or
+ $Line =~ /^\w+:\w+ skipped /)
+ {
+ return "skip";
+ }
+ if ($Line =~ /: Test (?:failed|succeeded inside todo block): / or
+ $Line =~ /Fatal: test .* does not exist/ or
+ $Line =~ / done \(258\)/ or
+ $Line =~ /: unhandled exception [0-9a-fA-F]{8} at / or
+ $Line =~ /^Unhandled exception: / or
+ # Git errors
+ $Line =~ /^CONFLICT / or
+ $Line =~ /^error: patch failed:/ or
+ $Line =~ /^error: corrupt patch / or
+ # Build errors
+ $Line =~ /: error: / or
+ $Line =~ /^Makefile:[0-9]+: recipe for target .* failed$/ or
+ $Line =~ /^(?:Build|Reconfig|Task): (?!ok)/ or
+ # Typical perl errors
+ $Line =~ /^Use of uninitialized value/)
+ {
+ return "error";
+ }
+ if ($Line =~ /^\+ \S/ or
+ $Line =~ /^\w+:\w+ start / or
+ # Build messages
+ $Line =~ /^(?:Build|Reconfig|Task): ok/)
+ {
+ return "info";
+ }
+
+ return "none";
+}
+
1;
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index f05c0f62e..07924f4e6 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -28,6 +28,7 @@ use URI::Escape;
use WineTestBot::Config;
use WineTestBot::Jobs;
+use WineTestBot::LogUtils;
use WineTestBot::StepsTasks;
use WineTestBot::Engine::Notify;
@@ -228,59 +229,36 @@ sub GeneratePage($)
$self->SUPER::GeneratePage();
}
+=pod
+=over 12
+
+=item C<GetHtmlLine()>
+
+Determines if the log line should be shown, how, and escapes it so it is valid
+HTML.
+
+When not showing the full log, returns undef except for error messages which
+are the only lines tha should be shown.
+When showing the full log error messages and other lines of interest are
+highlighted to make the log more readable.
+
+=back
+=cut
+
sub GetHtmlLine($$$)
{
my ($self, $FullLog, $Line) = @_;
- $Line = $self->escapeHTML($Line);
- if ($Line =~ /: Test marked todo: /)
- {
- return (undef, $Line) if (!$FullLog);
- my $Html = $Line;
- $Html =~ s~^(.*\S)\s*\r?$~<span class='log-todo'>$1</span>~;
- return ($Html, $Line);
- }
- if ($Line =~ /: Tests skipped: / or
- $Line =~ /^\w+:\w+ skipped /)
- {
- return (undef, $Line) if (!$FullLog);
- my $Html = $Line;
- $Html =~ s~^(.*\S)\s*\r?$~<span class='log-skip'>$1</span>~;
- return ($Html, $Line);
- }
- if ($Line =~ /: Test (?:failed|succeeded inside todo block): / or
- $Line =~ /Fatal: test .* does not exist/ or
- $Line =~ / done \(258\)/ or
- $Line =~ /: unhandled exception [0-9a-fA-F]{8} at / or
- $Line =~ /^Unhandled exception: / or
- # Git errors
- $Line =~ /^CONFLICT / or
- $Line =~ /^error: patch failed:/ or
- $Line =~ /^error: corrupt patch / or
- # Build errors
- $Line =~ /: error: / or
- $Line =~ /^Makefile:[0-9]+: recipe for target .* failed$/ or
- $Line =~ /^(?:Build|Reconfig|Task): (?!ok)/ or
- # Typical perl errors
- $Line =~ /^Use of uninitialized value/)
- {
- return ($Line, $Line) if (!$FullLog);
- my $Html = $Line;
- $Html =~ s~^(.*\S)\s*\r?$~<span class='log-error'>$1</span>~;
- return ($Html, $Line);
- }
- if ($FullLog &&
- ($Line =~ /^\+ \S/ or
- $Line =~ /^\w+:\w+ start / or
- # Build messages
- $Line =~ /^(?:Build|Reconfig|Task): ok/))
+ my $Category = GetLogLineCategory($Line);
+ return undef if ($Category ne "error" and !$FullLog);
+
+ my $Html = $self->escapeHTML($Line);
+ if ($FullLog and $Category ne "none")
{
- my $Html = $Line;
- $Html =~ s~^(.*\S)\s*\r?$~<span class='log-info'>$1</span>~;
- return ($Html, $Line);
+ # Highlight all line categories in the full log
+ $Html =~ s~^(.*\S)\s*\r?$~<span class='log-$Category'>$1</span>~;
}
-
- return (undef, $Line);
+ return $Html;
}
my @MILogFiles = qw(exe32.report exe64.report log log.old);
@@ -429,8 +407,8 @@ sub GenerateBody($)
{
$CurrentDll = $1;
}
- my ($Highlight, $Plain) = $self->GetHtmlLine($MoreInfo->{Full}, $Line);
- next if (!$MoreInfo->{Full} and !defined $Highlight);
+ my $Html = $self->GetHtmlLine($MoreInfo->{Full}, $Line);
+ next if (!defined $Html);
if ($PrintedDll ne $CurrentDll && !$MoreInfo->{Full})
{
@@ -451,7 +429,7 @@ sub GenerateBody($)
}
else
{
- print(($Highlight || $Plain), "\n");
+ print "$Html\n";
}
}
close($LogFile);
--
2.18.0
June 26, 2018
Re: [PATCH 2/2] msvcp120: Add test for Concurrent_vector_grow_to_at_least_with_result.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 26, 2018
Re: [PATCH 1/2] msvcp120: Add test for Concurrent_vector_grow_by.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 26, 2018
[PATCH 2/2] msvcp120: Add test for Concurrent_vector_grow_to_at_least_with_result.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 46 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index b5e470cba3..2974482ec1 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -420,6 +420,8 @@ static void* (__thiscall *p_vector_base_v4__Internal_compact)(
void (__cdecl*)(void*, const void*, size_t));
static size_t (__thiscall *p_vector_base_v4__Internal_grow_by)(
vector_base_v4*, size_t, size_t, void (__cdecl*)(void*, const void*, size_t), const void *);
+static size_t (__thiscall *p_vector_base_v4__Internal_grow_to_at_least_with_result)(
+ vector_base_v4*, size_t, size_t, void (__cdecl*)(void*, const void*, size_t), const void *);
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -572,6 +574,8 @@ static BOOL init(void)
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z");
SET(p_vector_base_v4__Internal_grow_by,
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z");
+ SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
+ "?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -693,6 +697,8 @@ static BOOL init(void)
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
SET(p_vector_base_v4__Internal_grow_by,
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z");
+ SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
+ "?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -742,6 +748,8 @@ static BOOL init(void)
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
SET(p_vector_base_v4__Internal_grow_by,
"?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z");
+ SET(p_vector_base_v4__Internal_grow_to_at_least_with_result,
+ "?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z");
#endif
}
SET(p__Thrd_equal,
@@ -3036,6 +3044,44 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
+ /* test for Internal_grow_to_at_least_with_result */
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 2;
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ i = 0;
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ idx = (size_t)call_func5(p_vector_base_v4__Internal_grow_to_at_least_with_result,
+ &v2, 3, sizeof(int), concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(idx == 2, "_Internal_grow_to_at_least_with_result returned %ld expected 2\n", (long)idx);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 3, "v2.early_size got %ld expected 3\n", (long)v2.early_size);
+ i = 0;
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ idx = (size_t)call_func5(p_vector_base_v4__Internal_grow_to_at_least_with_result,
+ &v2, 5, sizeof(int), concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(idx == 3, "_Internal_grow_to_at_least_with_result returned %ld expected 3\n", (long)idx);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ ok(size == 3, "_Internal_clear returned %ld expected 3\n", (long)size);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
--
2.11.0
June 26, 2018
[PATCH 1/2] msvcp120: Add test for Concurrent_vector_grow_by.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 46 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 0ec9fbd3b1..b5e470cba3 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -418,6 +418,8 @@ static void (__thiscall *p_vector_base_v4__Internal_swap)(
static void* (__thiscall *p_vector_base_v4__Internal_compact)(
vector_base_v4*, size_t, void*, void (__cdecl*)(void*, size_t),
void (__cdecl*)(void*, const void*, size_t));
+static size_t (__thiscall *p_vector_base_v4__Internal_grow_by)(
+ vector_base_v4*, size_t, size_t, void (__cdecl*)(void*, const void*, size_t), const void *);
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -568,6 +570,8 @@ static BOOL init(void)
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z");
SET(p_vector_base_v4__Internal_compact,
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z");
+ SET(p_vector_base_v4__Internal_grow_by,
+ "?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -687,6 +691,8 @@ static BOOL init(void)
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z");
SET(p_vector_base_v4__Internal_compact,
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
+ SET(p_vector_base_v4__Internal_grow_by,
+ "?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -734,7 +740,8 @@ static BOOL init(void)
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z");
SET(p_vector_base_v4__Internal_compact,
"?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
-
+ SET(p_vector_base_v4__Internal_grow_by,
+ "?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z");
#endif
}
SET(p__Thrd_equal,
@@ -2992,6 +2999,43 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
+ /* test for Internal_grow_by */
+ concurrent_vector_int_ctor(&v2);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 2;
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 2, "v2.early_size got %ld expected 2\n", (long)v2.early_size);
+ i = 0;
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ idx = (size_t)call_func5(p_vector_base_v4__Internal_grow_by,
+ &v2, 1, sizeof(int), concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(idx == 2, "_Internal_grow_by returned %ld expected 2\n", (long)idx);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 3, "v2.early_size got %ld expected 3\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ idx = (size_t)call_func5(p_vector_base_v4__Internal_grow_by,
+ &v2, 2, sizeof(int), concurrent_vector_int_copy, &i);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ ok(idx == 3, "_Internal_grow_by returned %ld expected 3\n", (long)idx);
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n", (long)v2.early_size);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ ok(size == 3, "_Internal_clear returned %ld expected 3\n", (long)size);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
--
2.11.0
June 26, 2018
Re: [PATCH] gdi32/tests: Use the available ARRAY_SIZE() macro
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 26, 2018
[PATCH 2/2] testbot/Janitor: Clean up the latest directory too.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/Janitor.pl | 46 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/testbot/bin/Janitor.pl b/testbot/bin/Janitor.pl
index 9252efa65..a9cdd52cd 100755
--- a/testbot/bin/Janitor.pl
+++ b/testbot/bin/Janitor.pl
@@ -299,6 +299,52 @@ else
Error "Unable to open '$DataDir/staging': $!";
}
+# Check the content of the latest directory
+if (opendir(my $dh, "$DataDir/latest"))
+{
+ # We will be deleting files so read the directory in one go
+ my @Entries = readdir($dh);
+ close($dh);
+
+ my $AllVMs = $VMs->Clone();
+ foreach my $Entry (@Entries)
+ {
+ next if ($Entry eq "." or $Entry eq "..");
+ $Entry =~ m%^([^/]+)$%;
+ my $FileName = "$DataDir/latest/$1";
+ my $Age = int((-M $FileName) + 0.5);
+
+ if ($Entry =~ /^(.*)_[a-z0-9]+\.(?:err|log)$/)
+ {
+ # Keep the reference WineTest reports for all VMs even if they are
+ # retired or scheduled for deletion.
+ my $VMName = $1;
+ next if ($AllVMs->GetItem($VMName));
+ }
+ elsif ($Entry =~ /^(?:TestLauncher[0-9]*\.exe|winefiles.txt|winetest[0-9]*-latest\.exe)$/)
+ {
+ next;
+ }
+
+ Trace "Found a suspicious latest file: $Entry\n";
+ if ($JobPurgeDays != 0)
+ {
+ if ($Age >= $JobPurgeDays + 7)
+ {
+ DeletePath($FileName);
+ }
+ elsif ($Age > $JobPurgeDays)
+ {
+ Trace "'$FileName' will be deleted in ", $JobPurgeDays + 7 - $Age, " day(s).\n";
+ }
+ }
+ }
+}
+else
+{
+ Error "Unable to open '$DataDir/latest': $!";
+}
+
# Delete obsolete record groups
if ($JobPurgeDays != 0)
{
--
2.18.0
June 26, 2018
[PATCH 1/2] testbot/Janitor: Add DeletePath() to simplify deleting file/directories.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/Janitor.pl | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/testbot/bin/Janitor.pl b/testbot/bin/Janitor.pl
index 9fb38efde..9252efa65 100755
--- a/testbot/bin/Janitor.pl
+++ b/testbot/bin/Janitor.pl
@@ -116,6 +116,17 @@ if (defined $Usage)
# Main
#
+sub DeletePath($)
+{
+ my ($Path) = @_;
+
+ Trace "Deleting '$Path'\n";
+ if (!$DryRun and !rmtree($Path))
+ {
+ Error "Could not delete '$Path': $!\n";
+ }
+}
+
# Delete obsolete Jobs
if ($JobPurgeDays != 0)
{
@@ -268,11 +279,7 @@ if (opendir(my $dh, "$DataDir/staging"))
{
if ($Age >= $JobPurgeDays + 7)
{
- Trace "Deleting '$FileName'\n";
- if (!$DryRun and !rmtree($FileName))
- {
- Error "Could not delete '$FileName': $!\n";
- }
+ DeletePath($FileName);
}
elsif ($Age > $JobPurgeDays)
{
@@ -282,12 +289,8 @@ if (opendir(my $dh, "$DataDir/staging"))
}
elsif ($Age >= 1)
{
- Trace "Deleting '$FileName'\n";
- if (!$DryRun and !unlink $FileName)
- {
- # The user abandoned the submit procedure half-way through
- Error "Could not delete '$FileName': $!\n";
- }
+ # The user abandoned the submit procedure half-way through
+ DeletePath($FileName);
}
}
}
--
2.18.0
June 26, 2018
[PATCH 2/2] crypt32: Fix string arguments tracing.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/crypt32/base64.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/crypt32/base64.c b/dlls/crypt32/base64.c
index 4a904d41cc..2ba8055961 100644
--- a/dlls/crypt32/base64.c
+++ b/dlls/crypt32/base64.c
@@ -622,7 +622,7 @@ static LONG Base64WithHeaderAndTrailerToBinaryA(LPCSTR pszString,
if (!(headerBegins = strstr(pszString, header)))
{
- TRACE("Can't find %s in %s.\n", header, pszString);
+ TRACE("Can't find %s in %s.\n", header, debugstr_an(pszString, cchString));
return ERROR_INVALID_DATA;
}
@@ -746,7 +746,7 @@ BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString,
StringToBinaryAFunc decoder;
LONG ret;
- TRACE("(%s, %d, %08x, %p, %p, %p, %p)\n", debugstr_a(pszString),
+ TRACE("(%s, %d, %08x, %p, %p, %p, %p)\n", debugstr_an(pszString, cchString ? cchString : -1),
cchString, dwFlags, pbBinary, pcbBinary, pdwSkip, pdwFlags);
if (!pszString)
@@ -833,7 +833,7 @@ static LONG Base64WithHeaderAndTrailerToBinaryW(LPCWSTR pszString,
if (!(headerBegins = strstrW(pszString, header)))
{
- TRACE("Can't find %s in %s.\n", debugstr_w(header), debugstr_w(pszString));
+ TRACE("Can't find %s in %s.\n", debugstr_w(header), debugstr_wn(pszString, cchString));
return ERROR_INVALID_DATA;
}
@@ -957,7 +957,7 @@ BOOL WINAPI CryptStringToBinaryW(LPCWSTR pszString,
StringToBinaryWFunc decoder;
LONG ret;
- TRACE("(%s, %d, %08x, %p, %p, %p, %p)\n", debugstr_w(pszString),
+ TRACE("(%s, %d, %08x, %p, %p, %p, %p)\n", debugstr_wn(pszString, cchString ? cchString : -1),
cchString, dwFlags, pbBinary, pcbBinary, pdwSkip, pdwFlags);
if (!pszString)
--
2.18.0
June 26, 2018
[PATCH 1/2] crypt32: Implement verification of ECDSA signatures.
by Nikolay Sivov
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
Modifications from original patch:
- few renames to make it closer to existing code;
- removed unrelated formatting changes in existing code;
- new BCrypt path is rearranged to match existing order : import -> hash -> verify.
dlls/crypt32/Makefile.in | 2 +-
dlls/crypt32/cert.c | 260 +++++++++++++++++++++++++++++++++++++--
2 files changed, 250 insertions(+), 12 deletions(-)
diff --git a/dlls/crypt32/Makefile.in b/dlls/crypt32/Makefile.in
index d3a409fcae..0934222119 100644
--- a/dlls/crypt32/Makefile.in
+++ b/dlls/crypt32/Makefile.in
@@ -1,7 +1,7 @@
EXTRADEFS = -D_CRYPT32_
MODULE = crypt32.dll
IMPORTLIB = crypt32
-IMPORTS = user32 advapi32
+IMPORTS = user32 advapi32 bcrypt
DELAYIMPORTS = cryptnet
EXTRALIBS = $(SECURITY_LIBS)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 83aac5d8f4..1667b42b0b 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -21,9 +21,14 @@
#include <stdarg.h>
#define NONAMELESSUNION
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
+#include "winternl.h"
+#define CRYPT_OID_INFO_HAS_EXTRA_FIELDS
#include "wincrypt.h"
+#include "bcrypt.h"
#include "winnls.h"
#include "rpc.h"
#include "wine/debug.h"
@@ -2408,22 +2413,13 @@ BOOL WINAPI CryptVerifyCertificateSignature(HCRYPTPROV_LEGACY hCryptProv,
CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY, pPublicKey, 0, NULL);
}
-static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv,
- DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pubKeyInfo,
- const CERT_SIGNED_CONTENT_INFO *signedCert)
+static BOOL CRYPT_VerifySignature(HCRYPTPROV_LEGACY hCryptProv, DWORD dwCertEncodingType,
+ CERT_PUBLIC_KEY_INFO *pubKeyInfo, const CERT_SIGNED_CONTENT_INFO *signedCert, const CRYPT_OID_INFO *info)
{
BOOL ret;
HCRYPTKEY key;
- PCCRYPT_OID_INFO info;
ALG_ID pubKeyID, hashID;
- info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
- signedCert->SignatureAlgorithm.pszObjId, 0);
- if (!info || info->dwGroupId != CRYPT_SIGN_ALG_OID_GROUP_ID)
- {
- SetLastError(NTE_BAD_ALGID);
- return FALSE;
- }
hashID = info->u.Algid;
if (info->ExtraInfo.cbData >= sizeof(ALG_ID))
pubKeyID = *(ALG_ID *)info->ExtraInfo.pbData;
@@ -2453,6 +2449,248 @@ static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptP
return ret;
}
+static BOOL CNG_CalcHash(const WCHAR *algorithm, const CERT_SIGNED_CONTENT_INFO *signedCert,
+ BYTE **hash_value, DWORD *hash_len)
+{
+ BCRYPT_HASH_HANDLE hash = NULL;
+ BCRYPT_ALG_HANDLE alg = NULL;
+ NTSTATUS status;
+ DWORD size;
+
+ if ((status = BCryptOpenAlgorithmProvider(&alg, algorithm, NULL, 0)))
+ goto done;
+
+ if ((status = BCryptCreateHash(alg, &hash, NULL, 0, NULL, 0, 0)))
+ goto done;
+
+ if ((status = BCryptHashData(hash, signedCert->ToBeSigned.pbData, signedCert->ToBeSigned.cbData, 0)))
+ goto done;
+
+ if ((status = BCryptGetProperty(hash, BCRYPT_HASH_LENGTH, (BYTE *)hash_len, sizeof(*hash_len), &size, 0)))
+ goto done;
+
+ if (!(*hash_value = CryptMemAlloc(*hash_len)))
+ {
+ status = STATUS_NO_MEMORY;
+ goto done;
+ }
+
+ if ((status = BCryptFinishHash(hash, *hash_value, *hash_len, 0)))
+ {
+ CryptMemFree(*hash_value);
+ goto done;
+ }
+
+done:
+ if (hash) BCryptDestroyHash(hash);
+ if (alg) BCryptCloseAlgorithmProvider(alg, 0);
+ if (status) SetLastError(RtlNtStatusToDosError(status));
+ return status == 0;
+}
+
+static BOOL CNG_ImportECCPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HANDLE *key)
+{
+ DWORD blob_magic, ecckey_len, size;
+ BCRYPT_ALG_HANDLE alg = NULL;
+ BCRYPT_ECCKEY_BLOB *ecckey;
+ const WCHAR *sign_algo;
+ char **ecc_curve;
+ NTSTATUS status;
+
+ if (!pubKeyInfo->PublicKey.cbData)
+ {
+ SetLastError(NTE_BAD_ALGID);
+ return FALSE;
+ }
+
+ if (pubKeyInfo->PublicKey.pbData[0] != 0x4)
+ {
+ FIXME("Compressed ECC curves (%02x) not yet supported\n", pubKeyInfo->PublicKey.pbData[0]);
+ SetLastError(NTE_BAD_ALGID);
+ return FALSE;
+ }
+
+ if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_OBJECT_IDENTIFIER, pubKeyInfo->Algorithm.Parameters.pbData,
+ pubKeyInfo->Algorithm.Parameters.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &ecc_curve, &size))
+ return FALSE;
+
+ if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P256))
+ {
+ sign_algo = BCRYPT_ECDSA_P256_ALGORITHM;
+ blob_magic = BCRYPT_ECDSA_PUBLIC_P256_MAGIC;
+ }
+ else if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P384))
+ {
+ sign_algo = BCRYPT_ECDSA_P384_ALGORITHM;
+ blob_magic = BCRYPT_ECDSA_PUBLIC_P384_MAGIC;
+ }
+ else
+ {
+ FIXME("Unsupported ecc curve type: %s\n", *ecc_curve);
+ sign_algo = NULL;
+ blob_magic = 0;
+ }
+ LocalFree(ecc_curve);
+
+ if (!sign_algo)
+ {
+ SetLastError(NTE_BAD_ALGID);
+ return FALSE;
+ }
+
+ if ((status = BCryptOpenAlgorithmProvider(&alg, sign_algo, NULL, 0)))
+ goto done;
+
+ ecckey_len = sizeof(BCRYPT_ECCKEY_BLOB) + pubKeyInfo->PublicKey.cbData - 1;
+ if (!(ecckey = CryptMemAlloc(ecckey_len)))
+ {
+ status = STATUS_NO_MEMORY;
+ goto done;
+ }
+
+ ecckey->dwMagic = blob_magic;
+ ecckey->cbKey = (pubKeyInfo->PublicKey.cbData - 1) / 2;
+ memcpy(ecckey + 1, pubKeyInfo->PublicKey.pbData + 1, pubKeyInfo->PublicKey.cbData - 1);
+
+ status = BCryptImportKeyPair(alg, NULL, BCRYPT_ECCPUBLIC_BLOB, key, (BYTE*)ecckey, ecckey_len, 0);
+
+done:
+ if (alg) BCryptCloseAlgorithmProvider(alg, 0);
+ if (status) SetLastError(RtlNtStatusToDosError(status));
+ return !status;
+}
+
+static BOOL CNG_ImportPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HANDLE *key)
+{
+ if (!strcmp(pubKeyInfo->Algorithm.pszObjId, szOID_ECC_PUBLIC_KEY))
+ return CNG_ImportECCPubKey(pubKeyInfo, key);
+
+ FIXME("Unsupported public key type: %s\n", debugstr_a(pubKeyInfo->Algorithm.pszObjId));
+ SetLastError(NTE_BAD_ALGID);
+ return FALSE;
+}
+
+static BOOL CNG_PrepareSignatureECC(BYTE *encoded_sig, DWORD encoded_size, BYTE **sig_value, DWORD *sig_len)
+{
+ CERT_ECC_SIGNATURE *ecc_sig;
+ DWORD size;
+ int i;
+
+ if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_ECC_SIGNATURE, encoded_sig, encoded_size,
+ CRYPT_DECODE_ALLOC_FLAG, NULL, &ecc_sig, &size))
+ return FALSE;
+
+ if (!ecc_sig->r.cbData || !ecc_sig->s.cbData)
+ {
+ LocalFree(ecc_sig);
+ SetLastError(ERROR_INVALID_DATA);
+ return FALSE;
+ }
+
+ *sig_len = ecc_sig->r.cbData + ecc_sig->s.cbData;
+ if (!(*sig_value = CryptMemAlloc(*sig_len)))
+ {
+ LocalFree(ecc_sig);
+ SetLastError(ERROR_OUTOFMEMORY);
+ return FALSE;
+ }
+
+ for (i = 0; i < ecc_sig->r.cbData; i++)
+ (*sig_value)[i] = ecc_sig->r.pbData[ecc_sig->r.cbData - i - 1];
+ for (i = 0; i < ecc_sig->s.cbData; i++)
+ (*sig_value)[ecc_sig->r.cbData + i] = ecc_sig->s.pbData[ecc_sig->s.cbData - i - 1];
+
+ LocalFree(ecc_sig);
+ return TRUE;
+}
+
+static BOOL CNG_PrepareSignature(CERT_PUBLIC_KEY_INFO *pubKeyInfo, const CERT_SIGNED_CONTENT_INFO *signedCert,
+ BYTE **sig_value, DWORD *sig_len)
+{
+ BYTE *encoded_sig;
+ BOOL ret = FALSE;
+ int i;
+
+ if (!signedCert->Signature.cbData)
+ {
+ SetLastError(ERROR_INVALID_DATA);
+ return FALSE;
+ }
+
+ if (!(encoded_sig = CryptMemAlloc(signedCert->Signature.cbData)))
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return FALSE;
+ }
+
+ for (i = 0; i < signedCert->Signature.cbData; i++)
+ encoded_sig[i] = signedCert->Signature.pbData[signedCert->Signature.cbData - i - 1];
+
+ if (!strcmp(pubKeyInfo->Algorithm.pszObjId, szOID_ECC_PUBLIC_KEY))
+ ret = CNG_PrepareSignatureECC(encoded_sig, signedCert->Signature.cbData, sig_value, sig_len);
+ else
+ {
+ FIXME("Unsupported public key type: %s\n", debugstr_a(pubKeyInfo->Algorithm.pszObjId));
+ SetLastError(NTE_BAD_ALGID);
+ }
+
+ CryptMemFree(encoded_sig);
+ return ret;
+}
+
+static BOOL CNG_VerifySignature(HCRYPTPROV_LEGACY hCryptProv, DWORD dwCertEncodingType,
+ CERT_PUBLIC_KEY_INFO *pubKeyInfo, const CERT_SIGNED_CONTENT_INFO *signedCert, const CRYPT_OID_INFO *info)
+{
+ BCRYPT_KEY_HANDLE key = NULL;
+ BYTE *hash_value = NULL, *sig_value;
+ DWORD hash_len, sig_len;
+ NTSTATUS status;
+ BOOL ret;
+
+ ret = CNG_ImportPubKey(pubKeyInfo, &key);
+ if (ret)
+ {
+ ret = CNG_CalcHash(info->pwszCNGAlgid, signedCert, &hash_value, &hash_len);
+ if (ret)
+ {
+ ret = CNG_PrepareSignature(pubKeyInfo, signedCert, &sig_value, &sig_len);
+ if (ret)
+ {
+ status = BCryptVerifySignature(key, NULL, hash_value, hash_len, sig_value, sig_len, 0);
+ if (status)
+ {
+ FIXME("Failed to verify signature: %08x\n", status);
+ SetLastError(RtlNtStatusToDosError(status));
+ ret = FALSE;
+ }
+ CryptMemFree(sig_value);
+ }
+ CryptMemFree(hash_value);
+ }
+ BCryptDestroyKey(key);
+ }
+
+ return ret;
+}
+
+static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv, DWORD dwCertEncodingType,
+ CERT_PUBLIC_KEY_INFO *pubKeyInfo, const CERT_SIGNED_CONTENT_INFO *signedCert)
+{
+ CCRYPT_OID_INFO *info;
+
+ info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, signedCert->SignatureAlgorithm.pszObjId, 0);
+ if (!info || info->dwGroupId != CRYPT_SIGN_ALG_OID_GROUP_ID)
+ {
+ SetLastError(NTE_BAD_ALGID);
+ return FALSE;
+ }
+
+ if (info->u.Algid == CALG_OID_INFO_CNG_ONLY)
+ return CNG_VerifySignature(hCryptProv, dwCertEncodingType, pubKeyInfo, signedCert, info);
+ else
+ return CRYPT_VerifySignature(hCryptProv, dwCertEncodingType, pubKeyInfo, signedCert, info);
+}
+
BOOL WINAPI CryptVerifyCertificateSignatureEx(HCRYPTPROV_LEGACY hCryptProv,
DWORD dwCertEncodingType, DWORD dwSubjectType, void *pvSubject,
DWORD dwIssuerType, void *pvIssuer, DWORD dwFlags, void *pvReserved)
--
2.18.0
June 26, 2018
[PATCH] msi: Remove checks for negative value.
by Hans Leidekker
From: Andrey Gusev <andrey.goosev(a)gmail.com>
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msi/format.c | 2 +-
dlls/msi/string.c | 5 ++---
dlls/msi/table.c | 4 +---
3 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/dlls/msi/format.c b/dlls/msi/format.c
index 9356c9e30d..d32afb2a60 100644
--- a/dlls/msi/format.c
+++ b/dlls/msi/format.c
@@ -242,7 +242,7 @@ static WCHAR *deformat_file( FORMAT *format, FORMSTR *str, BOOL shortname, int *
if ((ret = strdupW( file->TargetPath ))) len = strlenW( ret );
goto done;
}
- if ((len = GetShortPathNameW(file->TargetPath, NULL, 0)) <= 0)
+ if (!(len = GetShortPathNameW(file->TargetPath, NULL, 0)))
{
if ((ret = strdupW( file->TargetPath ))) len = strlenW( ret );
goto done;
diff --git a/dlls/msi/string.c b/dlls/msi/string.c
index f094a53c9e..7383fddbed 100644
--- a/dlls/msi/string.c
+++ b/dlls/msi/string.c
@@ -233,7 +233,7 @@ static void set_st_entry( string_table *st, UINT n, WCHAR *str, int len, USHORT
static UINT string2id( const string_table *st, const char *buffer, UINT *id )
{
- DWORD sz;
+ int sz;
UINT r = ERROR_INVALID_PARAMETER;
LPWSTR str;
@@ -245,8 +245,7 @@ static UINT string2id( const string_table *st, const char *buffer, UINT *id )
return ERROR_SUCCESS;
}
- sz = MultiByteToWideChar( st->codepage, 0, buffer, -1, NULL, 0 );
- if( sz <= 0 )
+ if (!(sz = MultiByteToWideChar( st->codepage, 0, buffer, -1, NULL, 0 )))
return r;
str = msi_alloc( sz*sizeof(WCHAR) );
if( !str )
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 45a181445a..e046c5c9e2 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -1279,9 +1279,7 @@ static UINT get_table_value_from_record( MSITABLEVIEW *tv, MSIRECORD *rec, UINT
UINT r;
int ival;
- if ( (iField <= 0) ||
- (iField > tv->num_cols) ||
- MSI_RecordIsNull( rec, iField ) )
+ if (!iField || iField > tv->num_cols || MSI_RecordIsNull( rec, iField ))
return ERROR_FUNCTION_FAILED;
columninfo = tv->columns[ iField - 1 ];
--
2.11.0
June 26, 2018
[PATCH] shell32: use characters as arguments to GetTempPathW and GetLongPathNameW
by Marcus Meissner
Signed-off-by: Marcus Meissner <marcus(a)jet.franken.de>
---
dlls/shell32/tests/shlfolder.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index 6460fd9381..bb303f66e4 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -244,8 +244,8 @@ todo_wine_if(parse_tests[i].todo)
CoTaskMemFree(pidl);
/* Relative paths are interpreted relative to the desktop. */
- GetTempPathW(sizeof(buffer), buffer);
- GetLongPathNameW(buffer, buffer, sizeof(buffer));
+ GetTempPathW(ARRAY_SIZE(buffer), buffer);
+ GetLongPathNameW(buffer, buffer, ARRAY_SIZE(buffer));
SetCurrentDirectoryW(buffer);
CreateDirectoryW(testdirW, NULL);
--
2.17.1
June 26, 2018
Re: [PATCH 5/5] include: Make fil_data.idl a common header.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39362
Your paranoid android.
=== w2008s64 (64 bit referenceclock) ===
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
June 26, 2018
[PATCH 5/5] include: Make fil_data.idl a common header.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/Makefile.in | 3 +-
dlls/devenum/createdevenum.c | 2 +-
dlls/devenum/fil_data.idl | 47 --------------------------
dlls/dxdiagn/Makefile.in | 3 +-
dlls/dxdiagn/provider.c | 2 +-
dlls/quartz/Makefile.in | 1 -
dlls/quartz/fil_data.idl | 52 -----------------------------
dlls/quartz/filtermapper.c | 2 +-
dlls/quartz/tests/Makefile.in | 1 -
dlls/quartz/tests/fil_data.idl | 52 -----------------------------
dlls/quartz/tests/filtermapper.c | 2 +-
include/Makefile.in | 1 +
{dlls/dxdiagn => include/wine}/fil_data.idl | 21 ++----------
13 files changed, 10 insertions(+), 179 deletions(-)
delete mode 100644 dlls/devenum/fil_data.idl
delete mode 100644 dlls/quartz/fil_data.idl
delete mode 100644 dlls/quartz/tests/fil_data.idl
rename {dlls/dxdiagn => include/wine}/fil_data.idl (67%)
diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in
index d1407a9..2760eed 100644
--- a/dlls/devenum/Makefile.in
+++ b/dlls/devenum/Makefile.in
@@ -9,7 +9,6 @@ C_SRCS = \
parsedisplayname.c
IDL_SRCS = \
- devenum_classes.idl \
- fil_data.idl
+ devenum_classes.idl
RC_SRCS = devenum.rc
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 8275c99..c138cb7 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -37,7 +37,7 @@
#include "mmddk.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
diff --git a/dlls/devenum/fil_data.idl b/dlls/devenum/fil_data.idl
deleted file mode 100644
index 7e37a75..0000000
--- a/dlls/devenum/fil_data.idl
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
index 3a1017e..c16396e 100644
--- a/dlls/dxdiagn/Makefile.in
+++ b/dlls/dxdiagn/Makefile.in
@@ -9,5 +9,4 @@ C_SRCS = \
RC_SRCS = dxdiagn.rc
IDL_SRCS = \
- dxdiagn.idl \
- fil_data.idl
+ dxdiagn.idl
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 4f964ad..1fdab5e 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -35,7 +35,7 @@
#include "d3d9.h"
#include "strmif.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
#include "psapi.h"
#include "wbemcli.h"
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index e938865..5eb8d44 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -30,7 +30,6 @@ RC_SRCS = version.rc
IDL_SRCS = \
control_tlb.idl \
- fil_data.idl \
quartz_strmif.idl
dlldata_EXTRADEFS = -DENTRY_PREFIX=QUARTZ_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL
diff --git a/dlls/quartz/fil_data.idl b/dlls/quartz/fil_data.idl
deleted file mode 100644
index ab93499..0000000
--- a/dlls/quartz/fil_data.idl
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- *
- * Notes:
- * - This interface is deprecated and IFilterMapper2 should be used instead.
- * - There is no full replacement for IAMFilterData::ParseFilterData short of manually
- * parsing out the REGFILTER2 struct from the binary blob.
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c
index 20c7e3a..d78f643 100644
--- a/dlls/quartz/filtermapper.c
+++ b/dlls/quartz/filtermapper.c
@@ -37,7 +37,7 @@
#include "wine/unicode.h"
#include "uuids.h"
#include "initguid.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
#include "wine/debug.h"
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in
index 4f54666..6b880c3 100644
--- a/dlls/quartz/tests/Makefile.in
+++ b/dlls/quartz/tests/Makefile.in
@@ -12,7 +12,6 @@ C_SRCS = \
referenceclock.c \
videorenderer.c
-IDL_SRCS = fil_data.idl
RC_SRCS = \
rsrc.rc
diff --git a/dlls/quartz/tests/fil_data.idl b/dlls/quartz/tests/fil_data.idl
deleted file mode 100644
index ab93499..0000000
--- a/dlls/quartz/tests/fil_data.idl
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
-import "unknwn.idl";
-
-
-/*****************************************************************************
- * IAMFilterData interface
- *
- * Notes:
- * - This interface is deprecated and IFilterMapper2 should be used instead.
- * - There is no full replacement for IAMFilterData::ParseFilterData short of manually
- * parsing out the REGFILTER2 struct from the binary blob.
- */
-[
- object,
- uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
- pointer_default(unique)
-]
-interface IAMFilterData : IUnknown
-{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
-
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
-}
diff --git a/dlls/quartz/tests/filtermapper.c b/dlls/quartz/tests/filtermapper.c
index 5a43785..7b6a018 100644
--- a/dlls/quartz/tests/filtermapper.c
+++ b/dlls/quartz/tests/filtermapper.c
@@ -26,7 +26,7 @@
#include "dshow.h"
#include "winternl.h"
-#include "fil_data.h"
+#include "wine/fil_data.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
diff --git a/include/Makefile.in b/include/Makefile.in
index 39f2691..995544a 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -664,6 +664,7 @@ SOURCES = \
windowsx.h \
wine/debug.h \
wine/exception.h \
+ wine/fil_data.idl \
wine/itss.idl \
wine/library.h \
wine/svcctl.idl \
diff --git a/dlls/dxdiagn/fil_data.idl b/include/wine/fil_data.idl
similarity index 67%
rename from dlls/dxdiagn/fil_data.idl
rename to include/wine/fil_data.idl
index 7e37a75..19dfa8a 100644
--- a/dlls/dxdiagn/fil_data.idl
+++ b/include/wine/fil_data.idl
@@ -16,16 +16,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#pragma makedep header
-
-import "objidl.idl";
-import "strmif.idl";
import "unknwn.idl";
+import "strmif.idl";
-
-/*****************************************************************************
- * IAMFilterData interface
- */
[
object,
uuid(97f7c4d4-547b-4a5f-8332-536430ad2e4d),
@@ -33,15 +26,7 @@ import "unknwn.idl";
]
interface IAMFilterData : IUnknown
{
- typedef [unique] IAMFilterData *LPIAMFILTERDATA;
+ HRESULT ParseFilterData( [in] BYTE *data, [in] ULONG size, [out] BYTE **regfilter );
- HRESULT ParseFilterData(
- [in] BYTE * rgbFilterData,
- [in] ULONG cb,
- [out] BYTE ** prgbRegFilter2);
-
- HRESULT CreateFilterData(
- [in] REGFILTER2 * prf2,
- [out] BYTE ** prgbFilterData,
- [out] ULONG * pcb);
+ HRESULT CreateFilterData( [in] REGFILTER2 *regfilter, [out] BYTE **data, [out] ULONG *size );
}
--
2.7.4
June 26, 2018
[PATCH 4/5] devenum: Remove an unused typedef.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/devenum_main.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 98ad1ad..b17bc93 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -28,13 +28,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(devenum);
DECLSPEC_HIDDEN LONG dll_refs;
static HINSTANCE devenum_instance;
-typedef struct
-{
- REFCLSID clsid;
- LPCWSTR friendly_name;
- BOOL instance;
-} register_info;
-
/***********************************************************************
* DllEntryPoint
*/
--
2.7.4
June 26, 2018
[PATCH 3/5] devenum: Make some variables static.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/createdevenum.c | 14 ++++++--------
dlls/devenum/devenum_main.c | 13 ++++---------
dlls/devenum/devenum_private.h | 4 +---
dlls/devenum/mediacatenum.c | 4 +++-
4 files changed, 14 insertions(+), 21 deletions(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 06c264c..8275c99 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -41,8 +41,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
-extern HINSTANCE DEVENUM_hInstance;
-
static const WCHAR wszFilterKeyName[] = {'F','i','l','t','e','r',0};
static const WCHAR wszMeritName[] = {'M','e','r','i','t',0};
static const WCHAR wszPins[] = {'P','i','n','s',0};
@@ -460,7 +458,7 @@ static void register_legacy_filters(void)
V_VT(&var) = VT_BSTR;
if (!(V_BSTR(&var) = SysAllocString(wszFilterSubkeyName)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -537,7 +535,7 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
StringFromGUID2(&CLSID_DSoundRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -620,7 +618,7 @@ static void register_waveout_devices(void)
StringFromGUID2(&CLSID_AudioRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -693,7 +691,7 @@ static void register_wavein_devices(void)
StringFromGUID2(&CLSID_AudioRecord, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -765,7 +763,7 @@ static void register_midiout_devices(void)
StringFromGUID2(&CLSID_AVIMIDIRender, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
@@ -854,7 +852,7 @@ static void register_vfw_codecs(void)
StringFromGUID2(&CLSID_AVICo, clsid, CHARS_IN_GUID);
if (!(V_BSTR(&var) = SysAllocString(clsid)))
goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsid_keyname, &var);
+ hr = IPropertyBag_Write(prop_bag, clsidW, &var);
if (FAILED(hr)) goto cleanup;
VariantClear(&var);
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 3499f99..98ad1ad 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -26,7 +26,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
DECLSPEC_HIDDEN LONG dll_refs;
-DECLSPEC_HIDDEN HINSTANCE DEVENUM_hInstance;
+static HINSTANCE devenum_instance;
typedef struct
{
@@ -36,11 +36,6 @@ typedef struct
} register_info;
/***********************************************************************
- * Global string constant definitions
- */
-const WCHAR clsid_keyname[6] = { 'C', 'L', 'S', 'I', 'D', 0 };
-
-/***********************************************************************
* DllEntryPoint
*/
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
@@ -49,7 +44,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
- DEVENUM_hInstance = hinstDLL;
+ devenum_instance = hinstDLL;
DisableThreadLibraryCalls(hinstDLL);
break;
}
@@ -166,7 +161,7 @@ HRESULT WINAPI DllRegisterServer(void)
TRACE("\n");
- res = __wine_register_resources( DEVENUM_hInstance );
+ res = __wine_register_resources( devenum_instance );
if (FAILED(res))
return res;
@@ -214,5 +209,5 @@ HRESULT WINAPI DllRegisterServer(void)
HRESULT WINAPI DllUnregisterServer(void)
{
FIXME("stub!\n");
- return __wine_unregister_resources( DEVENUM_hInstance );
+ return __wine_unregister_resources( devenum_instance );
}
diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h
index ea4e017..e18c57d 100644
--- a/dlls/devenum/devenum_private.h
+++ b/dlls/devenum/devenum_private.h
@@ -83,7 +83,7 @@ extern IParseDisplayName DEVENUM_ParseDisplayName DECLSPEC_HIDDEN;
*/
static const WCHAR backslashW[] = {'\\',0};
-static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
+static const WCHAR clsidW[] = {'C','L','S','I','D',0};
static const WCHAR instanceW[] = {'\\','I','n','s','t','a','n','c','e',0};
static const WCHAR wszActiveMovieKey[] = {'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
@@ -93,5 +93,3 @@ static const WCHAR deviceW[] = {'@','d','e','v','i','c','e',':',0};
static const WCHAR dmoW[] = {'d','m','o',':',0};
static const WCHAR swW[] = {'s','w',':',0};
static const WCHAR cmW[] = {'c','m',':',0};
-
-extern const WCHAR clsid_keyname[6] DECLSPEC_HIDDEN;
diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c
index c4338a2..660e81c 100644
--- a/dlls/devenum/mediacatenum.c
+++ b/dlls/devenum/mediacatenum.c
@@ -347,6 +347,7 @@ static HRESULT create_PropertyBag(MediaCatMoniker *mon, IPropertyBag **ppBag)
else if (rpb->type == DEVICE_FILTER)
{
strcpyW(rpb->path, clsidW);
+ strcatW(rpb->path, backslashW);
if (mon->has_class)
{
StringFromGUID2(&mon->class, rpb->path + strlenW(rpb->path), CHARS_IN_GUID);
@@ -496,7 +497,7 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToObject(IMoniker *iface, IBi
if (SUCCEEDED(res))
{
V_VT(&var) = VT_LPWSTR;
- res = IPropertyBag_Read(pProp, clsid_keyname, &var, NULL);
+ res = IPropertyBag_Read(pProp, clsidW, &var, NULL);
}
if (SUCCEEDED(res))
{
@@ -1027,6 +1028,7 @@ HRESULT create_EnumMoniker(REFCLSID class, IEnumMoniker **ppEnumMoniker)
pEnumMoniker->class = *class;
strcpyW(buffer, clsidW);
+ strcatW(buffer, backslashW);
StringFromGUID2(class, buffer + strlenW(buffer), CHARS_IN_GUID);
strcatW(buffer, instanceW);
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &pEnumMoniker->sw_key))
--
2.7.4
June 26, 2018
[PATCH 2/5] devenum: Use separate factories for CLSID_SystemDeviceEnum and CLSID_CDeviceMoniker.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/devenum_main.c | 46 +++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index 7bfc593..3499f99 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -56,6 +56,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
return TRUE;
}
+struct class_factory
+{
+ IClassFactory IClassFactory_iface;
+ IUnknown *obj;
+};
+
+static inline struct class_factory *impl_from_IClassFactory( IClassFactory *iface )
+{
+ return CONTAINING_RECORD( iface, struct class_factory, IClassFactory_iface );
+}
+
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID iid, void **obj)
{
TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), obj);
@@ -87,24 +98,15 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface,
IUnknown *outer, REFIID iid, void **obj)
{
+ struct class_factory *This = impl_from_IClassFactory( iface );
+
TRACE("(%p, %s, %p)\n", outer, debugstr_guid(iid), obj);
if (!obj) return E_POINTER;
if (outer) return CLASS_E_NOAGGREGATION;
- if (IsEqualGUID(&IID_ICreateDevEnum, iid))
- {
- *obj = &DEVENUM_CreateDevEnum;
- return S_OK;
- }
- if (IsEqualGUID(&IID_IParseDisplayName, iid))
- {
- *obj = &DEVENUM_ParseDisplayName;
- return S_OK;
- }
-
- return CLASS_E_CLASSNOTAVAILABLE;
+ return IUnknown_QueryInterface(This->obj, iid, obj);
}
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL lock)
@@ -124,24 +126,24 @@ static const IClassFactoryVtbl ClassFactory_vtbl = {
ClassFactory_LockServer
};
-static IClassFactory devenum_cf = { &ClassFactory_vtbl };
+static struct class_factory create_devenum_cf = { { &ClassFactory_vtbl }, (IUnknown *)&DEVENUM_CreateDevEnum };
+static struct class_factory device_moniker_cf = { { &ClassFactory_vtbl }, (IUnknown *)&DEVENUM_ParseDisplayName };
/***********************************************************************
* DllGetClassObject (DEVENUM.@)
*/
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
+HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **obj)
{
- TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+ TRACE("(%s, %s, %p)\n", debugstr_guid(clsid), debugstr_guid(iid), obj);
- *ppv = NULL;
+ *obj = NULL;
- /* FIXME: we should really have two class factories.
- * Oh well - works just fine as it is */
- if (IsEqualGUID(rclsid, &CLSID_SystemDeviceEnum) ||
- IsEqualGUID(rclsid, &CLSID_CDeviceMoniker))
- return IClassFactory_QueryInterface(&devenum_cf, iid, ppv);
+ if (IsEqualGUID(clsid, &CLSID_SystemDeviceEnum))
+ return IClassFactory_QueryInterface(&create_devenum_cf.IClassFactory_iface, iid, obj);
+ else if (IsEqualGUID(clsid, &CLSID_CDeviceMoniker))
+ return IClassFactory_QueryInterface(&device_moniker_cf.IClassFactory_iface, iid, obj);
- FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
+ FIXME("class %s not available\n", debugstr_guid(clsid));
return CLASS_E_CLASSNOTAVAILABLE;
}
--
2.7.4
June 26, 2018
[PATCH 1/5] devenum: Merge factory.c into devenum_main.c.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/Makefile.in | 1 -
dlls/devenum/devenum_main.c | 74 ++++++++++++++++++++++-
dlls/devenum/devenum_private.h | 10 ---
dlls/devenum/factory.c | 134 -----------------------------------------
4 files changed, 72 insertions(+), 147 deletions(-)
delete mode 100644 dlls/devenum/factory.c
diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in
index ae138b6..d1407a9 100644
--- a/dlls/devenum/Makefile.in
+++ b/dlls/devenum/Makefile.in
@@ -5,7 +5,6 @@ DELAYIMPORTS = msvfw32
C_SRCS = \
createdevenum.c \
devenum_main.c \
- factory.c \
mediacatenum.c \
parsedisplayname.c
diff --git a/dlls/devenum/devenum_main.c b/dlls/devenum/devenum_main.c
index cb4b454..7bfc593 100644
--- a/dlls/devenum/devenum_main.c
+++ b/dlls/devenum/devenum_main.c
@@ -1,5 +1,5 @@
/*
- * exported dll functions for devenum.dll
+ * Device Enumeration
*
* Copyright (C) 2002 John K. Hohm
* Copyright (C) 2002 Robert Shearman
@@ -56,6 +56,76 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
return TRUE;
}
+static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID iid, void **obj)
+{
+ TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), obj);
+
+ if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IClassFactory))
+ {
+ IClassFactory_AddRef(iface);
+ *obj = iface;
+ return S_OK;
+ }
+
+ *obj = NULL;
+ WARN("no interface for %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
+{
+ DEVENUM_LockModule();
+ return 2;
+}
+
+static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
+{
+ DEVENUM_UnlockModule();
+ return 1;
+}
+
+static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface,
+ IUnknown *outer, REFIID iid, void **obj)
+{
+ TRACE("(%p, %s, %p)\n", outer, debugstr_guid(iid), obj);
+
+ if (!obj) return E_POINTER;
+
+ if (outer) return CLASS_E_NOAGGREGATION;
+
+ if (IsEqualGUID(&IID_ICreateDevEnum, iid))
+ {
+ *obj = &DEVENUM_CreateDevEnum;
+ return S_OK;
+ }
+ if (IsEqualGUID(&IID_IParseDisplayName, iid))
+ {
+ *obj = &DEVENUM_ParseDisplayName;
+ return S_OK;
+ }
+
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL lock)
+{
+ if (lock)
+ DEVENUM_LockModule();
+ else
+ DEVENUM_UnlockModule();
+ return S_OK;
+}
+
+static const IClassFactoryVtbl ClassFactory_vtbl = {
+ ClassFactory_QueryInterface,
+ ClassFactory_AddRef,
+ ClassFactory_Release,
+ ClassFactory_CreateInstance,
+ ClassFactory_LockServer
+};
+
+static IClassFactory devenum_cf = { &ClassFactory_vtbl };
+
/***********************************************************************
* DllGetClassObject (DEVENUM.@)
*/
@@ -69,7 +139,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
* Oh well - works just fine as it is */
if (IsEqualGUID(rclsid, &CLSID_SystemDeviceEnum) ||
IsEqualGUID(rclsid, &CLSID_CDeviceMoniker))
- return IClassFactory_QueryInterface(&DEVENUM_ClassFactory.IClassFactory_iface, iid, ppv);
+ return IClassFactory_QueryInterface(&devenum_cf, iid, ppv);
FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
return CLASS_E_CLASSNOTAVAILABLE;
diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h
index df0080d..ea4e017 100644
--- a/dlls/devenum/devenum_private.h
+++ b/dlls/devenum/devenum_private.h
@@ -51,15 +51,6 @@ extern LONG dll_refs DECLSPEC_HIDDEN;
static inline void DEVENUM_LockModule(void) { InterlockedIncrement(&dll_refs); }
static inline void DEVENUM_UnlockModule(void) { InterlockedDecrement(&dll_refs); }
-
-/**********************************************************************
- * ClassFactory declaration for devenum.dll
- */
-typedef struct
-{
- IClassFactory IClassFactory_iface;
-} ClassFactoryImpl;
-
enum device_type
{
DEVICE_FILTER,
@@ -84,7 +75,6 @@ typedef struct
MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct(void) DECLSPEC_HIDDEN;
HRESULT create_EnumMoniker(REFCLSID class, IEnumMoniker **enum_mon) DECLSPEC_HIDDEN;
-extern ClassFactoryImpl DEVENUM_ClassFactory DECLSPEC_HIDDEN;
extern ICreateDevEnum DEVENUM_CreateDevEnum DECLSPEC_HIDDEN;
extern IParseDisplayName DEVENUM_ParseDisplayName DECLSPEC_HIDDEN;
diff --git a/dlls/devenum/factory.c b/dlls/devenum/factory.c
deleted file mode 100644
index c808fa5..0000000
--- a/dlls/devenum/factory.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * ClassFactory implementation for DEVENUM.dll
- *
- * Copyright (C) 2002 John K. Hohm
- * Copyright (C) 2002 Robert Shearman
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "devenum_private.h"
-
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(devenum);
-
-/**********************************************************************
- * DEVENUM_IClassFactory_QueryInterface (also IUnknown)
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_QueryInterface(IClassFactory *iface, REFIID riid,
- void **ppvObj)
-{
- TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObj);
-
- if (ppvObj == NULL) return E_POINTER;
-
- if (IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IClassFactory))
- {
- *ppvObj = iface;
- IClassFactory_AddRef(iface);
- return S_OK;
- }
- else if (IsEqualGUID(riid, &IID_IParseDisplayName))
- {
- return IClassFactory_CreateInstance(iface, NULL, riid, ppvObj);
- }
-
- FIXME("- no interface IID: %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_AddRef (also IUnknown)
- */
-static ULONG WINAPI DEVENUM_IClassFactory_AddRef(IClassFactory *iface)
-{
- TRACE("\n");
-
- DEVENUM_LockModule();
-
- return 2; /* non-heap based object */
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_Release (also IUnknown)
- */
-static ULONG WINAPI DEVENUM_IClassFactory_Release(IClassFactory *iface)
-{
- TRACE("\n");
-
- DEVENUM_UnlockModule();
-
- return 1; /* non-heap based object */
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_CreateInstance
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_CreateInstance(IClassFactory *iface,
- IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
-{
- TRACE("(%p)->(%p, %s, %p)\n", iface, pUnkOuter, debugstr_guid(riid), ppvObj);
-
- if (ppvObj == NULL) return E_POINTER;
-
- /* Don't support aggregation (Windows doesn't) */
- if (pUnkOuter != NULL) return CLASS_E_NOAGGREGATION;
-
- if (IsEqualGUID(&IID_ICreateDevEnum, riid))
- {
- *ppvObj = &DEVENUM_CreateDevEnum;
- return S_OK;
- }
- if (IsEqualGUID(&IID_IParseDisplayName, riid))
- {
- *ppvObj = &DEVENUM_ParseDisplayName;
- return S_OK;
- }
-
- return CLASS_E_CLASSNOTAVAILABLE;
-}
-
-/**********************************************************************
- * DEVENUM_IClassFactory_LockServer
- */
-static HRESULT WINAPI DEVENUM_IClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
-{
- TRACE("\n");
-
- if (fLock)
- DEVENUM_LockModule();
- else
- DEVENUM_UnlockModule();
- return S_OK;
-}
-
-/**********************************************************************
- * IClassFactory_Vtbl
- */
-static const IClassFactoryVtbl IClassFactory_Vtbl =
-{
- DEVENUM_IClassFactory_QueryInterface,
- DEVENUM_IClassFactory_AddRef,
- DEVENUM_IClassFactory_Release,
- DEVENUM_IClassFactory_CreateInstance,
- DEVENUM_IClassFactory_LockServer
-};
-
-/**********************************************************************
- * static ClassFactory instance
- */
-ClassFactoryImpl DEVENUM_ClassFactory = { { &IClassFactory_Vtbl } };
--
2.7.4
June 26, 2018
[PATCH v2 3/3] comctl32/taskdialog: Add support for command links.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 62 +++++++++++++++++++++++++++++---
dlls/comctl32/tests/taskdialog.c | 61 +++++++++++++++++--------------
2 files changed, 93 insertions(+), 30 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 207f77b012..42d50a93cb 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -60,6 +60,8 @@ struct taskdialog_info
HWND progress_bar;
HWND *radio_buttons;
INT radio_button_count;
+ HWND *command_links;
+ INT command_link_count;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -184,7 +186,8 @@ static HWND taskdialog_find_button(HWND *buttons, INT count, INT id)
static void taskdialog_enable_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
{
- HWND hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
+ HWND hwnd = taskdialog_find_button(dialog_info->command_links, dialog_info->command_link_count, id);
+ if (!hwnd) hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
if (hwnd) EnableWindow(hwnd, enable);
}
@@ -253,6 +256,11 @@ static BOOL taskdialog_hyperlink_enabled(struct taskdialog_info *dialog_info)
return dialog_info->taskconfig->dwFlags & TDF_ENABLE_HYPERLINKS;
}
+static BOOL taskdialog_use_command_link(struct taskdialog_info *dialog_info)
+{
+ return dialog_info->taskconfig->dwFlags & (TDF_USE_COMMAND_LINKS | TDF_USE_COMMAND_LINKS_NO_ICON);
+}
+
static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size,
BOOL syslink)
{
@@ -486,6 +494,34 @@ static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
}
}
+static void taskdialog_add_command_links(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ DWORD default_style = BS_MULTILINE | BS_LEFT | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP, style;
+ BOOL is_default;
+ WCHAR *textW;
+ INT i;
+
+ if (!taskconfig->cButtons || !taskconfig->pButtons || !taskdialog_use_command_link(dialog_info)) return;
+
+ dialog_info->command_links = Alloc(taskconfig->cButtons * sizeof(*dialog_info->command_links));
+ if (!dialog_info->command_links) return;
+
+ dialog_info->command_link_count = taskconfig->cButtons;
+ for (i = 0; i < dialog_info->command_link_count; i++)
+ {
+ is_default = taskconfig->pButtons[i].nButtonID == taskconfig->nDefaultButton;
+ style = is_default ? default_style | BS_DEFCOMMANDLINK : default_style | BS_COMMANDLINK;
+ textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pButtons[i].pszButtonText);
+ dialog_info->command_links[i] = CreateWindowW(WC_BUTTONW, textW, style, 0, 0, 0, 0, dialog_info->hwnd,
+ (HMENU)taskconfig->pButtons[i].nButtonID, 0, NULL);
+ SendMessageW(dialog_info->command_links[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
+ Free(textW);
+
+ if (is_default && !dialog_info->default_button) dialog_info->default_button = dialog_info->command_links[i];
+ }
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
BOOL custom_button)
{
@@ -504,17 +540,18 @@ static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *but
static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ BOOL use_command_links = taskdialog_use_command_link(dialog_info);
DWORD flags = taskconfig->dwCommonButtons;
INT count, max_count;
/* Allocate enough memory for the custom and the default buttons. Maximum 6 default buttons possible. */
max_count = 6;
- if (taskconfig->cButtons && taskconfig->pButtons) max_count += taskconfig->cButtons;
+ if (!use_command_links && taskconfig->cButtons && taskconfig->pButtons) max_count += taskconfig->cButtons;
dialog_info->buttons = Alloc(max_count * sizeof(*dialog_info->buttons));
if (!dialog_info->buttons) return;
- for (count = 0; count < taskconfig->cButtons; count++)
+ for (count = 0; !use_command_links && count < taskconfig->cButtons; count++)
taskdialog_add_button(dialog_info, &dialog_info->buttons[count], taskconfig->pButtons[count].nButtonID,
taskconfig->pButtons[count].pszButtonText, TRUE);
@@ -532,7 +569,7 @@ static void taskdialog_add_buttons(struct taskdialog_info *dialog_info)
if (flags & TDCBF_CANCEL_BUTTON) TASKDIALOG_INIT_COMMON_BUTTON(CANCEL);
if (flags & TDCBF_CLOSE_BUTTON) TASKDIALOG_INIT_COMMON_BUTTON(CLOSE);
- if (!count) TASKDIALOG_INIT_COMMON_BUTTON(OK);
+ if (!count && !dialog_info->command_link_count) TASKDIALOG_INIT_COMMON_BUTTON(OK);
#undef TASKDIALOG_INIT_COMMON_BUTTON
dialog_info->button_count = count;
@@ -621,6 +658,19 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
dialog_height = y + size.cy;
}
+ /* Command links */
+ for (i = 0; i < dialog_info->command_link_count; i++)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height + v_spacing;
+ taskdialog_get_label_size(dialog_info, dialog_info->command_links[i], dialog_width - x - h_spacing, &size, FALSE);
+ size.cx = dialog_width - x - h_spacing;
+ /* Add spacing */
+ size.cy += 4;
+ SetWindowPos(dialog_info->command_links[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -756,9 +806,12 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_content(dialog_info);
taskdialog_add_progress_bar(dialog_info);
taskdialog_add_radio_buttons(dialog_info);
+ taskdialog_add_command_links(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
+ if (!dialog_info->default_button && dialog_info->command_links)
+ dialog_info->default_button = dialog_info->command_links[0];
if (!dialog_info->default_button) dialog_info->default_button = dialog_info->buttons[0];
SendMessageW(dialog_info->hwnd, WM_NEXTDLGCTL, (WPARAM)dialog_info->default_button, TRUE);
id = GetWindowLongW(dialog_info->default_button, GWLP_ID);
@@ -774,6 +827,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
if (dialog_info->buttons) Free(dialog_info->buttons);
if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
+ if (dialog_info->command_links) Free(dialog_info->command_links);
}
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 2cda04081f..33d3757308 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -323,7 +323,7 @@ static void test_callback(void)
static void test_buttons(void)
{
TASKDIALOGCONFIG info = {0};
-
+ static const DWORD command_link_flags[] = {0, TDF_USE_COMMAND_LINKS, TDF_USE_COMMAND_LINKS_NO_ICON};
TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
const WCHAR button_format[] = {'%','0','2','d',0};
/* Each button has two digits as title, plus null-terminator */
@@ -373,31 +373,40 @@ static void test_buttons(void)
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
- /* Test with all common and custom buttons and invalid default ID */
- info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
- info.cButtons = TEST_NUM_BUTTONS;
- info.pButtons = custom_buttons;
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
-
- info.nDefaultButton = -1; /* Should work despite button ID -1 */
- run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
-
- info.nDefaultButton = -2; /* Should also default to first created button */
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
-
- /* Test with only custom buttons and invalid default ID */
- info.dwCommonButtons = 0;
- run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
-
- /* Test with common and custom buttons and valid default ID */
- info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
- | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- info.nDefaultButton = IDRETRY;
- run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
-
- /* Test with common and custom buttons and valid default ID */
- info.nDefaultButton = ID_START_BUTTON + 3;
- run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+ /* Custom buttons could be command links */
+ for (i = 0; i < ARRAY_SIZE(command_link_flags); i++)
+ {
+ info.dwFlags = command_link_flags[i];
+
+ /* Test with all common and custom buttons and invalid default ID */
+ info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
+ info.cButtons = TEST_NUM_BUTTONS;
+ info.pButtons = custom_buttons;
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, with common buttons - 1");
+
+ info.nDefaultButton = -1; /* Should work despite button ID -1 */
+ run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
+
+ info.nDefaultButton = -2; /* Should also default to first created button */
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, with common buttons - 3");
+
+ /* Test with only custom buttons and invalid default ID */
+ info.dwCommonButtons = 0;
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1,
+ "default button: invalid default, no common buttons");
+
+ /* Test with common and custom buttons and valid default ID */
+ info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON
+ | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
+ info.nDefaultButton = IDRETRY;
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
+
+ /* Test with common and custom buttons and valid default ID */
+ info.nDefaultButton = ID_START_BUTTON + 3;
+ run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+ }
/* Test radio buttons */
info.nDefaultButton = 0;
--
2.17.1
June 26, 2018
[PATCH v2 2/3] comctl32/taskdialog: Add support for radio buttons.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 139 ++++++++++++++++++++++++-
dlls/comctl32/tests/taskdialog.c | 172 +++++++++++++++++++++++++++----
2 files changed, 290 insertions(+), 21 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 5625f2bc24..207f77b012 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -58,6 +58,8 @@ struct taskdialog_info
HWND main_instruction;
HWND content;
HWND progress_bar;
+ HWND *radio_buttons;
+ INT radio_button_count;
HWND *buttons;
INT button_count;
HWND default_button;
@@ -69,6 +71,7 @@ struct taskdialog_info
LONG h_spacing;
LONG v_spacing;
} m;
+ INT selected_radio_id;
};
struct button_layout_info
@@ -185,6 +188,18 @@ static void taskdialog_enable_button(const struct taskdialog_info *dialog_info,
if (hwnd) EnableWindow(hwnd, enable);
}
+static void taskdialog_enable_radio_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
+{
+ HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
+ if (hwnd) EnableWindow(hwnd, enable);
+}
+
+static void taskdialog_click_radio_button(const struct taskdialog_info *dialog_info, INT id)
+{
+ HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
+ if (hwnd) SendMessageW(hwnd, BM_CLICK, 0, 0);
+}
+
static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
{
const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
@@ -193,8 +208,18 @@ static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notif
: S_OK;
}
-static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
+static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, INT command_id)
{
+ HWND radio_button;
+
+ radio_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, command_id);
+ if (radio_button)
+ {
+ dialog_info->selected_radio_id = command_id;
+ taskdialog_notify(dialog_info, TDN_RADIO_BUTTON_CLICKED, command_id, 0);
+ return;
+ }
+
if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
EndDialog(dialog_info->hwnd, command_id);
}
@@ -269,6 +294,49 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
Free(text);
}
+static void taskdialog_get_radio_button_size(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
+{
+ DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
+ HFONT hfont, old_hfont;
+ HDC hdc;
+ RECT rect = {0};
+ INT text_length;
+ WCHAR *text;
+ INT text_offset, radio_box_width, radio_box_height;
+
+ hdc = GetDC(hwnd);
+ hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
+ old_hfont = SelectObject(hdc, hfont);
+
+ radio_box_width = 12 * GetDeviceCaps(hdc, LOGPIXELSX) / 96 + 1;
+ radio_box_height = 12 * GetDeviceCaps(hdc, LOGPIXELSY) / 96 + 1;
+ GetCharWidthW(hdc, '0', '0', &text_offset);
+ text_offset /= 2;
+
+ if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
+ style |= DT_RIGHT | DT_RTLREADING;
+ else
+ style |= DT_LEFT;
+
+ rect.right = max_width - radio_box_width - text_offset;
+ text_length = GetWindowTextLengthW(hwnd);
+ text = Alloc((text_length + 1) * sizeof(WCHAR));
+ if (!text)
+ {
+ size->cx = 0;
+ size->cy = 0;
+ return;
+ }
+ GetWindowTextW(hwnd, text, text_length + 1);
+ size->cy = DrawTextW(hdc, text, text_length, &rect, style);
+ size->cx = min(max_width - radio_box_width - text_offset, rect.right - rect.left);
+ size->cx += radio_box_width + text_offset;
+ size->cy = max(size->cy, radio_box_height);
+ if (old_hfont) SelectObject(hdc, old_hfont);
+ Free(text);
+ ReleaseDC(hwnd, hdc);
+}
+
static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
{
if (icon == TD_WARNING_ICON)
@@ -309,6 +377,28 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
}
}
+static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ HWND default_button;
+ INT id;
+
+ if (!dialog_info->radio_button_count) return;
+
+ default_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count,
+ taskconfig->nDefaultRadioButton);
+
+ if (!default_button && !(taskconfig->dwFlags & TDF_NO_DEFAULT_RADIO_BUTTON))
+ default_button = dialog_info->radio_buttons[0];
+
+ if (default_button)
+ {
+ SendMessageW(default_button, BM_SETCHECK, BST_CHECKED, 0);
+ id = GetWindowLongW(default_button, GWLP_ID);
+ taskdialog_on_button_click(dialog_info, id);
+ }
+}
+
static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
{
if (!dialog_info->taskconfig->u.hMainIcon) return;
@@ -372,6 +462,30 @@ static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
}
+static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
+{
+ const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
+ static const DWORD style = BS_AUTORADIOBUTTON | BS_MULTILINE | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP;
+ WCHAR *textW;
+ INT i;
+
+ if (!taskconfig->cRadioButtons || !taskconfig->pRadioButtons) return;
+
+ dialog_info->radio_buttons = Alloc(taskconfig->cRadioButtons * sizeof(*dialog_info->radio_buttons));
+ if (!dialog_info->radio_buttons) return;
+
+ dialog_info->radio_button_count = taskconfig->cRadioButtons;
+ for (i = 0; i < dialog_info->radio_button_count; i++)
+ {
+ textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pRadioButtons[i].pszButtonText);
+ dialog_info->radio_buttons[i] =
+ CreateWindowW(WC_BUTTONW, textW, i == 0 ? style | WS_GROUP : style, 0, 0, 0, 0, dialog_info->hwnd,
+ (HMENU)taskconfig->pRadioButtons[i].nButtonID, 0, NULL);
+ SendMessageW(dialog_info->radio_buttons[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
+ Free(textW);
+ }
+}
+
static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
BOOL custom_button)
{
@@ -496,6 +610,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
dialog_height = y + size.cy;
}
+ /* Radio buttons */
+ for (i = 0; i < dialog_info->radio_button_count; i++)
+ {
+ x = main_icon_right + h_spacing;
+ y = dialog_height;
+ taskdialog_get_radio_button_size(dialog_info, dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
+ size.cx = dialog_width - x - h_spacing;
+ SetWindowPos(dialog_info->radio_buttons[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
+ dialog_height = y + size.cy;
+ }
+
dialog_height = max(dialog_height, main_icon_bottom);
/* Common and custom buttons */
@@ -630,6 +755,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_add_main_instruction(dialog_info);
taskdialog_add_content(dialog_info);
taskdialog_add_progress_bar(dialog_info);
+ taskdialog_add_radio_buttons(dialog_info);
taskdialog_add_buttons(dialog_info);
/* Set default button */
@@ -647,6 +773,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
if (dialog_info->font) DeleteObject(dialog_info->font);
if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
if (dialog_info->buttons) Free(dialog_info->buttons);
+ if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
}
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -698,6 +825,12 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case TDM_SET_PROGRESS_BAR_MARQUEE:
SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
break;
+ case TDM_CLICK_RADIO_BUTTON:
+ taskdialog_click_radio_button(dialog_info, wParam);
+ break;
+ case TDM_ENABLE_RADIO_BUTTON:
+ taskdialog_enable_radio_button(dialog_info, wParam, lParam);
+ break;
case WM_INITDIALOG:
dialog_info = (struct taskdialog_info *)lParam;
@@ -706,6 +839,8 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
+ /* Default radio button click notification sent after TDN_CREATED */
+ taskdialog_check_default_radio_buttons(dialog_info);
return FALSE;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
@@ -771,7 +906,7 @@ HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *butto
Free(template);
if (button) *button = ret;
- if (radio_button) *radio_button = taskconfig->nDefaultButton;
+ if (radio_button) *radio_button = dialog_info.selected_radio_id;
if (verification_flag_checked) *verification_flag_checked = TRUE;
return S_OK;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index e91a878876..2cda04081f 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -35,9 +35,11 @@
#define TASKDIALOG_SEQ_INDEX 0
#define TEST_NUM_BUTTONS 10 /* Number of custom buttons to test with */
+#define TEST_NUM_RADIO_BUTTONS 3
#define ID_START 20 /* Lower IDs might be used by the system */
#define ID_START_BUTTON (ID_START + 0)
+#define ID_START_RADIO_BUTTON (ID_START + 20)
static HRESULT (WINAPI *pTaskDialogIndirect)(const TASKDIALOGCONFIG *, int *, int *, BOOL *);
static HRESULT (WINAPI *pTaskDialog)(HWND, HINSTANCE, const WCHAR *, const WCHAR *, const WCHAR *,
@@ -141,6 +143,78 @@ static const struct message_info msg_got_tdn_help[] =
{ 0 }
};
+/* Three radio buttons */
+static const struct message_info msg_return_default_radio_button_1[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_2[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_3[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, -2, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_select_first_radio_button[] =
+{
+ { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_return_first_radio_button[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_radio_button },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_select_first_disabled_radio_button_and_press_ok[] =
+{
+ { TDM_ENABLE_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
+ { TDM_CLICK_BUTTON, IDOK, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_return_default_radio_button_clicking_disabled[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, NULL },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_disabled_radio_button_and_press_ok },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_no_default_radio_button_flag[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
+ { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_return_no_default_radio_button_id_and_flag[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
{
msg->message = WM_TD_CALLBACK;
@@ -151,11 +225,13 @@ static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct
msg->stage = 0;
}
-#define run_test(info, expect_button, seq, context) \
- run_test_(info, expect_button, seq, context, ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
+#define run_test(info, expect_button, expect_radio_button, seq, context) \
+ run_test_(info, expect_button, expect_radio_button, seq, context, \
+ ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
-static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct message_info *test_messages,
- const char *context, int test_messages_len, const char *file, int line)
+static void run_test_(TASKDIALOGCONFIG *info, int expect_button, int expect_radio_button,
+ const struct message_info *test_messages, const char *context, int test_messages_len,
+ const char *file, int line)
{
struct message *msg, *msg_start;
int ret_button = 0;
@@ -182,6 +258,8 @@ static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct me
ok_sequence_(sequences, TASKDIALOG_SEQ_INDEX, msg_start, context, FALSE, file, line);
ok_(file, line)(ret_button == expect_button,
"Wrong button. Expected %d, got %d\n", expect_button, ret_button);
+ ok_(file, line)(ret_radio == expect_radio_button,
+ "Wrong radio button. Expected %d, got %d\n", expect_radio_button, ret_radio);
heap_free(msg_start);
}
@@ -239,16 +317,17 @@ static void test_callback(void)
info.pfCallback = taskdialog_callback_proc;
info.lpCallbackData = test_ref_data;
- run_test(&info, IDOK, msg_return_press_ok, "Press VK_RETURN.");
+ run_test(&info, IDOK, 0, msg_return_press_ok, "Press VK_RETURN.");
}
static void test_buttons(void)
{
TASKDIALOGCONFIG info = {0};
- TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS];
+ TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
const WCHAR button_format[] = {'%','0','2','d',0};
- WCHAR button_titles[TEST_NUM_BUTTONS * 3]; /* Each button has two digits as title, plus null-terminator */
+ /* Each button has two digits as title, plus null-terminator */
+ WCHAR button_titles[TEST_NUM_BUTTONS * 3], radio_button_titles[TEST_NUM_BUTTONS * 3];
int i;
info.cbSize = sizeof(TASKDIALOGCONFIG);
@@ -266,48 +345,103 @@ static void test_buttons(void)
}
custom_buttons[TEST_NUM_BUTTONS - 1].nButtonID = -1;
+ /* Init radio buttons */
+ for (i = 0; i < TEST_NUM_RADIO_BUTTONS; i++)
+ {
+ WCHAR *text = &radio_button_titles[i * 3];
+ wsprintfW(text, button_format, i);
+
+ radio_buttons[i].pszButtonText = text;
+ radio_buttons[i].nButtonID = ID_START_RADIO_BUTTON + i;
+ }
+ radio_buttons[TEST_NUM_RADIO_BUTTONS - 1].nButtonID = -2;
+
/* Test nDefaultButton */
/* Test common buttons with invalid default ID */
info.nDefaultButton = 0; /* Should default to first created button */
info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDOK, msg_return_press_ok, "default button: unset default");
+ run_test(&info, IDOK, 0, msg_return_press_ok, "default button: unset default");
info.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDYES, msg_return_press_yes, "default button: unset default");
+ run_test(&info, IDYES, 0, msg_return_press_yes, "default button: unset default");
info.dwCommonButtons = TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDNO, msg_return_press_no, "default button: unset default");
+ run_test(&info, IDNO, 0, msg_return_press_no, "default button: unset default");
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDRETRY, msg_return_press_retry, "default button: unset default");
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: unset default");
info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
- run_test(&info, IDCANCEL, msg_return_press_cancel, "default button: unset default");
+ run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
/* Test with all common and custom buttons and invalid default ID */
info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
info.cButtons = TEST_NUM_BUTTONS;
info.pButtons = custom_buttons;
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
info.nDefaultButton = -1; /* Should work despite button ID -1 */
- run_test(&info, -1, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
+ run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
info.nDefaultButton = -2; /* Should also default to first created button */
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
/* Test with only custom buttons and invalid default ID */
info.dwCommonButtons = 0;
- run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, no common buttons");
+ run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
/* Test with common and custom buttons and valid default ID */
info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
| TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
info.nDefaultButton = IDRETRY;
- run_test(&info, IDRETRY, msg_return_press_retry, "default button: valid default - 1");
+ run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
/* Test with common and custom buttons and valid default ID */
info.nDefaultButton = ID_START_BUTTON + 3;
- run_test(&info, ID_START_BUTTON + 3, msg_return_press_custom4, "default button: valid default - 2");
+ run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
+
+ /* Test radio buttons */
+ info.nDefaultButton = 0;
+ info.cButtons = 0;
+ info.pButtons = 0;
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
+ info.pRadioButtons = radio_buttons;
+
+ /* Test default first radio button */
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_1, "default radio button: default first radio button");
+
+ /* Test default radio button */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_2, "default radio button: default radio button");
+
+ /* Test default radio button with -2 */
+ info.nDefaultRadioButton = -2;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_3, "default radio button: default radio button with id -2");
+
+ /* Test default radio button after clicking the first, messages still work even radio button is disabled */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_first_radio_button, "default radio button: radio button after clicking");
+
+ /* Test radio button after disabling and clicking the first */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
+ run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_clicking_disabled, "default radio button: disable radio button before clicking");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set, TDN_RADIO_BUTTON_CLICKED will still be received, just radio button not selected */
+ info.nDefaultRadioButton = ID_START_RADIO_BUTTON;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_no_default_radio_button_flag, "default radio button: no default radio flag");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is 0.
+ * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
+ info.nDefaultRadioButton = 0;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default radio id and flag");
+
+ /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is invalid.
+ * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
+ info.nDefaultRadioButton = 0xff;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default flag, invalid id");
}
static void test_help(void)
@@ -319,7 +453,7 @@ static void test_help(void)
info.lpCallbackData = test_ref_data;
info.dwCommonButtons = TDCBF_OK_BUTTON;
- run_test(&info, IDOK, msg_got_tdn_help, "send f1");
+ run_test(&info, IDOK, 0, msg_got_tdn_help, "send f1");
}
struct timer_notification_data
--
2.17.1
June 26, 2018
[PATCH v2 1/3] comctl32/taskdialog: Use dynamic buffer for taskdialog_get_label_size().
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 33fb578910..5625f2bc24 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -235,7 +235,7 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
HFONT hfont, old_hfont;
HDC hdc;
RECT rect = {0};
- WCHAR text[1024];
+ WCHAR *text;
INT text_length;
if (syslink)
@@ -250,7 +250,15 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
style |= DT_LEFT;
hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
- text_length = GetWindowTextW(hwnd, text, ARRAY_SIZE(text));
+ text_length = GetWindowTextLengthW(hwnd);
+ text = Alloc((text_length + 1) * sizeof(WCHAR));
+ if (!text)
+ {
+ size->cx = 0;
+ size->cy = 0;
+ return;
+ }
+ GetWindowTextW(hwnd, text, text_length + 1);
hdc = GetDC(hwnd);
old_hfont = SelectObject(hdc, hfont);
rect.right = max_width;
@@ -258,6 +266,7 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
size->cx = min(max_width, rect.right - rect.left);
if (old_hfont) SelectObject(hdc, old_hfont);
ReleaseDC(hwnd, hdc);
+ Free(text);
}
static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
--
2.17.1
June 26, 2018
Re: [PATCH v2 4/4] winemac.drv: Implement waking up the display when activity occurs.
by Ken Thomases
This prevents display sleep and/or wakes a sleeping display, but doesn't prevent the screensaver from kicking in. We don't know why and don't see any other suitable API, so:
Signed-off-by: Ken Thomases <ken(a)codeweavers.com>
June 25, 2018
[PATCH 3/3] wsdapi: Send Probe Matches message via UDP unicast.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/network.c | 32 ++++++++++++++++++++++++++++++++
dlls/wsdapi/soap.c | 4 ++--
dlls/wsdapi/tests/discovery.c | 22 +++++++++++-----------
dlls/wsdapi/wsdapi_internal.h | 1 +
4 files changed, 46 insertions(+), 13 deletions(-)
June 25, 2018
[PATCH 2/3] wsdapi: Implement generation of ProbeMatches message.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/soap.c | 169
+++++++++++++++++++++++++++++++++++++++++-
dlls/wsdapi/tests/discovery.c | 2 +-
2 files changed, 169 insertions(+), 2 deletions(-)
June 25, 2018
[PATCH 1/3] wsdapi: Implement matching of names in MatchProbeEx.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/discovery.c | 58
++++++++++++++++++++++++++++++++++++++++---
dlls/wsdapi/soap.c | 9 +++++++
dlls/wsdapi/wsdapi_internal.h | 6 +++++
3 files changed, 69 insertions(+), 4 deletions(-)
June 25, 2018
wine-3.0.2-rc3 Available
by Michael Stefaniuc
Hello guys,
I have pushed wine-3.0.2-rc3 (with tag) to
https://github.com/mstefani/wine-stable/tree/stable
http://static-winehq.193b.starter-ca-central-1.openshiftapps.com/stable/
Changes since rc2:
- Added "ddraw: Fix D3DEXECUTEDATA.dwSize handling." as that is a
dependency for "ddraw: Don't read past the end of the executebuffer."
bye
michael
June 25, 2018
Re: [PATCH v2] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
On 25/06/18 15:09, Alexandre Julliard wrote:
> Zebediah Figura <z.figura12(a)gmail.com> writes:
>
>> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
>> ---
>> dlls/hnetcfg/apps.c | 17 ++++++++++++-----
>> dlls/hnetcfg/tests/policy.c | 5 ++++-
>> 2 files changed, 16 insertions(+), 6 deletions(-)
>
> It doesn't work here:
>
> ../../../tools/runtest -q -P wine -T ../../.. -M hnetcfg.dll -p hnetcfg_test.exe.so policy && touch policy.ok
> 0009:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x7bc4ed69
> Makefile:183: recipe for target 'policy.ok' failed
>
Sorry I'm so sloppy today. Updated version sent.
June 25, 2018
[PATCH v3] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/apps.c | 17 ++++++++++++-----
dlls/hnetcfg/tests/policy.c | 5 ++++-
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
index 34ef108..69eabd6 100644
--- a/dlls/hnetcfg/apps.c
+++ b/dlls/hnetcfg/apps.c
@@ -268,7 +268,7 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
{
fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
UNIVERSAL_NAME_INFOW *info;
- WCHAR *netpath;
+ WCHAR *path;
DWORD res;
DWORD sz;
@@ -281,22 +281,29 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, NULL, &sz);
if (res == WN_MORE_DATA)
{
- if (!(netpath = heap_alloc(sz)))
+ if (!(path = heap_alloc(sz)))
return E_OUTOFMEMORY;
- info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ info = (UNIVERSAL_NAME_INFOW *)&path;
res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
if (res == NO_ERROR)
{
SysFreeString(This->filename);
This->filename = SysAllocString(info->lpUniversalName);
}
- heap_free(netpath);
+ heap_free(path);
return HRESULT_FROM_WIN32(res);
}
+ sz = GetFullPathNameW(image, 0, NULL, NULL);
+ if (!(path = heap_alloc(++sz * sizeof(WCHAR))))
+ return E_OUTOFMEMORY;
+
+ GetFullPathNameW(image, sz, path, NULL);
+
SysFreeString( This->filename );
- This->filename = SysAllocString(image);
+ This->filename = SysAllocString(path);
+ heap_free(path);
return This->filename ? S_OK : E_OUTOFMEMORY;
}
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index f2d1372..954af5c 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -107,6 +107,7 @@ static void test_NetFwAuthorizedApplication(void)
INetFwAuthorizedApplication *app;
static WCHAR empty[] = {0};
UNIVERSAL_NAME_INFOW *info;
+ WCHAR fullpath[MAX_PATH];
WCHAR netpath[MAX_PATH];
WCHAR image[MAX_PATH];
HRESULT hr;
@@ -138,13 +139,15 @@ static void test_NetFwAuthorizedApplication(void)
ok(hr == S_OK, "got: %08x\n", hr);
SysFreeString(bstr);
+ GetFullPathNameW(image, ARRAY_SIZE(fullpath), fullpath, NULL);
+
info = (UNIVERSAL_NAME_INFOW *)&netpath;
sz = sizeof(netpath);
hr = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
if (hr != NO_ERROR)
{
info->lpUniversalName = netpath + sizeof(*info)/sizeof(WCHAR);
- lstrcpyW(info->lpUniversalName, image);
+ lstrcpyW(info->lpUniversalName, fullpath);
}
hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
--
2.7.4
June 25, 2018
Re: [PATCH v2] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Alexandre Julliard
Zebediah Figura <z.figura12(a)gmail.com> writes:
> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> ---
> dlls/hnetcfg/apps.c | 17 ++++++++++++-----
> dlls/hnetcfg/tests/policy.c | 5 ++++-
> 2 files changed, 16 insertions(+), 6 deletions(-)
It doesn't work here:
../../../tools/runtest -q -P wine -T ../../.. -M hnetcfg.dll -p hnetcfg_test.exe.so policy && touch policy.ok
0009:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x7bc4ed69
Makefile:183: recipe for target 'policy.ok' failed
--
Alexandre Julliard
julliard(a)winehq.org
June 25, 2018
[PATCH v2 4/4] winemac.drv: Implement waking up the display when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winemac.drv/macdrv_main.c | 12 ++++++++++++
dlls/winemac.drv/winemac.drv.spec | 3 +++
2 files changed, 15 insertions(+)
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 491ab06..ea0beec 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -451,3 +451,15 @@ BOOL CDECL macdrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr_p
}
return FALSE;
}
+
+/***********************************************************************
+ * wine_notify_activity (MACDRV.@)
+ *
+ * Notify the display server that activity has occurred, e.g. to wake up
+ * the display and reset any power management related timeouts.
+ */
+void CDECL macdrv_notify_activity(void)
+{
+ static IOPMAssertionID assertion;
+ IOPMAssertionDeclareUserActivity(CFSTR("Wine user input"), kIOPMUserActiveLocal, &assertion);
+}
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 6fa723a..9658fad 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -45,6 +45,9 @@
@ cdecl WindowPosChanged(long long long ptr ptr ptr ptr ptr) macdrv_WindowPosChanged
@ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) macdrv_WindowPosChanging
+# Desktop
+@ cdecl wine_notify_activity() macdrv_notify_activity
+
# System tray
@ cdecl wine_notify_icon(long ptr)
--
2.7.4
June 25, 2018
[PATCH v2 3/4] winex11.drv: Implement waking up the display when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winex11.drv/winex11.drv.spec | 1 +
dlls/winex11.drv/x11drv_main.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 614f0b9..c833edb 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -57,6 +57,7 @@
# Desktop
@ cdecl wine_create_desktop(long long) X11DRV_create_desktop
+@ cdecl wine_notify_activity() X11DRV_notify_activity
# System tray
@ cdecl wine_notify_icon(long ptr)
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 4654556..0dbd4f6 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -739,3 +739,15 @@ BOOL CDECL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_p
}
return FALSE; /* let user32 handle it */
}
+
+/***********************************************************************
+ * wine_notify_activity (X11DRV.@)
+ *
+ * Notify the display server that activity has occurred, e.g. to wake up
+ * the display and reset any power management related timeouts.
+ */
+void CDECL X11DRV_notify_activity(void)
+{
+ XResetScreenSaver( gdi_display );
+ XFlush( gdi_display );
+}
--
2.7.4
June 25, 2018
[PATCH v2 2/4] dinput: Notify the desktop window when device input is received.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dinput/device.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 7b83a39..daa6406 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -39,6 +39,8 @@
#include "device_private.h"
#include "dinput_private.h"
+#define WM_WINE_NOTIFY_ACTIVITY WM_USER
+
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
@@ -935,6 +937,8 @@ void queue_event(LPDIRECTINPUTDEVICE8A iface, int inst_id, DWORD data, DWORD tim
/* Event is being set regardless of the queue state */
if (This->hEvent) SetEvent(This->hEvent);
+ SendMessageW(GetDesktopWindow(), WM_WINE_NOTIFY_ACTIVITY, 0, 0);
+
if (!This->queue_len || This->overflow || ofs < 0) return;
next_pos = (This->queue_head + 1) % This->queue_len;
--
2.7.4
June 25, 2018
[PATCH v2 1/4] explorer: Add a private message to notify the graphics driver when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
programs/explorer/desktop.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index a2d9e1a..f5a01c2 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -46,6 +46,10 @@ static const WCHAR default_driver[] = {'m','a','c',',','x','1','1',0};
static const WCHAR default_driver[] = {'x','1','1',0};
#endif
+static void (CDECL *wine_notify_activity)(void);
+
+#define WM_WINE_NOTIFY_ACTIVITY WM_USER
+
static BOOL using_root;
struct launcher
@@ -661,6 +665,11 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
}
return 0;
+ case WM_WINE_NOTIFY_ACTIVITY:
+ if (wine_notify_activity)
+ wine_notify_activity();
+ return 0;
+
default:
return DefWindowProcW( hwnd, message, wp, lp );
}
@@ -1005,6 +1014,8 @@ void manage_desktop( WCHAR *arg )
{
pShellDDEInit( TRUE );
}
+
+ wine_notify_activity = (void *)GetProcAddress( graphics_driver, "wine_notify_activity" );
}
}
--
2.7.4
June 25, 2018
[PATCH] gdi32/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/gdi32/tests/bitmap.c | 10 ++++-----
dlls/gdi32/tests/brush.c | 2 +-
dlls/gdi32/tests/dc.c | 6 +++---
dlls/gdi32/tests/dib.c | 38 ++++++++++++++++-----------------
dlls/gdi32/tests/font.c | 52 ++++++++++++++++++++++-----------------------
dlls/gdi32/tests/gdiobj.c | 2 +-
dlls/gdi32/tests/icm.c | 2 +-
dlls/gdi32/tests/metafile.c | 7 +++---
dlls/gdi32/tests/path.c | 14 ++++++------
dlls/gdi32/tests/pen.c | 2 +-
10 files changed, 67 insertions(+), 68 deletions(-)
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index a4002c83b5..4748691791 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -84,7 +84,7 @@ static void test_bitmap_info(HBITMAP hbm, INT expected_depth, const BITMAPINFOHE
SetLastError(0xdeadbeef);
test_size[0] = bm.bmWidthBytes * bm.bmHeight;
/* NULL output buffer with different count values */
- for (i = 0; i < sizeof(test_size) / sizeof(test_size[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_size); i++)
{
ret = GetBitmapBits(hbm, test_size[i], NULL);
ok(ret == bm.bmWidthBytes * bm.bmHeight, "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight);
@@ -94,7 +94,7 @@ static void test_bitmap_info(HBITMAP hbm, INT expected_depth, const BITMAPINFOHE
memset(buf_cmp, 0, bm.bmWidthBytes * bm.bmHeight);
/* Correct output buffer with different count values */
- for (i = 0; i < sizeof(test_size) / sizeof(test_size[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_size); i++)
{
int expect = i == 1 ? 0 : bm.bmWidthBytes * bm.bmHeight;
memset(buf, 0xAA, sizeof(buf));
@@ -1745,7 +1745,7 @@ static void test_mono_bitmap(void)
SelectObject( hdc, hbmp );
- for (col = 0; col < sizeof(colors) / sizeof(colors[0]); col++)
+ for (col = 0; col < ARRAY_SIZE(colors); col++)
{
SetTextColor( hdc, colors[col][0] );
SetBkColor( hdc, colors[col][1] );
@@ -2690,7 +2690,7 @@ static void test_select_object(void)
DeleteObject(hbm);
- for(i = 0; i < sizeof(depths)/sizeof(depths[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(depths); i++) {
/* test a color bitmap to dc bpp matching */
planes = GetDeviceCaps(hdc, PLANES);
bpp = GetDeviceCaps(hdc, BITSPIXEL);
@@ -5710,7 +5710,7 @@ static void test_D3DKMTCreateDCFromMemory( void )
status = pD3DKMTCreateDCFromMemory( NULL );
ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status);
- for (i = 0; i < sizeof(test_data) / sizeof(*test_data); ++i)
+ for (i = 0; i < ARRAY_SIZE(test_data); ++i)
{
memset( data, 0xaa, sizeof(data) );
diff --git a/dlls/gdi32/tests/brush.c b/dlls/gdi32/tests/brush.c
index 1a10429c05..a3ebb91e1e 100644
--- a/dlls/gdi32/tests/brush.c
+++ b/dlls/gdi32/tests/brush.c
@@ -48,7 +48,7 @@ static void test_solidbrush(void)
size_t i;
INT ret;
- for(i=0; i<sizeof(stock)/sizeof(stock[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(stock); i++) {
solidBrush = CreateSolidBrush(stock[i].color);
if(stock[i].stockobj != -1) {
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 3c1fa603a6..5ad3b31483 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -361,7 +361,7 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr, int scale
if (GetObjectType( hdc ) == OBJ_METADC)
{
- for (i = 0; i < sizeof(caps)/sizeof(caps[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(caps); i++)
ok( GetDeviceCaps( hdc, caps[i] ) == (caps[i] == TECHNOLOGY ? DT_METAFILE : 0),
"wrong caps on %s for %u: %u\n", descr, caps[i],
GetDeviceCaps( hdc, caps[i] ) );
@@ -384,7 +384,7 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr, int scale
}
else
{
- for (i = 0; i < sizeof(caps)/sizeof(caps[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(caps); i++)
{
INT precision = 0;
INT hdc_caps = GetDeviceCaps( hdc, caps[i] );
@@ -506,7 +506,7 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr, int scale
dib = CreateDIBSection( ref_dc, info, DIB_RGB_COLORS, NULL, NULL, 0 );
old = SelectObject( hdc, dib );
- for (i = 0; i < sizeof(caps)/sizeof(caps[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(caps); i++)
ok( GetDeviceCaps( hdc, caps[i] ) == GetDeviceCaps( ref_dc, caps[i] ),
"mismatched caps on %s and DIB for %u: %u/%u\n", descr, caps[i],
GetDeviceCaps( hdc, caps[i] ), GetDeviceCaps( ref_dc, caps[i] ) );
diff --git a/dlls/gdi32/tests/dib.c b/dlls/gdi32/tests/dib.c
index e3f188749d..d16cb0df5c 100644
--- a/dlls/gdi32/tests/dib.c
+++ b/dlls/gdi32/tests/dib.c
@@ -1559,7 +1559,7 @@ static const POINT polypoly_lines[] =
static const DWORD polypoly_counts[] =
{
- sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
+ ARRAY_SIZE(polypoly_lines)
};
static const RECT patblt_clips[] =
@@ -1816,7 +1816,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
}
compare_hash(hdc, bmi, bits, "diagonal solid lines");
- for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(bias_check); i++)
{
MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
@@ -1851,21 +1851,21 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
DeleteObject(hrgn2);
- for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
{
MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
}
compare_hash(hdc, bmi, bits, "clipped solid hlines");
- for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
{
MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
}
compare_hash(hdc, bmi, bits, "clipped solid vlines");
- for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(line_clips); i++)
{
MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
@@ -1873,7 +1873,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
/* clipped PatBlt */
- for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(patblt_clips); i++)
{
PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
patblt_clips[i].right - patblt_clips[i].left,
@@ -1887,35 +1887,35 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
SetBkMode(hdc, TRANSPARENT);
SetBkColor(hdc, RGB(0, 0xff, 0));
- for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
{
MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
}
compare_hash(hdc, bmi, bits, "clipped dashed hlines");
- for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
{
MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
}
compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
- for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
{
MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
}
compare_hash(hdc, bmi, bits, "clipped dashed vlines");
- for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
{
MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
}
compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
- for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(line_clips); i++)
{
MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
@@ -1924,7 +1924,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
SetBkMode(hdc, OPAQUE);
- for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(line_clips); i++)
{
MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
@@ -2163,13 +2163,13 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
SelectObject(hdc, solid_pen);
SelectObject(hdc, solid_brush);
- for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(rectangles); i++)
{
Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
}
SelectObject(hdc, dashed_pen);
- for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
+ for(i = 0; i < ARRAY_SIZE(rectangles); i++)
{
Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
}
@@ -2775,7 +2775,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
SelectObject( hdc, wide_pen );
- for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
+ for (i = 0; i < ARRAY_SIZE(wide_lines); i++)
{
MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
@@ -2794,7 +2794,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
9, &log_brush, 0, NULL );
SelectObject( hdc, wide_pen );
SetBrushOrgEx( hdc, 3, 3, NULL );
- Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
+ Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
compare_hash_broken_todo( hdc, bmi, bits, "wide pen - flat caps, mitred", is_ddb, is_ddb );
SetBrushOrgEx( hdc, 0, 0, NULL );
@@ -2805,7 +2805,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
16, &log_brush, 0, NULL );
SelectObject( hdc, wide_pen );
- Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
+ Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
compare_hash_broken_todo( hdc, bmi, bits, "wide pen - square caps, bevelled", is_ddb, is_ddb );
SelectObject( hdc, orig_pen );
@@ -2815,7 +2815,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
9, &log_brush, 0, NULL );
SelectObject( hdc, wide_pen );
- PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
+ PolyPolyline( hdc, polypoly_lines, polypoly_counts, ARRAY_SIZE( polypoly_counts ));
compare_hash_broken_todo( hdc, bmi, bits, "wide pen - empty segments", is_ddb, is_ddb );
SelectObject( hdc, orig_pen );
@@ -2833,7 +2833,7 @@ static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
12, &log_brush, 0, NULL );
ok( wide_pen != 0, "failed to create pen\n" );
SelectObject( hdc, wide_pen );
- Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
+ Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
for (i = 1; i < 20; i++)
{
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 6243a6d339..8f5454b918 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -937,7 +937,7 @@ static void test_bitmap_font_metrics(void)
screen_log_pixels = GetDeviceCaps(hdc, LOGPIXELSY);
diff = 32768;
font_res = 0;
- for (i = 0; i < sizeof(font_log_pixels)/sizeof(font_log_pixels[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(font_log_pixels); i++)
{
int new_diff = abs(font_log_pixels[i] - screen_log_pixels);
if (new_diff < diff)
@@ -948,7 +948,7 @@ static void test_bitmap_font_metrics(void)
}
trace("best font resolution is %d\n", font_res);
- for (i = 0; i < sizeof(fd)/sizeof(fd[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(fd); i++)
{
int bit, height;
@@ -1190,7 +1190,7 @@ static void test_GetCharABCWidths(void)
UINT cs;
UINT a;
UINT w;
- BOOL r[sizeof range / sizeof range[0]];
+ BOOL r[ARRAY_SIZE(range)];
} c[] =
{
{ANSI_CHARSET, 0x30, 0x30,
@@ -1253,7 +1253,7 @@ static void test_GetCharABCWidths(void)
hfont = SelectObject(hdc, hfont);
DeleteObject(hfont);
- for (i = 0; i < sizeof c / sizeof c[0]; ++i)
+ for (i = 0; i < ARRAY_SIZE(c); ++i)
{
ABC a[2], w[2];
ABC full[256];
@@ -1285,7 +1285,7 @@ static void test_GetCharABCWidths(void)
ok(memcmp(&a[0], &full[code], sizeof(ABC)) == 0,
"GetCharABCWidthsA info should match. codepage = %u\n", c[i].cs);
- for (j = 0; j < sizeof range / sizeof range[0]; ++j)
+ for (j = 0; j < ARRAY_SIZE(range); ++j)
{
memset(full, 0xdd, sizeof full);
ret = pGetCharABCWidthsA(hdc, range[j].first, range[j].last, full);
@@ -1774,7 +1774,7 @@ static void test_GetKerningPairs(void)
return;
}
- for (i = 0; i < sizeof(kd)/sizeof(kd[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(kd); i++)
{
OUTLINETEXTMETRICW otm;
UINT uiRet;
@@ -2095,7 +2095,7 @@ static void test_height_selection_vdmx( HDC hdc )
return;
}
- for (i = 0; i < sizeof(data) / sizeof(data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(data); i++)
{
res = get_res_data( "wine_vdmx.ttf", &size );
@@ -2356,7 +2356,7 @@ static void testJustification(HDC hdc, PCSTR str, RECT *clientArea)
{
SetTextJustification(hdc, areaWidth - size.cx, breakCount);
GetTextExtentPoint32A(hdc, pFirstChar, pLastChar - pFirstChar, &size);
- if (size.cx != areaWidth && nErrors < sizeof(error)/sizeof(error[0]) - 1)
+ if (size.cx != areaWidth && nErrors < ARRAY_SIZE(error) - 1)
{
error[nErrors].start = pFirstChar;
error[nErrors].len = pLastChar - pFirstChar;
@@ -2613,7 +2613,7 @@ static void test_font_charset(void)
return;
}
- for (i = 0; i < sizeof(cd)/sizeof(cd[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(cd); i++)
{
if (cd[i].charset == SYMBOL_CHARSET)
{
@@ -2687,7 +2687,7 @@ static void test_GdiGetCodePage(void)
acp = GetACP();
- for (i = 0; i < sizeof(matching_data) / sizeof(struct _matching_data); i++)
+ for (i = 0; i < ARRAY_SIZE(matching_data); i++)
{
/* only test data matched current locale codepage */
if (matching_data[i].current_codepage != acp)
@@ -3700,7 +3700,7 @@ static int match_name_table_language( const sfnt_name *name, LANGID lang )
break;
case TT_PLATFORM_MACINTOSH:
if (!IsValidCodePage( get_mac_code_page( name ))) return 0;
- if (GET_BE_WORD(name->language_id) >= sizeof(mac_langid_table)/sizeof(mac_langid_table[0])) return 0;
+ if (GET_BE_WORD(name->language_id) >= ARRAY_SIZE(mac_langid_table)) return 0;
name_lang = mac_langid_table[GET_BE_WORD(name->language_id)];
break;
case TT_PLATFORM_APPLE_UNICODE:
@@ -3710,7 +3710,7 @@ static int match_name_table_language( const sfnt_name *name, LANGID lang )
case TT_APPLE_ID_DEFAULT:
case TT_APPLE_ID_ISO_10646:
case TT_APPLE_ID_UNICODE_2_0:
- if (GET_BE_WORD(name->language_id) >= sizeof(mac_langid_table)/sizeof(mac_langid_table[0])) return 0;
+ if (GET_BE_WORD(name->language_id) >= ARRAY_SIZE(mac_langid_table)) return 0;
name_lang = mac_langid_table[GET_BE_WORD(name->language_id)];
break;
default:
@@ -4105,7 +4105,7 @@ static void test_nonexistent_font(void)
hdc = CreateCompatibleDC(0);
- for (i = 0; i < sizeof(shell_subst)/sizeof(shell_subst[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(shell_subst); i++)
{
ret = is_font_installed(shell_subst[i].name);
ok(ret || broken(!ret) /* win2000 */, "%s should be enumerated\n", shell_subst[i].name);
@@ -4201,7 +4201,7 @@ todo_wine /* Wine uses Arial for all substitutions */
ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d\n", cs);
DeleteObject(SelectObject(hdc, hfont));
- for (i = 0; i < sizeof(font_subst)/sizeof(font_subst[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(font_subst); i++)
{
ret = is_font_installed(font_subst[i].name);
todo_wine
@@ -4487,8 +4487,8 @@ static void test_GetTextFace(void)
dc = GetDC(NULL);
g = SelectObject(dc, f);
- n = GetTextFaceW(dc, sizeof bufW / sizeof bufW[0], bufW);
- ok(n == sizeof faceW / sizeof faceW[0], "GetTextFaceW returned %d\n", n);
+ n = GetTextFaceW(dc, ARRAY_SIZE(bufW), bufW);
+ ok(n == ARRAY_SIZE(faceW), "GetTextFaceW returned %d\n", n);
ok(lstrcmpW(faceW, bufW) == 0, "GetTextFaceW\n");
/* Play with the count arg. */
@@ -4508,7 +4508,7 @@ static void test_GetTextFace(void)
ok(bufW[0] == faceW[0] && bufW[1] == '\0', "GetTextFaceW didn't copy\n");
n = GetTextFaceW(dc, 0, NULL);
- ok(n == sizeof faceW / sizeof faceW[0], "GetTextFaceW returned %d\n", n);
+ ok(n == ARRAY_SIZE(faceW), "GetTextFaceW returned %d\n", n);
DeleteObject(SelectObject(dc, g));
ReleaseDC(NULL, dc);
@@ -4719,7 +4719,7 @@ static void test_GetGlyphOutline(void)
if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
ok(ret == GDI_ERROR, "GetGlyphOutlineW should return an error when the buffer size is too small.\n");
- for (i = 0; i < sizeof(fmt) / sizeof(fmt[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(fmt); ++i)
{
DWORD dummy;
@@ -4785,7 +4785,7 @@ static void test_GetGlyphOutline(void)
SelectObject(hdc, old_hfont);
DeleteObject(hfont);
- for (i = 0; i < sizeof c / sizeof c[0]; ++i)
+ for (i = 0; i < ARRAY_SIZE(c); ++i)
{
static const MAT2 rotate_mat = {{0, 0}, {0, -1}, {0, 1}, {0, 0}};
TEXTMETRICA tm;
@@ -4955,7 +4955,7 @@ static void test_CreateFontIndirect(void)
lf.lfItalic = FALSE;
lf.lfWeight = FW_DONTCARE;
- for (i = 0; i < sizeof(TestName)/sizeof(TestName[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(TestName); i++)
{
lstrcpyA(lf.lfFaceName, TestName[i]);
hfont = CreateFontIndirectA(&lf);
@@ -5409,7 +5409,7 @@ static void test_fullname(void)
lf.lfItalic = FALSE;
lf.lfWeight = FW_DONTCARE;
- for (i = 0; i < sizeof(TestName) / sizeof(TestName[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(TestName); i++)
{
if (!is_font_installed_fullname("Lucida Sans", TestName[i]))
{
@@ -6058,7 +6058,7 @@ static void test_vertical_font(void)
ok(hgi != vgi, "same glyph h:%u v:%u\n", hgi, vgi);
- for (i = 0; i < sizeof(face_list)/sizeof(face_list[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(face_list); i++) {
const char* face = face_list[i];
if (!is_truetype_font_installed(face)) {
skip("%s is not installed\n", face);
@@ -6092,7 +6092,7 @@ static void test_east_asian_font_selection(void)
hdc = GetDC(NULL);
- for (i = 0; i < sizeof(charset)/sizeof(charset[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(charset); i++)
{
LOGFONTA lf;
HFONT hfont;
@@ -6214,7 +6214,7 @@ static void test_stock_fonts(void)
};
int i, j;
- for (i = 0; i < sizeof(font)/sizeof(font[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(font); i++)
{
HFONT hfont;
LOGFONTA lf;
@@ -6314,7 +6314,7 @@ static void test_max_height(void)
DeleteObject(SelectObject(hdc, hfont_old));
/* test an invalid value */
- for (i = 0; i < sizeof(invalid_height)/sizeof(invalid_height[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(invalid_height); i++) {
lf.lfHeight = invalid_height[i];
hfont = CreateFontIndirectA(&lf);
hfont_old = SelectObject(hdc, hfont);
@@ -6638,7 +6638,7 @@ static void test_bitmap_font_glyph_index(void)
bmi.bmiHeader.biHeight = 32;
bmi.bmiHeader.biCompression = BI_RGB;
- for (i = 0; i < sizeof(bitmap_font_list)/sizeof(bitmap_font_list[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(bitmap_font_list); i++) {
memset(&lf, 0, sizeof(lf));
lf.lfCharSet = bitmap_font_list[i].charset;
strcpy(lf.lfFaceName, bitmap_font_list[i].face);
diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c
index 65374ea85d..8f3d01c27d 100644
--- a/dlls/gdi32/tests/gdiobj.c
+++ b/dlls/gdi32/tests/gdiobj.c
@@ -345,7 +345,7 @@ static void test_handles_on_win64(void)
if (sizeof(void*) != 8)
return;
- for (i = 0; i < sizeof(cases)/sizeof(cases[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(cases); i++)
{
hrgn = CreateRectRgn(10, 10, 20, 20);
hrgn_test = (HRGN)(ULONG_PTR)((ULONG_PTR)hrgn | ((ULONGLONG)cases[i].high << 32) | cases[i].low);
diff --git a/dlls/gdi32/tests/icm.c b/dlls/gdi32/tests/icm.c
index 620809018a..340ebeef55 100644
--- a/dlls/gdi32/tests/icm.c
+++ b/dlls/gdi32/tests/icm.c
@@ -278,7 +278,7 @@ static void test_SetICMProfileW( HDC dc )
return;
}
- len = sizeof(profile)/sizeof(profile[0]);
+ len = ARRAY_SIZE(profile);
ret = GetICMProfileW( dc, &len, profile );
ok(ret, "GetICMProfileW failed %u\n", GetLastError());
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index 780b65f1b6..230d1e6d84 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -183,7 +183,7 @@ static void test_ExtTextOut(void)
static const RECT rc = { 0, 0, 100, 100 };
BOOL ret;
- assert(sizeof(dx)/sizeof(dx[0]) >= lstrlenA(text));
+ assert(ARRAY_SIZE(dx) >= lstrlenA(text));
/* Win9x doesn't play EMFs on invisible windows */
hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP | WS_VISIBLE,
@@ -3895,8 +3895,7 @@ static void test_emf_GradientFill(void)
* written to the EMF, but is not considered in the bounds
* calculation.
*/
- ret = GdiGradientFill( mf, v, sizeof(v) / sizeof(v[0]), tri, sizeof(tri) / sizeof(tri[0]),
- GRADIENT_FILL_TRIANGLE );
+ ret = GdiGradientFill( mf, v, ARRAY_SIZE(v), tri, ARRAY_SIZE(tri), GRADIENT_FILL_TRIANGLE );
ok( ret, "GradientFill\n" );
hemf = CloseEnhMetaFile( mf );
@@ -4117,7 +4116,7 @@ static void test_emf_WorldTransform(void)
{ "manual modify", TRUE, FALSE }
};
- for(i = 0; i < sizeof(test_data) / sizeof(*test_data); ++i)
+ for(i = 0; i < ARRAY_SIZE(test_data); ++i)
{
hdcMetafile = CreateEnhMetaFileA(GetDC(0), NULL, NULL, NULL);
ok(hdcMetafile != 0, "CreateEnhMetaFileA error %d\n", GetLastError());
diff --git a/dlls/gdi32/tests/path.c b/dlls/gdi32/tests/path.c
index 48ef4f016a..80145fc6b2 100644
--- a/dlls/gdi32/tests/path.c
+++ b/dlls/gdi32/tests/path.c
@@ -495,7 +495,7 @@ static void test_arcto(void)
CloseFigure(hdc);
EndPath(hdc);
- ok_path(hdc, "arcto_path", arcto_path, sizeof(arcto_path)/sizeof(path_test_t));
+ ok_path(hdc, "arcto_path", arcto_path, ARRAY_SIZE(arcto_path));
done:
ReleaseDC(0, hdc);
}
@@ -540,7 +540,7 @@ static void test_anglearc(void)
CloseFigure(hdc);
EndPath(hdc);
- ok_path(hdc, "anglearc_path", anglearc_path, sizeof(anglearc_path)/sizeof(path_test_t));
+ ok_path(hdc, "anglearc_path", anglearc_path, ARRAY_SIZE(anglearc_path));
done:
ReleaseDC(0, hdc);
}
@@ -681,7 +681,7 @@ static void test_polydraw(void)
ok( pos.x == 80 && pos.y == 80, "wrong pos %d,%d\n", pos.x, pos.y );
EndPath(hdc);
- ok_path(hdc, "polydraw_path", polydraw_path, sizeof(polydraw_path)/sizeof(path_test_t));
+ ok_path(hdc, "polydraw_path", polydraw_path, ARRAY_SIZE(polydraw_path));
GetCurrentPositionEx( hdc, &pos );
ok( pos.x == 80 && pos.y == 80, "wrong pos %d,%d\n", pos.x, pos.y );
done:
@@ -966,7 +966,7 @@ static void test_rectangle(void)
SetArcDirection( hdc, AD_COUNTERCLOCKWISE );
EndPath( hdc );
SetMapMode( hdc, MM_TEXT );
- ok_path( hdc, "rectangle_path", rectangle_path, sizeof(rectangle_path)/sizeof(path_test_t) );
+ ok_path( hdc, "rectangle_path", rectangle_path, ARRAY_SIZE(rectangle_path) );
ReleaseDC( 0, hdc );
}
@@ -1327,7 +1327,7 @@ static void test_roundrect(void)
SetArcDirection( hdc, AD_COUNTERCLOCKWISE );
EndPath( hdc );
SetMapMode( hdc, MM_TEXT );
- ok_path( hdc, "roundrect_path", roundrect_path, sizeof(roundrect_path)/sizeof(path_test_t) );
+ ok_path( hdc, "roundrect_path", roundrect_path, ARRAY_SIZE(roundrect_path) );
ReleaseDC( 0, hdc );
}
@@ -1707,7 +1707,7 @@ static void test_ellipse(void)
SetArcDirection( hdc, AD_COUNTERCLOCKWISE );
EndPath( hdc );
SetMapMode( hdc, MM_TEXT );
- ok_path( hdc, "ellipse_path", ellipse_path, sizeof(ellipse_path)/sizeof(path_test_t) );
+ ok_path( hdc, "ellipse_path", ellipse_path, ARRAY_SIZE(ellipse_path) );
}
static const path_test_t all_funcs_path[] =
@@ -1890,7 +1890,7 @@ static void test_all_functions(void)
LineTo( hdc, 150, 150 );
/* FIXME: ExtTextOut */
EndPath( hdc );
- ok_path( hdc, "all_funcs_path", all_funcs_path, sizeof(all_funcs_path)/sizeof(path_test_t) );
+ ok_path( hdc, "all_funcs_path", all_funcs_path, ARRAY_SIZE(all_funcs_path) );
ReleaseDC( 0, hdc );
}
diff --git a/dlls/gdi32/tests/pen.c b/dlls/gdi32/tests/pen.c
index 43f00d8f50..badc585f57 100644
--- a/dlls/gdi32/tests/pen.c
+++ b/dlls/gdi32/tests/pen.c
@@ -72,7 +72,7 @@ static void test_logpen(void)
EXTLOGPEN *ext_pen = (EXTLOGPEN *)elp_buffer;
DWORD *ext_style = ext_pen->elpStyleEntry;
- for (i = 0; i < sizeof(pen)/sizeof(pen[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(pen); i++)
{
trace("%d: testing style %u\n", i, pen[i].style);
--
2.14.4
June 25, 2018
Re: [PATCH] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
On 25/06/18 08:20, Nikolay Sivov wrote:
> On 06/25/2018 06:46 AM, Zebediah Figura wrote:
>
>> Should hopefully fix test failures on Windows.
>>
>> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
>> ---
>> dlls/hnetcfg/apps.c | 17 ++++++++++++-----
>> dlls/hnetcfg/tests/policy.c | 5 ++++-
>> 2 files changed, 16 insertions(+), 6 deletions(-)
>>
>> diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
>> index 34ef108..fe47721 100644
>> --- a/dlls/hnetcfg/apps.c
>> +++ b/dlls/hnetcfg/apps.c
>> @@ -268,7 +268,7 @@ static HRESULT WINAPI
>> fw_app_put_ProcessImageFileName(
>> {
>> fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
>> UNIVERSAL_NAME_INFOW *info;
>> - WCHAR *netpath;
>> + WCHAR *path;
>> DWORD res;
>> DWORD sz;
>> @@ -281,22 +281,29 @@ static HRESULT WINAPI
>> fw_app_put_ProcessImageFileName(
>> res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL,
>> NULL, &sz);
>> if (res == WN_MORE_DATA)
>> {
>> - if (!(netpath = heap_alloc(sz)))
>> + if (!(path = heap_alloc(sz)))
>> return E_OUTOFMEMORY;
>> - info = (UNIVERSAL_NAME_INFOW *)&netpath;
>> + info = (UNIVERSAL_NAME_INFOW *)&path;
>> res = WNetGetUniversalNameW(image,
>> UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
>> if (res == NO_ERROR)
>> {
>> SysFreeString(This->filename);
>> This->filename = SysAllocString(info->lpUniversalName);
>> }
>> - heap_free(netpath);
>> + heap_free(path);
>> return HRESULT_FROM_WIN32(res);
>> }
>> + sz = GetFullPathNameW(image, 0, NULL, NULL);
>> + if (!(path = heap_alloc(++sz)))
>> + return E_OUTOFMEMORY;
>> +
>> + GetFullPathNameW(image, sz, path, NULL);
>
> ...
>
>>
>> + GetFullPathNameW(image, sizeof(fullpath), fullpath, NULL);
> ...
>
> This one takes character length I think, not byte length.
>
>
Thanks for the catch; resent.
June 25, 2018
[PATCH v2] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/hnetcfg/apps.c | 17 ++++++++++++-----
dlls/hnetcfg/tests/policy.c | 5 ++++-
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
index 34ef108..fe47721 100644
--- a/dlls/hnetcfg/apps.c
+++ b/dlls/hnetcfg/apps.c
@@ -268,7 +268,7 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
{
fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
UNIVERSAL_NAME_INFOW *info;
- WCHAR *netpath;
+ WCHAR *path;
DWORD res;
DWORD sz;
@@ -281,22 +281,29 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, NULL, &sz);
if (res == WN_MORE_DATA)
{
- if (!(netpath = heap_alloc(sz)))
+ if (!(path = heap_alloc(sz)))
return E_OUTOFMEMORY;
- info = (UNIVERSAL_NAME_INFOW *)&netpath;
+ info = (UNIVERSAL_NAME_INFOW *)&path;
res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
if (res == NO_ERROR)
{
SysFreeString(This->filename);
This->filename = SysAllocString(info->lpUniversalName);
}
- heap_free(netpath);
+ heap_free(path);
return HRESULT_FROM_WIN32(res);
}
+ sz = GetFullPathNameW(image, 0, NULL, NULL);
+ if (!(path = heap_alloc(++sz)))
+ return E_OUTOFMEMORY;
+
+ GetFullPathNameW(image, sz, path, NULL);
+
SysFreeString( This->filename );
- This->filename = SysAllocString(image);
+ This->filename = SysAllocString(path);
+ heap_free(path);
return This->filename ? S_OK : E_OUTOFMEMORY;
}
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index f2d1372..954af5c 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -107,6 +107,7 @@ static void test_NetFwAuthorizedApplication(void)
INetFwAuthorizedApplication *app;
static WCHAR empty[] = {0};
UNIVERSAL_NAME_INFOW *info;
+ WCHAR fullpath[MAX_PATH];
WCHAR netpath[MAX_PATH];
WCHAR image[MAX_PATH];
HRESULT hr;
@@ -138,13 +139,15 @@ static void test_NetFwAuthorizedApplication(void)
ok(hr == S_OK, "got: %08x\n", hr);
SysFreeString(bstr);
+ GetFullPathNameW(image, ARRAY_SIZE(fullpath), fullpath, NULL);
+
info = (UNIVERSAL_NAME_INFOW *)&netpath;
sz = sizeof(netpath);
hr = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
if (hr != NO_ERROR)
{
info->lpUniversalName = netpath + sizeof(*info)/sizeof(WCHAR);
- lstrcpyW(info->lpUniversalName, image);
+ lstrcpyW(info->lpUniversalName, fullpath);
}
hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, &bstr);
--
2.7.4
June 25, 2018
[PATCH] hnetcfg: GetModuleFileNameW gets characters, not bytes (Coverity)
by Marcus Meissner
CID 1437516
Signed-off-by: Marcus Meissner <meissner(a)suse.de>
---
dlls/hnetcfg/tests/policy.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/hnetcfg/tests/policy.c b/dlls/hnetcfg/tests/policy.c
index f2d1372ba6..b28535d448 100644
--- a/dlls/hnetcfg/tests/policy.c
+++ b/dlls/hnetcfg/tests/policy.c
@@ -117,7 +117,7 @@ static void test_NetFwAuthorizedApplication(void)
&IID_INetFwAuthorizedApplication, (void**)&app);
ok(hr == S_OK, "got: %08x\n", hr);
- hr = GetModuleFileNameW(NULL, image, sizeof(image));
+ hr = GetModuleFileNameW(NULL, image, ARRAY_SIZE(image));
ok(hr, "GetModuleFileName failed: %u\n", GetLastError());
hr = INetFwAuthorizedApplication_get_ProcessImageFileName(app, NULL);
--
2.17.1
June 25, 2018
[PATCH v3] comctl32/imagelist: fix ImageList_Read
by Denis Malikov
Fix for versions x600 and x620 and pointer calculation for mixing image and mask bits.
Tested on *.reg files extracted from:
- XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify;
- Vista/7 key HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Signed-off-by: Denis Malikov <mdn40000(a)mail.ru>
---
dlls/comctl32/imagelist.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index a08d60752e..be901462a0 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -2267,7 +2267,9 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
return NULL;
if (ilHead.usMagic != (('L' << 8) | 'I'))
return NULL;
- if (ilHead.usVersion != 0x101) /* probably version? */
+ if (ilHead.usVersion != 0x101 &&
+ ilHead.usVersion != 0x600 && /* XP/2003 version */
+ ilHead.usVersion != 0x620) /* Vista/7 version */
return NULL;
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
@@ -2296,23 +2298,25 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
{
DWORD *ptr = image_bits;
BYTE *mask_ptr = mask_bits;
- int stride = himl->cy * image_info->bmiHeader.biWidth;
+ int stride = himl->cy * (ilHead.usVersion != 0x101 ? himl->cx : image_info->bmiHeader.biWidth);
+ int image_step = ilHead.usVersion != 0x101 ? 1 : TILE_COUNT;
+ int mask_step = ilHead.usVersion != 0x101 ? 4 : 8;
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
{
ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
- mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
+ mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / mask_step;
stride = -stride;
image_info->bmiHeader.biHeight = himl->cy;
}
else image_info->bmiHeader.biHeight = -himl->cy;
- for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ for (i = 0; i < ilHead.cCurImage; i += image_step)
{
- add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ add_dib_bits( himl, i, min( ilHead.cCurImage - i, image_step ),
himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );
ptr += stride;
- mask_ptr += stride / 8;
+ mask_ptr += stride / mask_step;
}
}
else
--
2.16.2.windows.1
June 25, 2018
Re: [PATCH] hnetcfg: Store the full path in INetFwAuthorizedApplication_put_ProcessImageFileName().
by Nikolay Sivov
On 06/25/2018 06:46 AM, Zebediah Figura wrote:
> Should hopefully fix test failures on Windows.
>
> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> ---
> dlls/hnetcfg/apps.c | 17 ++++++++++++-----
> dlls/hnetcfg/tests/policy.c | 5 ++++-
> 2 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/hnetcfg/apps.c b/dlls/hnetcfg/apps.c
> index 34ef108..fe47721 100644
> --- a/dlls/hnetcfg/apps.c
> +++ b/dlls/hnetcfg/apps.c
> @@ -268,7 +268,7 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
> {
> fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
> UNIVERSAL_NAME_INFOW *info;
> - WCHAR *netpath;
> + WCHAR *path;
> DWORD res;
> DWORD sz;
>
> @@ -281,22 +281,29 @@ static HRESULT WINAPI fw_app_put_ProcessImageFileName(
> res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, NULL, &sz);
> if (res == WN_MORE_DATA)
> {
> - if (!(netpath = heap_alloc(sz)))
> + if (!(path = heap_alloc(sz)))
> return E_OUTOFMEMORY;
>
> - info = (UNIVERSAL_NAME_INFOW *)&netpath;
> + info = (UNIVERSAL_NAME_INFOW *)&path;
> res = WNetGetUniversalNameW(image, UNIVERSAL_NAME_INFO_LEVEL, &info, &sz);
> if (res == NO_ERROR)
> {
> SysFreeString(This->filename);
> This->filename = SysAllocString(info->lpUniversalName);
> }
> - heap_free(netpath);
> + heap_free(path);
> return HRESULT_FROM_WIN32(res);
> }
>
> + sz = GetFullPathNameW(image, 0, NULL, NULL);
> + if (!(path = heap_alloc(++sz)))
> + return E_OUTOFMEMORY;
> +
> + GetFullPathNameW(image, sz, path, NULL);
...
>
>
> + GetFullPathNameW(image, sizeof(fullpath), fullpath, NULL);
...
This one takes character length I think, not byte length.
June 25, 2018
[PATCH] fonts: Add clock images to Wingdings font. (v2)
by Dmitry Timoshkov
v2: I've created the glyphs on my own.
wingding.ttf should be rebuilt in maintainer mode after applying this patch.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
fonts/wingding.sfd | 760 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 758 insertions(+), 2 deletions(-)
diff --git a/fonts/wingding.sfd b/fonts/wingding.sfd
index c46152b077..d5b7ec871b 100644
--- a/fonts/wingding.sfd
+++ b/fonts/wingding.sfd
@@ -50,9 +50,9 @@ NameList: Adobe Glyph List
DisplaySize: -48
AntiAlias: 1
FitToEm: 1
-WinInfo: 0 29 12
+WinInfo: 0 38 13
TeXData: 1 0 0 708670 354335 236222 1342177 -2147484 236222 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144
-BeginChars: 256 38
+BeginChars: 256 50
StartChar: f020
Encoding: 0 61472 0
@@ -788,5 +788,761 @@ LayerCount: 2
Fore
Refer: 34 63724 N 0 1 -1 0 1653 -173 2
EndChar
+
+StartChar: oneoclock
+Encoding: 183 8721 38
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1045.63 1112.56 m 1,0,-1
+ 1117 1081.1 l 1,1,-1
+ 888.373 614.638 l 1,2,-1
+ 817 646.1 l 1,3,-1
+ 1045.63 1112.56 l 1,0,-1
+1045.63 1112.56 m 1,4,-1
+ 1117 1081.1 l 1,5,-1
+ 888.373 614.638 l 1,6,-1
+ 817 646.1 l 1,7,-1
+ 1045.63 1112.56 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: twooclock
+Encoding: 184 8719 39
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1259.61 981.841 m 1,0,-1
+ 1308.09 920.734 l 1,1,-1
+ 888.373 614.638 l 1,2,-1
+ 839.896 675.744 l 1,3,-1
+ 1259.61 981.841 l 1,0,-1
+1259.61 981.841 m 1,4,-1
+ 1308.09 920.734 l 1,5,-1
+ 888.373 614.638 l 1,6,-1
+ 839.896 675.744 l 1,7,-1
+ 1259.61 981.841 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: threeoclock
+Encoding: 185 960 40
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1417 769.1 m 1,0,-1
+ 1492 769.1 l 1,1,-1
+ 1492 682.1 l 1,2,-1
+ 1417 682.1 l 1,3,-1
+ 1417 769.1 l 1,0,-1
+1354 760.1 m 1,4,-1
+ 1357.3 682.17 l 1,5,-1
+ 837.828 681.208 l 1,6,-1
+ 834.522 759.138 l 1,7,-1
+ 1354 760.1 l 1,4,-1
+1354 760.1 m 1,8,-1
+ 1357.3 682.17 l 1,9,-1
+ 837.828 681.208 l 1,10,-1
+ 834.522 759.138 l 1,11,-1
+ 1354 760.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+871 1297.1 m 1,16,-1
+ 949 1297.1 l 1,17,-1
+ 949 595.1 l 1,18,-1
+ 871 595.1 l 1,19,-1
+ 871 1297.1 l 1,16,-1
+868 238.1 m 1,20,-1
+ 943 238.1 l 1,21,-1
+ 943 151.1 l 1,22,-1
+ 868 151.1 l 1,23,-1
+ 868 238.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: fouroclock
+Encoding: 186 8747 41
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1400.73 513.884 m 1,0,-1
+ 1377.42 439.448 l 1,1,-1
+ 888.373 614.638 l 1,2,-1
+ 911.681 689.074 l 1,3,-1
+ 1400.73 513.884 l 1,0,-1
+1400.73 513.884 m 1,4,-1
+ 1377.42 439.448 l 1,5,-1
+ 888.373 614.638 l 1,6,-1
+ 911.681 689.074 l 1,7,-1
+ 1400.73 513.884 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: fiveoclock
+Encoding: 187 170 42
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1169.2 333.396 m 1,0,-1
+ 1105 289.1 l 1,1,-1
+ 827.557 728.283 l 1,2,-1
+ 891.758 772.579 l 1,3,-1
+ 1169.2 333.396 l 1,0,-1
+1169.2 333.396 m 1,4,-1
+ 1105 289.1 l 1,5,-1
+ 827.557 728.283 l 1,6,-1
+ 891.758 772.579 l 1,7,-1
+ 1169.2 333.396 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: sixoclock
+Encoding: 188 186 43
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+872.619 844.557 m 1,0,-1
+ 950.58 847.024 l 1,1,-1
+ 945.961 327.567 l 1,2,-1
+ 868 325.1 l 1,3,-1
+ 872.619 844.557 l 1,0,-1
+872.619 844.557 m 1,4,-1
+ 950.58 847.024 l 1,5,-1
+ 945.961 327.567 l 1,6,-1
+ 868 325.1 l 1,7,-1
+ 872.619 844.557 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: sevenoclock
+Encoding: 189 937 44
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+682 289.1 m 1,0,-1
+ 616.783 331.886 l 1,1,-1
+ 919.107 754.327 l 1,2,-1
+ 984.324 711.541 l 1,3,-1
+ 682 289.1 l 1,0,-1
+682 289.1 m 1,4,-1
+ 616.783 331.886 l 1,5,-1
+ 919.107 754.327 l 1,6,-1
+ 984.324 711.541 l 1,7,-1
+ 682 289.1 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: eightoclock
+Encoding: 190 230 45
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+544.217 438.639 m 1,0,-1
+ 501.419 503.848 l 1,1,-1
+ 946.903 771.055 l 1,2,-1
+ 989.703 705.847 l 1,3,-1
+ 544.217 438.639 l 1,0,-1
+544.217 438.639 m 1,4,-1
+ 501.419 503.848 l 1,5,-1
+ 946.903 771.055 l 1,6,-1
+ 989.703 705.847 l 1,7,-1
+ 544.217 438.639 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: nineoclock
+Encoding: 191 248 46
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+517 679.1 m 1,0,-1
+ 513.82 757.034 l 1,1,-1
+ 1033.3 757.157 l 1,2,-1
+ 1036.48 679.223 l 1,3,-1
+ 517 679.1 l 1,0,-1
+517 679.1 m 1,4,-1
+ 513.82 757.034 l 1,5,-1
+ 1033.3 757.157 l 1,6,-1
+ 1036.48 679.223 l 1,7,-1
+ 517 679.1 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: tenoclock
+Encoding: 192 191 47
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+555.232 898.87 m 1,0,-1
+ 598 964.1 l 1,1,-1
+ 1020.53 661.897 l 1,2,-1
+ 977.762 596.668 l 1,3,-1
+ 555.232 898.87 l 1,0,-1
+555.232 898.87 m 1,4,-1
+ 598 964.1 l 1,5,-1
+ 1020.53 661.897 l 1,6,-1
+ 977.762 596.668 l 1,7,-1
+ 555.232 898.87 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: elevenoclock
+Encoding: 193 161 48
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+693.722 1059.02 m 1,0,-1
+ 758.041 1103.14 l 1,1,-1
+ 1034.32 663.226 l 1,2,-1
+ 970 619.1 l 1,3,-1
+ 693.722 1059.02 l 1,0,-1
+693.722 1059.02 m 1,4,-1
+ 758.041 1103.14 l 1,5,-1
+ 1034.32 663.226 l 1,6,-1
+ 970 619.1 l 1,7,-1
+ 693.722 1059.02 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
+
+StartChar: twelveoclock
+Encoding: 194 172 49
+Width: 1825
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+872.906 1111.69 m 1,0,-1
+ 950.853 1114.57 l 1,1,-1
+ 949 595.1 l 1,2,-1
+ 871.054 592.217 l 1,3,-1
+ 872.906 1111.69 l 1,0,-1
+872.906 1111.69 m 1,4,-1
+ 950.853 1114.57 l 1,5,-1
+ 949 595.1 l 1,6,-1
+ 871.054 592.217 l 1,7,-1
+ 872.906 1111.69 l 1,4,-1
+871 1297.1 m 1,8,-1
+ 949 1297.1 l 1,9,-1
+ 949 595.1 l 1,10,-1
+ 871 595.1 l 1,11,-1
+ 871 1297.1 l 1,8,-1
+871 1297.1 m 1,12,-1
+ 949 1297.1 l 1,13,-1
+ 949 595.1 l 1,14,-1
+ 871 595.1 l 1,15,-1
+ 871 1297.1 l 1,12,-1
+868 238.1 m 1,16,-1
+ 943 238.1 l 1,17,-1
+ 943 151.1 l 1,18,-1
+ 868 151.1 l 1,19,-1
+ 868 238.1 l 1,16,-1
+1408 784.1 m 1,20,-1
+ 1483 784.1 l 1,21,-1
+ 1483 697.1 l 1,22,-1
+ 1408 697.1 l 1,23,-1
+ 1408 784.1 l 1,20,-1
+340 763.1 m 1,24,-1
+ 415 763.1 l 1,25,-1
+ 415 676.1 l 1,26,-1
+ 340 676.1 l 1,27,-1
+ 340 763.1 l 1,24,-1
+438.5 254.1 m 0,28,29
+ 680.837 45.2673 680.837 45.2673 917.027 58.1245 c 0,30,31
+ 1187.65 72.8563 1187.65 72.8563 1382.5 266.1 c 0,32,33
+ 1576.5 458.508 1576.5 458.508 1574.5 734.1 c 0,34,35
+ 1571.93 1022.95 1571.93 1022.95 1414 1180.1 c 0,36,37
+ 1202.96 1390.1 1202.96 1390.1 906.5 1390.1 c 0,38,39
+ 620.354 1390.1 620.354 1390.1 442.5 1198.1 c 0,40,41
+ 236.614 975.839 236.614 975.839 246.5 722.1 c 0,42,43
+ 258.697 409.044 258.697 409.044 438.5 254.1 c 0,28,29
+1430.5 1245.5 m 128,-1,45
+ 1644 1032 1644 1032 1644 730 c 256,46,47
+ 1644 428 1644 428 1430.5 214 c 128,-1,48
+ 1217 0 1217 0 914 0 c 0,49,50
+ 612 0 612 0 398.5 214 c 128,-1,51
+ 185 428 185 428 185 730 c 256,52,53
+ 185 1032 185 1032 398.5 1245.5 c 128,-1,54
+ 612 1459 612 1459 914 1459 c 0,55,44
+ 1217 1459 1217 1459 1430.5 1245.5 c 128,-1,45
+EndSplineSet
+EndChar
EndChars
EndSplineFont
--
2.16.3
June 25, 2018
[PATCH] crypt32: Correctly return how the issuer of a self signed certificate was matched.
by Nikolay Sivov
Original patch by Michael Müller.
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/crypt32/chain.c | 53 +++++++++++++++-------------------
dlls/crypt32/crypt32_private.h | 2 +-
2 files changed, 24 insertions(+), 31 deletions(-)
diff --git a/dlls/crypt32/chain.c b/dlls/crypt32/chain.c
index 6e8076c66c..d7015d797d 100644
--- a/dlls/crypt32/chain.c
+++ b/dlls/crypt32/chain.c
@@ -265,10 +265,10 @@ typedef struct _CertificateChain
LONG ref;
} CertificateChain;
-BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
+DWORD CRYPT_IsCertificateSelfSigned(const CERT_CONTEXT *cert)
{
+ DWORD size, status = 0;
PCERT_EXTENSION ext;
- DWORD size;
BOOL ret;
if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER2,
@@ -296,10 +296,9 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
&info->AuthorityCertIssuer.rgAltEntry[i];
if (directoryName)
{
- ret = CertCompareCertificateName(cert->dwCertEncodingType,
- &directoryName->u.DirectoryName, &cert->pCertInfo->Issuer)
- && CertCompareIntegerBlob(&info->AuthorityCertSerialNumber,
- &cert->pCertInfo->SerialNumber);
+ if (CertCompareCertificateName(cert->dwCertEncodingType, &directoryName->u.DirectoryName, &cert->pCertInfo->Issuer)
+ && CertCompareIntegerBlob(&info->AuthorityCertSerialNumber, &cert->pCertInfo->SerialNumber))
+ status = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
}
else
{
@@ -317,16 +316,12 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
if (buf)
{
- CertGetCertificateContextProperty(cert,
- CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
- ret = !memcmp(buf, info->KeyId.pbData, size);
+ CertGetCertificateContextProperty(cert, CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
+ if (!memcmp(buf, info->KeyId.pbData, size))
+ status = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
CryptMemFree(buf);
}
- else
- ret = FALSE;
}
- else
- ret = FALSE;
}
LocalFree(info);
}
@@ -344,10 +339,9 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
{
if (info->CertIssuer.cbData && info->CertSerialNumber.cbData)
{
- ret = CertCompareCertificateName(cert->dwCertEncodingType,
- &info->CertIssuer, &cert->pCertInfo->Issuer) &&
- CertCompareIntegerBlob(&info->CertSerialNumber,
- &cert->pCertInfo->SerialNumber);
+ if (CertCompareCertificateName(cert->dwCertEncodingType, &info->CertIssuer, &cert->pCertInfo->Issuer)
+ && CertCompareIntegerBlob(&info->CertSerialNumber, &cert->pCertInfo->SerialNumber))
+ status = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
}
else if (info->KeyId.cbData)
{
@@ -361,24 +355,23 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
{
CertGetCertificateContextProperty(cert,
CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
- ret = !memcmp(buf, info->KeyId.pbData, size);
+ if (!memcmp(buf, info->KeyId.pbData, size))
+ status = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
CryptMemFree(buf);
}
- else
- ret = FALSE;
}
- else
- ret = FALSE;
}
- else
- ret = FALSE;
LocalFree(info);
}
}
else
- ret = CertCompareCertificateName(cert->dwCertEncodingType,
- &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer);
- return ret;
+ if (CertCompareCertificateName(cert->dwCertEncodingType, &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer))
+ status = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
+
+ if (status)
+ status |= CERT_TRUST_IS_SELF_SIGNED;
+
+ return status;
}
static void CRYPT_FreeChainElement(PCERT_CHAIN_ELEMENT element)
@@ -1890,6 +1883,7 @@ static void CRYPT_CheckSimpleChain(CertificateChainEngine *engine,
int i;
BOOL pathLengthConstraintViolated = FALSE;
CERT_BASIC_CONSTRAINTS2_INFO constraints = { FALSE, FALSE, 0 };
+ DWORD status;
TRACE_(chain)("checking chain with %d elements for time %s\n",
chain->cElement, filetime_to_str(time));
@@ -1977,10 +1971,9 @@ static void CRYPT_CheckSimpleChain(CertificateChainEngine *engine,
}
CRYPT_CheckChainNameConstraints(chain);
CRYPT_CheckChainPolicies(chain);
- if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext))
+ if ((status = CRYPT_IsCertificateSelfSigned(rootElement->pCertContext)))
{
- rootElement->TrustStatus.dwInfoStatus |=
- CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER;
+ rootElement->TrustStatus.dwInfoStatus |= status;
CRYPT_CheckRootCert(engine->hRoot, rootElement);
}
CRYPT_CombineTrustStatus(&chain->TrustStatus, &rootElement->TrustStatus);
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index dbf6dca411..95ee67c6cb 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -343,7 +343,7 @@ void CRYPT_ImportSystemRootCertsToReg(void) DECLSPEC_HIDDEN;
BOOL CRYPT_SerializeContextsToReg(HKEY key, DWORD flags, const WINE_CONTEXT_INTERFACE *contextInterface,
HCERTSTORE memStore) DECLSPEC_HIDDEN;
-BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert) DECLSPEC_HIDDEN;
+DWORD CRYPT_IsCertificateSelfSigned(const CERT_CONTEXT *cert) DECLSPEC_HIDDEN;
/* Allocates and initializes a certificate chain engine, but without creating
* the root store. Instead, it uses root, and assumes the caller has done any
--
2.18.0
June 25, 2018
Wine staging 3.11 release
by Alistair Leslie-Hughes
Binary packages for various distributions will be available from:
https://www.winehq.org/download
Summary of the past few weeks
* Rebased to current wine 3.11 (900 patches are applied to wine vanilla)
* Reviewed and upstreamed patches.
Added
* [34989] msi: Implement deferral for standard and custom actions
Where can you help
* Run Steam/Battle.net/UPlay.
* Try you favorite game: Upward lonely robot
* Test your favorite applications.
* Steal staging patches and get them accepted upstream.
As always, if you find a bug, please report it via
https://bugs.winehq.org
Best Regards
Alistair.
June 25, 2018
[PATCH] wininet: Remove checks for negative value.
by Andrey Gusev
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/wininet/ftp.c | 2 +-
dlls/wininet/http.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index e12e494160..9e4da08fdf 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -3290,7 +3290,7 @@ static BOOL FTP_SendData(ftp_session_t *lpwfs, INT nDataSocket, HANDLE hFile)
{
nBytesToSend = nBytesRead - nBytesSent;
- if (nBytesToSend <= 0)
+ if (nBytesToSend == 0)
{
/* Read data from file. */
nBytesSent = 0;
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index b91dbdf175..3e14049b4e 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -6264,7 +6264,7 @@ static DWORD HTTP_InsertCustomHeader(http_request_t *request, LPHTTPHEADERW lpHd
*/
static BOOL HTTP_DeleteCustomHeader(http_request_t *request, DWORD index)
{
- if( request->nCustHeaders <= 0 )
+ if( request->nCustHeaders == 0 )
return FALSE;
if( index >= request->nCustHeaders )
return FALSE;
--
2.17.1
June 25, 2018
[PATCH] msi: Remove checks for negative value.
by Andrey Gusev
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/msi/format.c | 2 +-
dlls/msi/string.c | 2 +-
dlls/msi/table.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/format.c b/dlls/msi/format.c
index 9356c9e30d..2534b8f6a3 100644
--- a/dlls/msi/format.c
+++ b/dlls/msi/format.c
@@ -242,7 +242,7 @@ static WCHAR *deformat_file( FORMAT *format, FORMSTR *str, BOOL shortname, int *
if ((ret = strdupW( file->TargetPath ))) len = strlenW( ret );
goto done;
}
- if ((len = GetShortPathNameW(file->TargetPath, NULL, 0)) <= 0)
+ if ((len = GetShortPathNameW(file->TargetPath, NULL, 0)) == 0)
{
if ((ret = strdupW( file->TargetPath ))) len = strlenW( ret );
goto done;
diff --git a/dlls/msi/string.c b/dlls/msi/string.c
index f094a53c9e..b0e61e5d76 100644
--- a/dlls/msi/string.c
+++ b/dlls/msi/string.c
@@ -246,7 +246,7 @@ static UINT string2id( const string_table *st, const char *buffer, UINT *id )
}
sz = MultiByteToWideChar( st->codepage, 0, buffer, -1, NULL, 0 );
- if( sz <= 0 )
+ if( sz == 0 )
return r;
str = msi_alloc( sz*sizeof(WCHAR) );
if( !str )
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 45a181445a..41e313736f 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -1279,7 +1279,7 @@ static UINT get_table_value_from_record( MSITABLEVIEW *tv, MSIRECORD *rec, UINT
UINT r;
int ival;
- if ( (iField <= 0) ||
+ if ( (iField == 0) ||
(iField > tv->num_cols) ||
MSI_RecordIsNull( rec, iField ) )
return ERROR_FUNCTION_FAILED;
--
2.17.1
June 25, 2018
[PATCH] comctl32: Remove checks for negative value.
by Andrey Gusev
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/comctl32/rebar.c | 2 +-
dlls/comctl32/tab.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c
index 20ce49b3f9..2d00dfd7ca 100644
--- a/dlls/comctl32/rebar.c
+++ b/dlls/comctl32/rebar.c
@@ -2090,7 +2090,7 @@ REBAR_HandleUDDrag (REBAR_INFO *infoPtr, const POINT *ptsmove)
INT iHitBand, iRowBegin, iNextRowBegin;
REBAR_BAND *hitBand, *rowBeginBand;
- if(infoPtr->uNumBands <= 0)
+ if(infoPtr->uNumBands == 0)
ERR("There are no bands in this rebar\n");
/* Up/down dragging can only occur when there is more than one
diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c
index f8a54935ca..2e17e142f6 100644
--- a/dlls/comctl32/tab.c
+++ b/dlls/comctl32/tab.c
@@ -365,7 +365,7 @@ static BOOL TAB_InternalGetItemRect(
RECT tmpItemRect,clientRect;
/* Perform a sanity check and a trivial visibility check. */
- if ( (infoPtr->uNumItem <= 0) ||
+ if ( (infoPtr->uNumItem == 0) ||
(itemIndex >= infoPtr->uNumItem) ||
(!(((infoPtr->dwStyle & TCS_MULTILINE) || (infoPtr->dwStyle & TCS_VERTICAL))) &&
(itemIndex < infoPtr->leftmostVisible)))
--
2.17.1
June 25, 2018
[PATCH] advapi32: Remove checks for negative value.
by Andrey Gusev
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/advapi32/crypt.c | 2 +-
dlls/advapi32/crypt_lmhash.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c
index 01d5880423..6ac63e7f08 100644
--- a/dlls/advapi32/crypt.c
+++ b/dlls/advapi32/crypt.c
@@ -661,7 +661,7 @@ BOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, ULONG_PTR dwFlags)
}
pProv->refcount--;
- if (pProv->refcount <= 0)
+ if (pProv->refcount == 0)
{
ret = pProv->pFuncs->pCPReleaseContext(pProv->hPrivate, dwFlags);
pProv->dwMagic = 0;
diff --git a/dlls/advapi32/crypt_lmhash.c b/dlls/advapi32/crypt_lmhash.c
index 345c89ddb7..de4fce2511 100644
--- a/dlls/advapi32/crypt_lmhash.c
+++ b/dlls/advapi32/crypt_lmhash.c
@@ -196,7 +196,7 @@ NTSTATUS WINAPI SystemFunction004(const struct ustring *in,
unsigned char deskey[7];
unsigned int crypt_len, ofs;
- if (key->Length<=0)
+ if (key->Length==0)
return STATUS_INVALID_PARAMETER_2;
crypt_len = ((in->Length+7)&~7);
@@ -255,7 +255,7 @@ NTSTATUS WINAPI SystemFunction005(const struct ustring *in,
unsigned char deskey[7];
unsigned int ofs, crypt_len;
- if (key->Length<=0)
+ if (key->Length==0)
return STATUS_INVALID_PARAMETER_2;
if (key->Length<sizeof deskey)
--
2.17.1
June 25, 2018
Re: [PATCH 2/3] comctl32/taskdialog: Add support for radio buttons.
by Zhiyi Zhang
On Mon 6 25 13:22, Nikolay Sivov wrote:
>
>
> On 06/17/2018 11:17 AM, Zhiyi Zhang wrote:
>> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
>> ---
>> dlls/comctl32/taskdialog.c | 130 ++++++++++++++++++++++-
>> dlls/comctl32/tests/taskdialog.c | 172 +++++++++++++++++++++++++++----
>> 2 files changed, 281 insertions(+), 21 deletions(-)
>>
>> diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
>> index 33fb578910..c3c5fa0420 100644
>> --- a/dlls/comctl32/taskdialog.c
>> +++ b/dlls/comctl32/taskdialog.c
>> @@ -58,6 +58,8 @@ struct taskdialog_info
>> HWND main_instruction;
>> HWND content;
>> HWND progress_bar;
>> + HWND *radio_buttons;
>> + INT radio_button_count;
>> HWND *buttons;
>> INT button_count;
>> HWND default_button;
>> @@ -69,6 +71,7 @@ struct taskdialog_info
>> LONG h_spacing;
>> LONG v_spacing;
>> } m;
>> + INT selected_radio_id;
>> };
>> struct button_layout_info
>> @@ -185,6 +188,18 @@ static void taskdialog_enable_button(const struct taskdialog_info *dialog_info,
>> if (hwnd) EnableWindow(hwnd, enable);
>> }
>> +static void taskdialog_enable_radio_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
>> +{
>> + HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
>> + if (hwnd) EnableWindow(hwnd, enable);
>> +}
>> +
>> +static void taskdialog_click_radio_button(const struct taskdialog_info *dialog_info, INT id)
>> +{
>> + HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
>> + if (hwnd) SendMessageW(hwnd, BM_CLICK, 0, 0);
>> +}
>> +
>> static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
>> {
>> const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
>> @@ -193,8 +208,18 @@ static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notif
>> : S_OK;
>> }
>> -static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
>> +static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, unsigned long command_id)
>
> Why the type change?
>
In taskdialog_check_default_radio_buttons(), id via GetWindowLongW(default_button, GWLP_ID) is passed to
taskdialog_on_button_click(). And id is originally int in pRadioButtons. So WORD is not enough. Tested on
Windows, 0x1FFFF is allowed as a valid id. And on second thought, an INT should be enough.
>> {
>> + HWND radio_button;
>> +
>> + radio_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, command_id);
>> + if (radio_button)
>> + {
>> + dialog_info->selected_radio_id = command_id;
>> + taskdialog_notify(dialog_info, TDN_RADIO_BUTTON_CLICKED, command_id, 0);
>> + return;
>> + }
>> +
>> if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
>> EndDialog(dialog_info->hwnd, command_id);
>> }
>> @@ -260,6 +285,40 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
>> ReleaseDC(hwnd, hdc);
>> }
>> +static void taskdialog_get_checkbox_height(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
>
> Do we call that "checkbox" anywhere in wine? It doesn't feel right.
>
>> +{
>> + DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
>> + HFONT hfont, old_hfont;
>> + HDC hdc;
>> + RECT rect = {0};
>> + WCHAR text[1024];
>
> I think it's better to make this dynamic.
>
>> + INT text_length;
>> + LONG text_offset, checkbox_width, checkbox_height;
>> +
>> + hdc = GetDC(hwnd);
>> + hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
>> + old_hfont = SelectObject(hdc, hfont);
>> +
>> + checkbox_width = 12 * GetDeviceCaps(hdc, LOGPIXELSX) / 96 + 1;
>> + checkbox_height = 12 * GetDeviceCaps(hdc, LOGPIXELSY) / 96 + 1;
>> + GetCharWidthW(hdc, '0', '0', &text_offset);
>> + text_offset /= 2;
>> +
>> + if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
>> + style |= DT_RIGHT | DT_RTLREADING;
>> + else
>> + style |= DT_LEFT;
>> +
>> + rect.right = max_width - checkbox_width - text_offset;
>> + text_length = GetWindowTextW(hwnd, text, ARRAY_SIZE(text));
>> + size->cy = DrawTextW(hdc, text, text_length, &rect, style);
>> + size->cx = min(max_width - checkbox_width - text_offset, rect.right - rect.left);
>> + size->cx += checkbox_width + text_offset;
>> + size->cy = max(size->cy, checkbox_height);
>> + if (old_hfont) SelectObject(hdc, old_hfont);
>> + ReleaseDC(hwnd, hdc);
>> +}
>> +
>> static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
>> {
>> if (icon == TD_WARNING_ICON)
>> @@ -300,6 +359,28 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
>> }
>> }
>> +static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialog_info)
>> +{
>> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
>> + HWND default_button;
>> + INT id;
>> +
>> + if (!dialog_info->radio_button_count) return;
>> +
>> + default_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count,
>> + taskconfig->nDefaultRadioButton);
>> +
>> + if (!default_button && !(taskconfig->dwFlags & TDF_NO_DEFAULT_RADIO_BUTTON))
>> + default_button = dialog_info->radio_buttons[0];
>> +
>> + if (default_button)
>> + {
>> + SendMessageW(default_button, BM_SETCHECK, BST_CHECKED, 0);
>> + id = GetWindowLongW(default_button, GWLP_ID);
>> + taskdialog_on_button_click(dialog_info, id);
>> + }
>> +}
>> +
>> static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
>> {
>> if (!dialog_info->taskconfig->u.hMainIcon) return;
>> @@ -363,6 +444,30 @@ static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
>> CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
>> }
>> +static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
>> +{
>> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
>> + static const DWORD style = BS_AUTORADIOBUTTON | BS_MULTILINE | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP;
>> + WCHAR *textW;
>> + INT i;
>> +
>> + if (!taskconfig->cRadioButtons || !taskconfig->pRadioButtons) return;
>> +
>> + dialog_info->radio_buttons = Alloc(taskconfig->cRadioButtons * sizeof(*dialog_info->radio_buttons));
>> + if (!dialog_info->radio_buttons) return;
>> +
>> + dialog_info->radio_button_count = taskconfig->cRadioButtons;
>> + for (i = 0; i < dialog_info->radio_button_count; i++)
>> + {
>> + textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pRadioButtons[i].pszButtonText);
>> + dialog_info->radio_buttons[i] =
>> + CreateWindowW(WC_BUTTONW, textW, i == 0 ? style | WS_GROUP : style, 0, 0, 0, 0, dialog_info->hwnd,
>> + (HMENU)taskconfig->pRadioButtons[i].nButtonID, 0, NULL);
>> + SendMessageW(dialog_info->radio_buttons[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
>> + Free(textW);
>> + }
>> +}
>> +
>> static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
>> BOOL custom_button)
>> {
>> @@ -487,6 +592,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
>> dialog_height = y + size.cy;
>> }
>> + /* Radio buttons */
>> + for (i = 0; i < dialog_info->radio_button_count; i++)
>> + {
>> + x = main_icon_right + h_spacing;
>> + y = dialog_height;
>> + taskdialog_get_checkbox_height(dialog_info, dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
>> + size.cx = dialog_width - x - h_spacing;
>> + SetWindowPos(dialog_info->radio_buttons[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
>> + dialog_height = y + size.cy;
>> + }
>> +
>> dialog_height = max(dialog_height, main_icon_bottom);
>> /* Common and custom buttons */
>> @@ -621,6 +737,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
>> taskdialog_add_main_instruction(dialog_info);
>> taskdialog_add_content(dialog_info);
>> taskdialog_add_progress_bar(dialog_info);
>> + taskdialog_add_radio_buttons(dialog_info);
>> taskdialog_add_buttons(dialog_info);
>> /* Set default button */
>> @@ -638,6 +755,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
>> if (dialog_info->font) DeleteObject(dialog_info->font);
>> if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
>> if (dialog_info->buttons) Free(dialog_info->buttons);
>> + if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
>> }
>> static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
>> @@ -689,6 +807,12 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
>> case TDM_SET_PROGRESS_BAR_MARQUEE:
>> SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
>> break;
>> + case TDM_CLICK_RADIO_BUTTON:
>> + taskdialog_click_radio_button(dialog_info, wParam);
>> + break;
>> + case TDM_ENABLE_RADIO_BUTTON:
>> + taskdialog_enable_radio_button(dialog_info, wParam, lParam);
>> + break;
>> case WM_INITDIALOG:
>> dialog_info = (struct taskdialog_info *)lParam;
>> @@ -697,6 +821,8 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
>> SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
>> taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
>> taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
>> + /* Default radio button click notification sent after TDN_CREATED */
>> + taskdialog_check_default_radio_buttons(dialog_info);
>> return FALSE;
>> case WM_COMMAND:
>> if (HIWORD(wParam) == BN_CLICKED)
>> @@ -762,7 +888,7 @@ HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *butto
>> Free(template);
>> if (button) *button = ret;
>> - if (radio_button) *radio_button = taskconfig->nDefaultButton;
>> + if (radio_button) *radio_button = dialog_info.selected_radio_id;
>> if (verification_flag_checked) *verification_flag_checked = TRUE;
>> return S_OK;
>> diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
>> index e91a878876..2cda04081f 100644
>> --- a/dlls/comctl32/tests/taskdialog.c
>> +++ b/dlls/comctl32/tests/taskdialog.c
>> @@ -35,9 +35,11 @@
>> #define TASKDIALOG_SEQ_INDEX 0
>> #define TEST_NUM_BUTTONS 10 /* Number of custom buttons to test with */
>> +#define TEST_NUM_RADIO_BUTTONS 3
>> #define ID_START 20 /* Lower IDs might be used by the system */
>> #define ID_START_BUTTON (ID_START + 0)
>> +#define ID_START_RADIO_BUTTON (ID_START + 20)
>> static HRESULT (WINAPI *pTaskDialogIndirect)(const TASKDIALOGCONFIG *, int *, int *, BOOL *);
>> static HRESULT (WINAPI *pTaskDialog)(HWND, HINSTANCE, const WCHAR *, const WCHAR *, const WCHAR *,
>> @@ -141,6 +143,78 @@ static const struct message_info msg_got_tdn_help[] =
>> { 0 }
>> };
>> +/* Three radio buttons */
>> +static const struct message_info msg_return_default_radio_button_1[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, NULL },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_default_radio_button_2[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, NULL },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_send_click_ok },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_default_radio_button_3[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, NULL },
>> + { TDN_RADIO_BUTTON_CLICKED, -2, 0, S_OK, msg_send_click_ok },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_select_first_radio_button[] =
>> +{
>> + { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_first_radio_button[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, NULL },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_radio_button },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_select_first_disabled_radio_button_and_press_ok[] =
>> +{
>> + { TDM_ENABLE_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
>> + { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
>> + { TDM_CLICK_BUTTON, IDOK, 0 },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_default_radio_button_clicking_disabled[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, NULL },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_disabled_radio_button_and_press_ok },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_no_default_radio_button_flag[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
>> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> +static const struct message_info msg_return_no_default_radio_button_id_and_flag[] =
>> +{
>> + { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
>> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
>> + { 0 }
>> +};
>> +
>> static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
>> {
>> msg->message = WM_TD_CALLBACK;
>> @@ -151,11 +225,13 @@ static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct
>> msg->stage = 0;
>> }
>> -#define run_test(info, expect_button, seq, context) \
>> - run_test_(info, expect_button, seq, context, ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
>> +#define run_test(info, expect_button, expect_radio_button, seq, context) \
>> + run_test_(info, expect_button, expect_radio_button, seq, context, \
>> + ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
>> -static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct message_info *test_messages,
>> - const char *context, int test_messages_len, const char *file, int line)
>> +static void run_test_(TASKDIALOGCONFIG *info, int expect_button, int expect_radio_button,
>> + const struct message_info *test_messages, const char *context, int test_messages_len,
>> + const char *file, int line)
>> {
>> struct message *msg, *msg_start;
>> int ret_button = 0;
>> @@ -182,6 +258,8 @@ static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct me
>> ok_sequence_(sequences, TASKDIALOG_SEQ_INDEX, msg_start, context, FALSE, file, line);
>> ok_(file, line)(ret_button == expect_button,
>> "Wrong button. Expected %d, got %d\n", expect_button, ret_button);
>> + ok_(file, line)(ret_radio == expect_radio_button,
>> + "Wrong radio button. Expected %d, got %d\n", expect_radio_button, ret_radio);
>> heap_free(msg_start);
>> }
>> @@ -239,16 +317,17 @@ static void test_callback(void)
>> info.pfCallback = taskdialog_callback_proc;
>> info.lpCallbackData = test_ref_data;
>> - run_test(&info, IDOK, msg_return_press_ok, "Press VK_RETURN.");
>> + run_test(&info, IDOK, 0, msg_return_press_ok, "Press VK_RETURN.");
>> }
>> static void test_buttons(void)
>> {
>> TASKDIALOGCONFIG info = {0};
>> - TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS];
>> + TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
>> const WCHAR button_format[] = {'%','0','2','d',0};
>> - WCHAR button_titles[TEST_NUM_BUTTONS * 3]; /* Each button has two digits as title, plus null-terminator */
>> + /* Each button has two digits as title, plus null-terminator */
>> + WCHAR button_titles[TEST_NUM_BUTTONS * 3], radio_button_titles[TEST_NUM_BUTTONS * 3];
>> int i;
>> info.cbSize = sizeof(TASKDIALOGCONFIG);
>> @@ -266,48 +345,103 @@ static void test_buttons(void)
>> }
>> custom_buttons[TEST_NUM_BUTTONS - 1].nButtonID = -1;
>> + /* Init radio buttons */
>> + for (i = 0; i < TEST_NUM_RADIO_BUTTONS; i++)
>> + {
>> + WCHAR *text = &radio_button_titles[i * 3];
>> + wsprintfW(text, button_format, i);
>> +
>> + radio_buttons[i].pszButtonText = text;
>> + radio_buttons[i].nButtonID = ID_START_RADIO_BUTTON + i;
>> + }
>> + radio_buttons[TEST_NUM_RADIO_BUTTONS - 1].nButtonID = -2;
>> +
>> /* Test nDefaultButton */
>> /* Test common buttons with invalid default ID */
>> info.nDefaultButton = 0; /* Should default to first created button */
>> info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
>> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
>> - run_test(&info, IDOK, msg_return_press_ok, "default button: unset default");
>> + run_test(&info, IDOK, 0, msg_return_press_ok, "default button: unset default");
>> info.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
>> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
>> - run_test(&info, IDYES, msg_return_press_yes, "default button: unset default");
>> + run_test(&info, IDYES, 0, msg_return_press_yes, "default button: unset default");
>> info.dwCommonButtons = TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
>> - run_test(&info, IDNO, msg_return_press_no, "default button: unset default");
>> + run_test(&info, IDNO, 0, msg_return_press_no, "default button: unset default");
>> info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
>> - run_test(&info, IDRETRY, msg_return_press_retry, "default button: unset default");
>> + run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: unset default");
>> info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
>> - run_test(&info, IDCANCEL, msg_return_press_cancel, "default button: unset default");
>> + run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
>> /* Test with all common and custom buttons and invalid default ID */
>> info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
>> info.cButtons = TEST_NUM_BUTTONS;
>> info.pButtons = custom_buttons;
>> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
>> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
>> info.nDefaultButton = -1; /* Should work despite button ID -1 */
>> - run_test(&info, -1, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
>> + run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
>> info.nDefaultButton = -2; /* Should also default to first created button */
>> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
>> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
>> /* Test with only custom buttons and invalid default ID */
>> info.dwCommonButtons = 0;
>> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, no common buttons");
>> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
>> /* Test with common and custom buttons and valid default ID */
>> info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
>> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
>> info.nDefaultButton = IDRETRY;
>> - run_test(&info, IDRETRY, msg_return_press_retry, "default button: valid default - 1");
>> + run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
>> /* Test with common and custom buttons and valid default ID */
>> info.nDefaultButton = ID_START_BUTTON + 3;
>> - run_test(&info, ID_START_BUTTON + 3, msg_return_press_custom4, "default button: valid default - 2");
>> + run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
>> +
>> + /* Test radio buttons */
>> + info.nDefaultButton = 0;
>> + info.cButtons = 0;
>> + info.pButtons = 0;
>> + info.dwCommonButtons = TDCBF_OK_BUTTON;
>> + info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
>> + info.pRadioButtons = radio_buttons;
>> +
>> + /* Test default first radio button */
>> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_1, "default radio button: default first radio button");
>> +
>> + /* Test default radio button */
>> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
>> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_2, "default radio button: default radio button");
>> +
>> + /* Test default radio button with -2 */
>> + info.nDefaultRadioButton = -2;
>> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_3, "default radio button: default radio button with id -2");
>> +
>> + /* Test default radio button after clicking the first, messages still work even radio button is disabled */
>> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
>> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_first_radio_button, "default radio button: radio button after clicking");
>> +
>> + /* Test radio button after disabling and clicking the first */
>> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
>> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_clicking_disabled, "default radio button: disable radio button before clicking");
>> +
>> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set, TDN_RADIO_BUTTON_CLICKED will still be received, just radio button not selected */
>> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON;
>> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
>> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_no_default_radio_button_flag, "default radio button: no default radio flag");
>> +
>> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is 0.
>> + * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
>> + info.nDefaultRadioButton = 0;
>> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
>> + run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default radio id and flag");
>> +
>> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is invalid.
>> + * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
>> + info.nDefaultRadioButton = 0xff;
>> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
>> + run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default flag, invalid id");
>> }
>> static void test_help(void)
>> @@ -319,7 +453,7 @@ static void test_help(void)
>> info.lpCallbackData = test_ref_data;
>> info.dwCommonButtons = TDCBF_OK_BUTTON;
>> - run_test(&info, IDOK, msg_got_tdn_help, "send f1");
>> + run_test(&info, IDOK, 0, msg_got_tdn_help, "send f1");
>> }
>> struct timer_notification_data
>
>
>
June 25, 2018
Re: [PATCH 2/3] comctl32/taskdialog: Add support for radio buttons.
by Nikolay Sivov
On 06/17/2018 11:17 AM, Zhiyi Zhang wrote:
> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
> ---
> dlls/comctl32/taskdialog.c | 130 ++++++++++++++++++++++-
> dlls/comctl32/tests/taskdialog.c | 172 +++++++++++++++++++++++++++----
> 2 files changed, 281 insertions(+), 21 deletions(-)
>
> diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
> index 33fb578910..c3c5fa0420 100644
> --- a/dlls/comctl32/taskdialog.c
> +++ b/dlls/comctl32/taskdialog.c
> @@ -58,6 +58,8 @@ struct taskdialog_info
> HWND main_instruction;
> HWND content;
> HWND progress_bar;
> + HWND *radio_buttons;
> + INT radio_button_count;
> HWND *buttons;
> INT button_count;
> HWND default_button;
> @@ -69,6 +71,7 @@ struct taskdialog_info
> LONG h_spacing;
> LONG v_spacing;
> } m;
> + INT selected_radio_id;
> };
>
> struct button_layout_info
> @@ -185,6 +188,18 @@ static void taskdialog_enable_button(const struct taskdialog_info *dialog_info,
> if (hwnd) EnableWindow(hwnd, enable);
> }
>
> +static void taskdialog_enable_radio_button(const struct taskdialog_info *dialog_info, INT id, BOOL enable)
> +{
> + HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
> + if (hwnd) EnableWindow(hwnd, enable);
> +}
> +
> +static void taskdialog_click_radio_button(const struct taskdialog_info *dialog_info, INT id)
> +{
> + HWND hwnd = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, id);
> + if (hwnd) SendMessageW(hwnd, BM_CLICK, 0, 0);
> +}
> +
> static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
> {
> const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
> @@ -193,8 +208,18 @@ static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notif
> : S_OK;
> }
>
> -static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
> +static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, unsigned long command_id)
Why the type change?
> {
> + HWND radio_button;
> +
> + radio_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count, command_id);
> + if (radio_button)
> + {
> + dialog_info->selected_radio_id = command_id;
> + taskdialog_notify(dialog_info, TDN_RADIO_BUTTON_CLICKED, command_id, 0);
> + return;
> + }
> +
> if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
> EndDialog(dialog_info->hwnd, command_id);
> }
> @@ -260,6 +285,40 @@ static void taskdialog_get_label_size(struct taskdialog_info *dialog_info, HWND
> ReleaseDC(hwnd, hdc);
> }
>
> +static void taskdialog_get_checkbox_height(struct taskdialog_info *dialog_info, HWND hwnd, LONG max_width, SIZE *size)
Do we call that "checkbox" anywhere in wine? It doesn't feel right.
> +{
> + DWORD style = DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK;
> + HFONT hfont, old_hfont;
> + HDC hdc;
> + RECT rect = {0};
> + WCHAR text[1024];
I think it's better to make this dynamic.
> + INT text_length;
> + LONG text_offset, checkbox_width, checkbox_height;
> +
> + hdc = GetDC(hwnd);
> + hfont = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
> + old_hfont = SelectObject(hdc, hfont);
> +
> + checkbox_width = 12 * GetDeviceCaps(hdc, LOGPIXELSX) / 96 + 1;
> + checkbox_height = 12 * GetDeviceCaps(hdc, LOGPIXELSY) / 96 + 1;
> + GetCharWidthW(hdc, '0', '0', &text_offset);
> + text_offset /= 2;
> +
> + if (dialog_info->taskconfig->dwFlags & TDF_RTL_LAYOUT)
> + style |= DT_RIGHT | DT_RTLREADING;
> + else
> + style |= DT_LEFT;
> +
> + rect.right = max_width - checkbox_width - text_offset;
> + text_length = GetWindowTextW(hwnd, text, ARRAY_SIZE(text));
> + size->cy = DrawTextW(hdc, text, text_length, &rect, style);
> + size->cx = min(max_width - checkbox_width - text_offset, rect.right - rect.left);
> + size->cx += checkbox_width + text_offset;
> + size->cy = max(size->cy, checkbox_height);
> + if (old_hfont) SelectObject(hdc, old_hfont);
> + ReleaseDC(hwnd, hdc);
> +}
> +
> static ULONG_PTR taskdialog_get_standard_icon(LPCWSTR icon)
> {
> if (icon == TD_WARNING_ICON)
> @@ -300,6 +359,28 @@ static void taskdialog_set_icon(struct taskdialog_info *dialog_info, INT element
> }
> }
>
> +static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialog_info)
> +{
> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
> + HWND default_button;
> + INT id;
> +
> + if (!dialog_info->radio_button_count) return;
> +
> + default_button = taskdialog_find_button(dialog_info->radio_buttons, dialog_info->radio_button_count,
> + taskconfig->nDefaultRadioButton);
> +
> + if (!default_button && !(taskconfig->dwFlags & TDF_NO_DEFAULT_RADIO_BUTTON))
> + default_button = dialog_info->radio_buttons[0];
> +
> + if (default_button)
> + {
> + SendMessageW(default_button, BM_SETCHECK, BST_CHECKED, 0);
> + id = GetWindowLongW(default_button, GWLP_ID);
> + taskdialog_on_button_click(dialog_info, id);
> + }
> +}
> +
> static void taskdialog_add_main_icon(struct taskdialog_info *dialog_info)
> {
> if (!dialog_info->taskconfig->u.hMainIcon) return;
> @@ -363,6 +444,30 @@ static void taskdialog_add_progress_bar(struct taskdialog_info *dialog_info)
> CreateWindowW(PROGRESS_CLASSW, NULL, style, 0, 0, 0, 0, dialog_info->hwnd, NULL, 0, NULL);
> }
>
> +static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
> +{
> + const TASKDIALOGCONFIG *taskconfig = dialog_info->taskconfig;
> + static const DWORD style = BS_AUTORADIOBUTTON | BS_MULTILINE | BS_TOP | WS_CHILD | WS_VISIBLE | WS_TABSTOP;
> + WCHAR *textW;
> + INT i;
> +
> + if (!taskconfig->cRadioButtons || !taskconfig->pRadioButtons) return;
> +
> + dialog_info->radio_buttons = Alloc(taskconfig->cRadioButtons * sizeof(*dialog_info->radio_buttons));
> + if (!dialog_info->radio_buttons) return;
> +
> + dialog_info->radio_button_count = taskconfig->cRadioButtons;
> + for (i = 0; i < dialog_info->radio_button_count; i++)
> + {
> + textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pRadioButtons[i].pszButtonText);
> + dialog_info->radio_buttons[i] =
> + CreateWindowW(WC_BUTTONW, textW, i == 0 ? style | WS_GROUP : style, 0, 0, 0, 0, dialog_info->hwnd,
> + (HMENU)taskconfig->pRadioButtons[i].nButtonID, 0, NULL);
> + SendMessageW(dialog_info->radio_buttons[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
> + Free(textW);
> + }
> +}
> +
> static void taskdialog_add_button(struct taskdialog_info *dialog_info, HWND *button, INT_PTR id, const WCHAR *text,
> BOOL custom_button)
> {
> @@ -487,6 +592,17 @@ static void taskdialog_layout(struct taskdialog_info *dialog_info)
> dialog_height = y + size.cy;
> }
>
> + /* Radio buttons */
> + for (i = 0; i < dialog_info->radio_button_count; i++)
> + {
> + x = main_icon_right + h_spacing;
> + y = dialog_height;
> + taskdialog_get_checkbox_height(dialog_info, dialog_info->radio_buttons[i], dialog_width - x - h_spacing, &size);
> + size.cx = dialog_width - x - h_spacing;
> + SetWindowPos(dialog_info->radio_buttons[i], 0, x, y, size.cx, size.cy, SWP_NOZORDER);
> + dialog_height = y + size.cy;
> + }
> +
> dialog_height = max(dialog_height, main_icon_bottom);
>
> /* Common and custom buttons */
> @@ -621,6 +737,7 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
> taskdialog_add_main_instruction(dialog_info);
> taskdialog_add_content(dialog_info);
> taskdialog_add_progress_bar(dialog_info);
> + taskdialog_add_radio_buttons(dialog_info);
> taskdialog_add_buttons(dialog_info);
>
> /* Set default button */
> @@ -638,6 +755,7 @@ static void taskdialog_destroy(struct taskdialog_info *dialog_info)
> if (dialog_info->font) DeleteObject(dialog_info->font);
> if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
> if (dialog_info->buttons) Free(dialog_info->buttons);
> + if (dialog_info->radio_buttons) Free(dialog_info->radio_buttons);
> }
>
> static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
> @@ -689,6 +807,12 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
> case TDM_SET_PROGRESS_BAR_MARQUEE:
> SendMessageW(dialog_info->progress_bar, PBM_SETMARQUEE, wParam, lParam);
> break;
> + case TDM_CLICK_RADIO_BUTTON:
> + taskdialog_click_radio_button(dialog_info, wParam);
> + break;
> + case TDM_ENABLE_RADIO_BUTTON:
> + taskdialog_enable_radio_button(dialog_info, wParam, lParam);
> + break;
> case WM_INITDIALOG:
> dialog_info = (struct taskdialog_info *)lParam;
>
> @@ -697,6 +821,8 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
> SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
> taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
> taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
> + /* Default radio button click notification sent after TDN_CREATED */
> + taskdialog_check_default_radio_buttons(dialog_info);
> return FALSE;
> case WM_COMMAND:
> if (HIWORD(wParam) == BN_CLICKED)
> @@ -762,7 +888,7 @@ HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *butto
> Free(template);
>
> if (button) *button = ret;
> - if (radio_button) *radio_button = taskconfig->nDefaultButton;
> + if (radio_button) *radio_button = dialog_info.selected_radio_id;
> if (verification_flag_checked) *verification_flag_checked = TRUE;
>
> return S_OK;
> diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
> index e91a878876..2cda04081f 100644
> --- a/dlls/comctl32/tests/taskdialog.c
> +++ b/dlls/comctl32/tests/taskdialog.c
> @@ -35,9 +35,11 @@
> #define TASKDIALOG_SEQ_INDEX 0
>
> #define TEST_NUM_BUTTONS 10 /* Number of custom buttons to test with */
> +#define TEST_NUM_RADIO_BUTTONS 3
>
> #define ID_START 20 /* Lower IDs might be used by the system */
> #define ID_START_BUTTON (ID_START + 0)
> +#define ID_START_RADIO_BUTTON (ID_START + 20)
>
> static HRESULT (WINAPI *pTaskDialogIndirect)(const TASKDIALOGCONFIG *, int *, int *, BOOL *);
> static HRESULT (WINAPI *pTaskDialog)(HWND, HINSTANCE, const WCHAR *, const WCHAR *, const WCHAR *,
> @@ -141,6 +143,78 @@ static const struct message_info msg_got_tdn_help[] =
> { 0 }
> };
>
> +/* Three radio buttons */
> +static const struct message_info msg_return_default_radio_button_1[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, NULL },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_default_radio_button_2[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, NULL },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_send_click_ok },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_default_radio_button_3[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, NULL },
> + { TDN_RADIO_BUTTON_CLICKED, -2, 0, S_OK, msg_send_click_ok },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_select_first_radio_button[] =
> +{
> + { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_first_radio_button[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, NULL },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_radio_button },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_click_ok },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_select_first_disabled_radio_button_and_press_ok[] =
> +{
> + { TDM_ENABLE_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
> + { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON, 0 },
> + { TDM_CLICK_BUTTON, IDOK, 0 },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_default_radio_button_clicking_disabled[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, NULL },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON + 1, 0, S_OK, msg_select_first_disabled_radio_button_and_press_ok },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_no_default_radio_button_flag[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
> + { TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> +static const struct message_info msg_return_no_default_radio_button_id_and_flag[] =
> +{
> + { TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
> + { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
> + { 0 }
> +};
> +
> static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
> {
> msg->message = WM_TD_CALLBACK;
> @@ -151,11 +225,13 @@ static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct
> msg->stage = 0;
> }
>
> -#define run_test(info, expect_button, seq, context) \
> - run_test_(info, expect_button, seq, context, ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
> +#define run_test(info, expect_button, expect_radio_button, seq, context) \
> + run_test_(info, expect_button, expect_radio_button, seq, context, \
> + ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
>
> -static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct message_info *test_messages,
> - const char *context, int test_messages_len, const char *file, int line)
> +static void run_test_(TASKDIALOGCONFIG *info, int expect_button, int expect_radio_button,
> + const struct message_info *test_messages, const char *context, int test_messages_len,
> + const char *file, int line)
> {
> struct message *msg, *msg_start;
> int ret_button = 0;
> @@ -182,6 +258,8 @@ static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct me
> ok_sequence_(sequences, TASKDIALOG_SEQ_INDEX, msg_start, context, FALSE, file, line);
> ok_(file, line)(ret_button == expect_button,
> "Wrong button. Expected %d, got %d\n", expect_button, ret_button);
> + ok_(file, line)(ret_radio == expect_radio_button,
> + "Wrong radio button. Expected %d, got %d\n", expect_radio_button, ret_radio);
>
> heap_free(msg_start);
> }
> @@ -239,16 +317,17 @@ static void test_callback(void)
> info.pfCallback = taskdialog_callback_proc;
> info.lpCallbackData = test_ref_data;
>
> - run_test(&info, IDOK, msg_return_press_ok, "Press VK_RETURN.");
> + run_test(&info, IDOK, 0, msg_return_press_ok, "Press VK_RETURN.");
> }
>
> static void test_buttons(void)
> {
> TASKDIALOGCONFIG info = {0};
>
> - TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS];
> + TASKDIALOG_BUTTON custom_buttons[TEST_NUM_BUTTONS], radio_buttons[TEST_NUM_RADIO_BUTTONS];
> const WCHAR button_format[] = {'%','0','2','d',0};
> - WCHAR button_titles[TEST_NUM_BUTTONS * 3]; /* Each button has two digits as title, plus null-terminator */
> + /* Each button has two digits as title, plus null-terminator */
> + WCHAR button_titles[TEST_NUM_BUTTONS * 3], radio_button_titles[TEST_NUM_BUTTONS * 3];
> int i;
>
> info.cbSize = sizeof(TASKDIALOGCONFIG);
> @@ -266,48 +345,103 @@ static void test_buttons(void)
> }
> custom_buttons[TEST_NUM_BUTTONS - 1].nButtonID = -1;
>
> + /* Init radio buttons */
> + for (i = 0; i < TEST_NUM_RADIO_BUTTONS; i++)
> + {
> + WCHAR *text = &radio_button_titles[i * 3];
> + wsprintfW(text, button_format, i);
> +
> + radio_buttons[i].pszButtonText = text;
> + radio_buttons[i].nButtonID = ID_START_RADIO_BUTTON + i;
> + }
> + radio_buttons[TEST_NUM_RADIO_BUTTONS - 1].nButtonID = -2;
> +
> /* Test nDefaultButton */
>
> /* Test common buttons with invalid default ID */
> info.nDefaultButton = 0; /* Should default to first created button */
> info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
> - run_test(&info, IDOK, msg_return_press_ok, "default button: unset default");
> + run_test(&info, IDOK, 0, msg_return_press_ok, "default button: unset default");
> info.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
> - run_test(&info, IDYES, msg_return_press_yes, "default button: unset default");
> + run_test(&info, IDYES, 0, msg_return_press_yes, "default button: unset default");
> info.dwCommonButtons = TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
> - run_test(&info, IDNO, msg_return_press_no, "default button: unset default");
> + run_test(&info, IDNO, 0, msg_return_press_no, "default button: unset default");
> info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
> - run_test(&info, IDRETRY, msg_return_press_retry, "default button: unset default");
> + run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: unset default");
> info.dwCommonButtons = TDCBF_CANCEL_BUTTON | TDCBF_CLOSE_BUTTON;
> - run_test(&info, IDCANCEL, msg_return_press_cancel, "default button: unset default");
> + run_test(&info, IDCANCEL, 0, msg_return_press_cancel, "default button: unset default");
>
> /* Test with all common and custom buttons and invalid default ID */
> info.nDefaultButton = 0xff; /* Random ID, should also default to first created button */
> info.cButtons = TEST_NUM_BUTTONS;
> info.pButtons = custom_buttons;
> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 1");
>
> info.nDefaultButton = -1; /* Should work despite button ID -1 */
> - run_test(&info, -1, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
> + run_test(&info, -1, 0, msg_return_press_custom10, "default button: invalid default, with common buttons - 2");
>
> info.nDefaultButton = -2; /* Should also default to first created button */
> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, with common buttons - 3");
>
> /* Test with only custom buttons and invalid default ID */
> info.dwCommonButtons = 0;
> - run_test(&info, ID_START_BUTTON, msg_return_press_custom1, "default button: invalid default, no common buttons");
> + run_test(&info, ID_START_BUTTON, 0, msg_return_press_custom1, "default button: invalid default, no common buttons");
>
> /* Test with common and custom buttons and valid default ID */
> info.dwCommonButtons = TDCBF_OK_BUTTON | TDCBF_YES_BUTTON | TDCBF_NO_BUTTON
> | TDCBF_CANCEL_BUTTON | TDCBF_RETRY_BUTTON | TDCBF_CLOSE_BUTTON;
> info.nDefaultButton = IDRETRY;
> - run_test(&info, IDRETRY, msg_return_press_retry, "default button: valid default - 1");
> + run_test(&info, IDRETRY, 0, msg_return_press_retry, "default button: valid default - 1");
>
> /* Test with common and custom buttons and valid default ID */
> info.nDefaultButton = ID_START_BUTTON + 3;
> - run_test(&info, ID_START_BUTTON + 3, msg_return_press_custom4, "default button: valid default - 2");
> + run_test(&info, ID_START_BUTTON + 3, 0, msg_return_press_custom4, "default button: valid default - 2");
> +
> + /* Test radio buttons */
> + info.nDefaultButton = 0;
> + info.cButtons = 0;
> + info.pButtons = 0;
> + info.dwCommonButtons = TDCBF_OK_BUTTON;
> + info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
> + info.pRadioButtons = radio_buttons;
> +
> + /* Test default first radio button */
> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_1, "default radio button: default first radio button");
> +
> + /* Test default radio button */
> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_2, "default radio button: default radio button");
> +
> + /* Test default radio button with -2 */
> + info.nDefaultRadioButton = -2;
> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_default_radio_button_3, "default radio button: default radio button with id -2");
> +
> + /* Test default radio button after clicking the first, messages still work even radio button is disabled */
> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_first_radio_button, "default radio button: radio button after clicking");
> +
> + /* Test radio button after disabling and clicking the first */
> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON + 1;
> + run_test(&info, IDOK, ID_START_RADIO_BUTTON, msg_return_default_radio_button_clicking_disabled, "default radio button: disable radio button before clicking");
> +
> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set, TDN_RADIO_BUTTON_CLICKED will still be received, just radio button not selected */
> + info.nDefaultRadioButton = ID_START_RADIO_BUTTON;
> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
> + run_test(&info, IDOK, info.nDefaultRadioButton, msg_return_no_default_radio_button_flag, "default radio button: no default radio flag");
> +
> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is 0.
> + * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
> + info.nDefaultRadioButton = 0;
> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
> + run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default radio id and flag");
> +
> + /* Test no default radio button, TDF_NO_DEFAULT_RADIO_BUTTON is set and nDefaultRadioButton is invalid.
> + * TDN_RADIO_BUTTON_CLICKED will not be sent, and just radio button not selected */
> + info.nDefaultRadioButton = 0xff;
> + info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
> + run_test(&info, IDOK, 0, msg_return_no_default_radio_button_id_and_flag, "default radio button: no default flag, invalid id");
> }
>
> static void test_help(void)
> @@ -319,7 +453,7 @@ static void test_help(void)
> info.lpCallbackData = test_ref_data;
> info.dwCommonButtons = TDCBF_OK_BUTTON;
>
> - run_test(&info, IDOK, msg_got_tdn_help, "send f1");
> + run_test(&info, IDOK, 0, msg_got_tdn_help, "send f1");
> }
>
> struct timer_notification_data
June 25, 2018