Module: wine Branch: master Commit: 4c7f9efd16caee6c1641532d8051f2a1882e217e URL: http://source.winehq.org/git/wine.git/?a=commit;h=4c7f9efd16caee6c1641532d80...
Author: Andrew Nguyen anguyen@codeweavers.com Date: Tue Jul 27 02:36:50 2010 -0500
propsys: Fix comma processing in PSPropertyKeyFromString.
---
dlls/propsys/propsys_main.c | 59 +++++++++++++++++++++++++++++------------- dlls/propsys/tests/propsys.c | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/dlls/propsys/propsys_main.c b/dlls/propsys/propsys_main.c index 35efda8..6c46781 100644 --- a/dlls/propsys/propsys_main.c +++ b/dlls/propsys/propsys_main.c @@ -216,7 +216,7 @@ static BOOL string_to_guid(LPCWSTR s, LPGUID id)
HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey) { - int has_minus = 0; + int has_minus = 0, has_comma = 0;
TRACE("(%s, %p)\n", debugstr_w(pszString), pkey);
@@ -233,31 +233,54 @@ HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey) if (!*pszString) return E_INVALIDARG;
- /* Only the space seems to be recognized as whitespace. */ - while (*pszString == ' ') + /* Only the space seems to be recognized as whitespace. The comma is only + * recognized once and processing terminates if another comma is found. */ + while (*pszString == ' ' || *pszString == ',') + { + if (*pszString == ',') + { + if (has_comma) + return S_OK; + else + has_comma = 1; + } pszString++; + }
if (!*pszString) return E_INVALIDARG;
- /* Only two minus signs are recognized. The first is ignored, and the - * second is interpreted. */ - if (*pszString == '-') - pszString++; - - /* Skip any intermediate spaces after the first minus sign. */ - while (*pszString == ' ') - pszString++; - - if (*pszString == '-') + /* Only two minus signs are recognized if no comma is detected. The first + * sign is ignored, and the second is interpreted. If a comma is detected + * before the minus sign, then only one minus sign counts, and property ID + * interpretation begins with the next character. */ + if (has_comma) { - has_minus = 1; - pszString++; + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } } + else + { + if (*pszString == '-') + pszString++;
- /* Skip any remaining spaces after minus sign. */ - while (*pszString == ' ') - pszString++; + /* Skip any intermediate spaces after the first minus sign. */ + while (*pszString == ' ') + pszString++; + + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } + + /* Skip any remaining spaces after minus sign. */ + while (*pszString == ' ') + pszString++; + }
/* Overflow is not checked. */ while (isdigitW(*pszString)) diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 8c11c42..d734029 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -290,6 +290,42 @@ static void test_PSPropertyKeyFromString(void) static const WCHAR fmtid_overflowpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', '1','2','3','4','-','1','2','3','4','-', '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','2','3','4','5','6','7','8','9','0','1',0}; + static const WCHAR fmtid_commapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',',',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspacepidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_spacecommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommaspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_spacescommaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','-','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_commanegspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_negcommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}','-',',','1','3','5','7','9',0}; static const WCHAR fmtid_normalpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', '1','2','3','4','-','1','2','3','4','-', '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','3','5','7','9',0}; @@ -357,6 +393,18 @@ static void test_PSPropertyKeyFromString(void) {fmtid_hexpidW, &out, S_OK, {expect_guid, 0}}, {fmtid_mixedpidW, &out, S_OK, {expect_guid, 0}}, {fmtid_overflowpidW, &out, S_OK, {expect_guid, 3755744309U}}, + {fmtid_commapidW, &out, S_OK, {expect_guid, 13579}}, + {fmtid_commaspidW, &out, S_OK, {expect_guid, 0}}, + {fmtid_commaspacepidW, &out, S_OK, {expect_guid, 13579}}, + {fmtid_spacecommapidW, &out, S_OK, {expect_guid, 13579}}, + {fmtid_spccommaspcpidW, &out, S_OK, {expect_guid, 13579}}, + {fmtid_spacescommaspidW, &out, S_OK, {expect_guid, 0}}, + {fmtid_commanegpidW, &out, S_OK, {expect_guid, 4294953717U}}, + {fmtid_spccommanegpidW, &out, S_OK, {expect_guid, 4294953717U}}, + {fmtid_commaspcnegpidW, &out, S_OK, {expect_guid, 4294953717U}}, + {fmtid_spccommaspcnegpidW, &out, S_OK, {expect_guid, 4294953717U}}, + {fmtid_commanegspcpidW, &out, S_OK, {expect_guid, 0U}}, + {fmtid_negcommapidW, &out, S_OK, {expect_guid, 0}}, {fmtid_normalpidW, &out, S_OK, {expect_guid, 13579}}, };