winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
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
List overview
wine-commits
June 2022
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
791 discussions
Start a n
N
ew thread
Alexandre Julliard : ntdll: Add strncat_s and wcsncat_s.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 7c70b9397f3ece7db9022760aa18d7af63b19f76 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7c70b9397f3ece7db9022760…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jun 29 11:49:55 2022 +0200 ntdll: Add strncat_s and wcsncat_s. Implementation copied from msvcrt. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/string.c | 41 +++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/wcstring.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 95b2e652b3d..e02c4278deb 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1595,6 +1595,7 @@ @ cdecl strcspn(str str) @ cdecl strlen(str) @ cdecl strncat(str str long) +@ cdecl strncat_s(str long str long) @ cdecl strncmp(str str long) @ cdecl strncpy(ptr str long) @ cdecl strncpy_s(ptr long str long) @@ -1626,6 +1627,7 @@ @ cdecl wcscspn(wstr wstr) @ cdecl wcslen(wstr) @ cdecl wcsncat(wstr wstr long) +@ cdecl wcsncat_s(wstr long wstr long) @ cdecl wcsncmp(wstr wstr long) @ cdecl wcsncpy(ptr wstr long) @ cdecl wcsncpy_s(ptr long wstr long) diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 212cd30e2f1..6c4ac47803a 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -332,6 +332,47 @@ char * __cdecl strncat( char *dst, const char *src, size_t len ) } +/********************************************************************* + * strncat_s (NTDLL.@) + */ +errno_t __cdecl strncat_s( char *dst, size_t len, const char *src, size_t count ) +{ + size_t i, j; + + if (!dst || !len) return EINVAL; + if (!count) return 0; + if (!src) + { + *dst = 0; + return EINVAL; + } + + for (i = 0; i < len; i++) if (!dst[i]) break; + + if (i == len) + { + *dst = 0; + return EINVAL; + } + + for (j = 0; (j + i) < len; j++) + { + if (count == _TRUNCATE && j + i == len - 1) + { + dst[j + i] = 0; + return STRUNCATE; + } + if (j == count || !(dst[j + i] = src[j])) + { + dst[j + i] = 0; + return 0; + } + } + *dst = 0; + return ERANGE; +} + + /********************************************************************* * strncmp (NTDLL.@) */ diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index cb45986207d..e481c89ca71 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -268,6 +268,47 @@ LPWSTR __cdecl wcsncat( LPWSTR s1, LPCWSTR s2, size_t n ) } +/********************************************************************* + * wcsncat_s (NTDLL.@) + */ +errno_t __cdecl wcsncat_s( wchar_t *dst, size_t len, const wchar_t *src, size_t count ) +{ + size_t i, j; + + if (!dst || !len) return EINVAL; + if (!count) return 0; + if (!src) + { + *dst = 0; + return EINVAL; + } + + for (i = 0; i < len; i++) if (!dst[i]) break; + + if (i == len) + { + *dst = 0; + return EINVAL; + } + + for (j = 0; (j + i) < len; j++) + { + if (count == _TRUNCATE && j + i == len - 1) + { + dst[j + i] = 0; + return STRUNCATE; + } + if (j == count || !(dst[j + i] = src[j])) + { + dst[j + i] = 0; + return 0; + } + } + *dst = 0; + return ERANGE; +} + + /********************************************************************* * wcsncmp (NTDLL.@) */
1
0
0
0
Alexandre Julliard : ntdll: Add strncpy_s and wcsncpy_s.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 94e960c861c013771d72022ef994d38e937cef58 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=94e960c861c013771d72022e…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jun 29 11:49:38 2022 +0200 ntdll: Add strncpy_s and wcsncpy_s. Implementation copied from msvcrt. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/string.c | 42 ++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/wcstring.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 1e94d23c7df..95b2e652b3d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1597,6 +1597,7 @@ @ cdecl strncat(str str long) @ cdecl strncmp(str str long) @ cdecl strncpy(ptr str long) +@ cdecl strncpy_s(ptr long str long) @ cdecl strnlen(ptr long) @ cdecl strpbrk(str str) @ cdecl strrchr(str long) @@ -1627,6 +1628,7 @@ @ cdecl wcsncat(wstr wstr long) @ cdecl wcsncmp(wstr wstr long) @ cdecl wcsncpy(ptr wstr long) +@ cdecl wcsncpy_s(ptr long wstr long) @ cdecl wcsnlen(ptr long) @ cdecl wcspbrk(wstr wstr) @ cdecl wcsrchr(wstr long) diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 8a37cd6d8d4..212cd30e2f1 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -356,6 +356,48 @@ char * __cdecl strncpy( char *dst, const char *src, size_t len ) } +/********************************************************************* + * strncpy_s (NTDLL.@) + */ +errno_t __cdecl strncpy_s( char *dst, size_t len, const char *src, size_t count ) +{ + size_t i, end; + + if (!count) + { + if (dst && len) *dst = 0; + return 0; + } + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + if (count != _TRUNCATE && count < len) + end = count; + else + end = len - 1; + + for (i = 0; i < end; i++) + if (!(dst[i] = src[i])) return 0; + + if (count == _TRUNCATE) + { + dst[i] = 0; + return STRUNCATE; + } + if (end == count) + { + dst[i] = 0; + return 0; + } + dst[0] = 0; + return ERANGE; +} + + /********************************************************************* * strnlen (NTDLL.@) */ diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index d5e50981153..cb45986207d 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -292,6 +292,48 @@ LPWSTR __cdecl wcsncpy( LPWSTR s1, LPCWSTR s2, size_t n ) } +/********************************************************************* + * wcsncpy_s (NTDLL.@) + */ +errno_t __cdecl wcsncpy_s( wchar_t *dst, size_t len, const wchar_t *src, size_t count ) +{ + size_t i, end; + + if (!count) + { + if (dst && len) *dst = 0; + return 0; + } + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + if (count != _TRUNCATE && count < len) + end = count; + else + end = len - 1; + + for (i = 0; i < end; i++) + if (!(dst[i] = src[i])) return 0; + + if (count == _TRUNCATE) + { + dst[i] = 0; + return STRUNCATE; + } + if (end == count) + { + dst[i] = 0; + return 0; + } + dst[0] = 0; + return ERANGE; +} + + /********************************************************************* * wcsnlen (NTDLL.@) */
1
0
0
0
Alexandre Julliard : ntdll: Add strcat_s and wcscat_s.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 83cd792e355f94e39b63eedc295b1cbfa25bea83 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=83cd792e355f94e39b63eedc…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jun 29 11:49:14 2022 +0200 ntdll: Add strcat_s and wcscat_s. Implementation copied from msvcrt. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/string.c | 20 ++++++++++++++++++++ dlls/ntdll/wcstring.c | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 93cb322f06d..1e94d23c7df 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1587,6 +1587,7 @@ @ cdecl sqrt(double) @ varargs sscanf(str str) @ cdecl strcat(str str) +@ cdecl strcat_s(str long str) @ cdecl strchr(str long) @ cdecl strcmp(str str) @ cdecl strcpy(ptr str) @@ -1616,6 +1617,7 @@ @ cdecl vsprintf_s(ptr long str ptr) @ cdecl vswprintf_s(ptr long wstr ptr) @ cdecl wcscat(wstr wstr) +@ cdecl wcscat_s(wstr long wstr) @ cdecl wcschr(wstr long) @ cdecl wcscmp(wstr wstr) @ cdecl wcscpy(ptr wstr) diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 6308ecfe049..8a37cd6d8d4 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -224,6 +224,26 @@ char * __cdecl strcat( char *dst, const char *src ) } +/********************************************************************* + * strcat_s (NTDLL.@) + */ +errno_t __cdecl strcat_s( char *dst, size_t len, const char *src ) +{ + size_t i, j; + + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + for (i = 0; i < len; i++) if (!dst[i]) break; + for (j = 0; (j + i) < len; j++) if (!(dst[j + i] = src[j])) return 0; + *dst = 0; + return ERANGE; +} + + /********************************************************************* * strchr (NTDLL.@) */ diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index b6afdb1d72e..d5e50981153 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -204,6 +204,26 @@ LPWSTR __cdecl wcscat( LPWSTR dst, LPCWSTR src ) } +/********************************************************************* + * wcscat_s (NTDLL.@) + */ +errno_t __cdecl wcscat_s( wchar_t *dst, size_t len, const wchar_t *src ) +{ + size_t i, j; + + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + for (i = 0; i < len; i++) if (!dst[i]) break; + for (j = 0; (j + i) < len; j++) if (!(dst[j + i] = src[j])) return 0; + *dst = 0; + return ERANGE; +} + + /********************************************************************* * wcschr (NTDLL.@) */
1
0
0
0
Alexandre Julliard : ntdll: Add strcpy_s and wcscpy_s.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 41f488a32d17b47a88606d538f6ab10fed96bad6 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=41f488a32d17b47a88606d53…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jun 29 11:48:47 2022 +0200 ntdll: Add strcpy_s and wcscpy_s. Implementation copied from msvcrt. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/string.c | 21 +++++++++++++++++++++ dlls/ntdll/wcstring.c | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index fa1941ec811..93cb322f06d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1590,6 +1590,7 @@ @ cdecl strchr(str long) @ cdecl strcmp(str str) @ cdecl strcpy(ptr str) +@ cdecl strcpy_s(ptr long str) @ cdecl strcspn(str str) @ cdecl strlen(str) @ cdecl strncat(str str long) @@ -1618,6 +1619,7 @@ @ cdecl wcschr(wstr long) @ cdecl wcscmp(wstr wstr) @ cdecl wcscpy(ptr wstr) +@ cdecl wcscpy_s(ptr long wstr) @ cdecl wcscspn(wstr wstr) @ cdecl wcslen(wstr) @ cdecl wcsncat(wstr wstr long) diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 9c46b02aac4..6308ecfe049 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -21,6 +21,7 @@ */ #include <limits.h> +#include <errno.h> #include <stdarg.h> #include <stdlib.h> #include <stdio.h> @@ -256,6 +257,26 @@ char * __cdecl strcpy( char *dst, const char *src ) } +/********************************************************************* + * strcpy_s (NTDLL.@) + */ +errno_t __cdecl strcpy_s( char *dst, size_t len, const char *src ) +{ + size_t i; + + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + for (i = 0; i < len; i++) if (!(dst[i] = src[i])) return 0; + *dst = 0; + return ERANGE; +} + + /********************************************************************* * strcspn (NTDLL.@) */ diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index eef3197c4fe..b6afdb1d72e 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -21,6 +21,7 @@ */ #include <ctype.h> +#include <errno.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> @@ -162,6 +163,26 @@ LPWSTR __cdecl wcscpy( LPWSTR dst, LPCWSTR src ) } +/********************************************************************* + * wcscpy_s (NTDLL.@) + */ +errno_t __cdecl wcscpy_s( wchar_t *dst, size_t len, const wchar_t *src ) +{ + size_t i; + + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + for (i = 0; i < len; i++) if (!(dst[i] = src[i])) return 0; + *dst = 0; + return ERANGE; +} + + /*********************************************************************** * wcslen (NTDLL.@) */
1
0
0
0
Alexandre Julliard : ntdll: Add a few more isw* functions.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: c948a6cf9201152a664ab4976da51bdfac59deaa URL:
https://source.winehq.org/git/wine.git/?a=commit;h=c948a6cf9201152a664ab497…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jun 29 11:48:20 2022 +0200 ntdll: Add a few more isw* functions. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 4 +++ dlls/ntdll/wcstring.c | 83 ++++++++++++++++++++++++++++----------------------- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index b1650ab4306..fa1941ec811 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1560,10 +1560,14 @@ @ cdecl ispunct(long) @ cdecl isspace(long) @ cdecl isupper(long) +@ cdecl iswalnum(long) @ cdecl iswalpha(long) +@ cdecl iswascii(long) @ cdecl iswctype(long long) @ cdecl iswdigit(long) +@ cdecl iswgraph(long) @ cdecl iswlower(long) +@ cdecl iswprint(long) @ cdecl iswspace(long) @ cdecl iswxdigit(long) @ cdecl isxdigit(long) diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index 9422e4f676c..eef3197c4fe 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -384,77 +384,84 @@ INT __cdecl iswctype( WCHAR wc, unsigned short type ) } +/********************************************************************* + * iswalnum (NTDLL.@) + */ +INT __cdecl iswalnum( WCHAR wc ) +{ + return iswctype( wc, C1_ALPHA | C1_UPPER | C1_LOWER | C1_DIGIT ); +} + + /********************************************************************* * iswalpha (NTDLL.@) */ INT __cdecl iswalpha( WCHAR wc ) { - if (wc >= 256) return 0; - return wctypes[wc] & (C1_ALPHA | C1_UPPER | C1_LOWER); + return iswctype( wc, C1_ALPHA | C1_UPPER | C1_LOWER ); } /********************************************************************* - * iswdigit (NTDLL.@) - * - * Checks if a unicode char wc is a digit - * - * RETURNS - * TRUE: The unicode char wc is a digit. - * FALSE: Otherwise + * iswascii (NTDLL.@) + */ +INT __cdecl iswascii( WCHAR wc ) +{ + return wc < 0x80; +} + + +/********************************************************************* + * iswdigit (NTDLL.@) */ INT __cdecl iswdigit( WCHAR wc ) { - if (wc >= 256) return 0; - return wctypes[wc] & C1_DIGIT; + return iswctype( wc, C1_DIGIT ); } /********************************************************************* - * iswlower (NTDLL.@) - * - * Checks if a unicode char wc is a lower case letter - * - * RETURNS - * TRUE: The unicode char wc is a lower case letter. - * FALSE: Otherwise + * iswgraph (NTDLL.@) + */ +INT __cdecl iswgraph( WCHAR wc ) +{ + return iswctype( wc, C1_ALPHA | C1_UPPER | C1_LOWER | C1_DIGIT | C1_PUNCT ); +} + + +/********************************************************************* + * iswlower (NTDLL.@) */ INT __cdecl iswlower( WCHAR wc ) { - if (wc >= 256) return 0; - return wctypes[wc] & C1_LOWER; + return iswctype( wc, C1_LOWER ); } /********************************************************************* - * iswspace (NTDLL.@) - * - * Checks if a unicode char wc is a white space character - * - * RETURNS - * TRUE: The unicode char wc is a white space character. - * FALSE: Otherwise + * iswprint (NTDLL.@) + */ +INT __cdecl iswprint( WCHAR wc ) +{ + return iswctype( wc, C1_ALPHA | C1_UPPER | C1_LOWER | C1_DIGIT | C1_PUNCT | C1_BLANK ); +} + + +/********************************************************************* + * iswspace (NTDLL.@) */ INT __cdecl iswspace( WCHAR wc ) { - if (wc >= 256) return 0; - return wctypes[wc] & C1_SPACE; + return iswctype( wc, C1_SPACE ); } /********************************************************************* - * iswxdigit (NTDLL.@) - * - * Checks if a unicode char wc is an extended digit - * - * RETURNS - * TRUE: The unicode char wc is an extended digit. - * FALSE: Otherwise + * iswxdigit (NTDLL.@) */ INT __cdecl iswxdigit( WCHAR wc ) { - if (wc >= 256) return 0; - return wctypes[wc] & C1_XDIGIT; + return iswctype( wc, C1_XDIGIT ); }
1
0
0
0
Rémi Bernon : mf: Uninitialize renderer before creating mixer and presenter.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 90696fe884ed42cb58feae0fd53ad1f4d0281bc7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=90696fe884ed42cb58feae0f…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon Jun 27 13:43:18 2022 +0200 mf: Uninitialize renderer before creating mixer and presenter. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/mf/evr.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 90702ff3d95..c9506af9143 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -1702,11 +1702,8 @@ static HRESULT video_renderer_configure_presenter(struct video_renderer *rendere return hr; } -static HRESULT video_renderer_initialize(struct video_renderer *renderer, IMFTransform *mixer, - IMFVideoPresenter *presenter) +static void video_renderer_uninitialize(struct video_renderer *renderer) { - HRESULT hr; - video_renderer_release_services(renderer); if (renderer->mixer) @@ -1726,6 +1723,12 @@ static HRESULT video_renderer_initialize(struct video_renderer *renderer, IMFTra IUnknown_Release(renderer->device_manager); renderer->device_manager = NULL; } +} + +static HRESULT video_renderer_initialize(struct video_renderer *renderer, IMFTransform *mixer, + IMFVideoPresenter *presenter) +{ + HRESULT hr; renderer->mixer = mixer; IMFTransform_AddRef(renderer->mixer); @@ -1747,11 +1750,22 @@ static HRESULT WINAPI video_renderer_InitializeRenderer(IMFVideoRenderer *iface, TRACE("%p, %p, %p.\n", iface, mixer, presenter); + EnterCriticalSection(&renderer->cs); + + if (renderer->flags & EVR_SHUT_DOWN) + { + LeaveCriticalSection(&renderer->cs); + return MF_E_SHUTDOWN; + } + + video_renderer_uninitialize(renderer); + if (mixer) IMFTransform_AddRef(mixer); else if (FAILED(hr = video_renderer_create_mixer(NULL, &mixer))) { WARN("Failed to create default mixer object, hr %#lx.\n", hr); + LeaveCriticalSection(&renderer->cs); return hr; } @@ -1760,21 +1774,15 @@ static HRESULT WINAPI video_renderer_InitializeRenderer(IMFVideoRenderer *iface, else if (FAILED(hr = video_renderer_create_presenter(renderer, NULL, &presenter))) { WARN("Failed to create default presenter, hr %#lx.\n", hr); + LeaveCriticalSection(&renderer->cs); IMFTransform_Release(mixer); return hr; } - EnterCriticalSection(&renderer->cs); - - if (renderer->flags & EVR_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - { - /* FIXME: check clock state */ - /* FIXME: check that streams are not initialized */ + /* FIXME: check clock state */ + /* FIXME: check that streams are not initialized */ - hr = video_renderer_initialize(renderer, mixer, presenter); - } + hr = video_renderer_initialize(renderer, mixer, presenter); LeaveCriticalSection(&renderer->cs);
1
0
0
0
Rémi Bernon : mf: Release video renderer services before re-initializing.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: 98c9aff086461a4120c11b5e3afaf1b68095fef1 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=98c9aff086461a4120c11b5e…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon Jun 27 13:37:26 2022 +0200 mf: Release video renderer services before re-initializing. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/mf/evr.c | 2 ++ dlls/mf/tests/mf.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index b035b8b601b..90702ff3d95 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -1707,6 +1707,8 @@ static HRESULT video_renderer_initialize(struct video_renderer *renderer, IMFTra { HRESULT hr; + video_renderer_release_services(renderer); + if (renderer->mixer) { IMFTransform_Release(renderer->mixer); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 006709f698c..8d725a65515 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4766,7 +4766,6 @@ static void test_evr(void) IMFMediaSink_Release(sink); ref = IMFVideoRenderer_Release(video_renderer); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); hr = MFCreateVideoRendererActivate(NULL, NULL);
1
0
0
0
Rémi Bernon : mf: Avoid leaking nodes in IMFTopoLoader_Load.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: d21fee129b4b04b85dc61824fe1a10c06da1a284 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=d21fee129b4b04b85dc61824…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri Jun 24 11:49:20 2022 +0200 mf: Avoid leaking nodes in IMFTopoLoader_Load. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/mf/tests/mf.c | 13 ++----------- dlls/mf/topology.c | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 27596e4f527..006709f698c 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2175,9 +2175,8 @@ static void test_topology_loader(void) /* Source node only. */ hr = IMFTopoLoader_Load(loader, topology, &full_topology, NULL); - todo_wine_if(hr == S_OK) + todo_wine_if(hr == E_INVALIDARG) ok(hr == MF_E_TOPO_UNSUPPORTED, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) IMFTopology_Release(full_topology); hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &sink_node); ok(hr == S_OK, "Failed to create output node, hr %#lx.\n", hr); @@ -2388,28 +2387,23 @@ todo_wine { ref = IMFTopoLoader_Release(loader); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFTopologyNode_Release(src_node); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFTopologyNode_Release(sink_node); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaSource_Release(source); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFPresentationDescriptor_Release(pd); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFStreamDescriptor_Release(sd); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(input_type); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); /* FIXME: is native really leaking refs here, or are we? */ ref = IMFMediaType_Release(output_type); + todo_wine ok(ref != 0, "Release returned %ld\n", ref); hr = MFShutdown(); @@ -2542,10 +2536,8 @@ static void test_topology_loader_evr(void) ref = IMFTopology_Release(topology); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFTopologyNode_Release(source_node); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); ref = IMFTopologyNode_Release(evr_node); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); hr = IMFActivate_ShutdownObject(activate); @@ -2556,7 +2548,6 @@ static void test_topology_loader_evr(void) ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(media_type); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); DestroyWindow(window); diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index ff90bc2c8af..8d64c10b5c7 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -2359,6 +2359,7 @@ static HRESULT topology_loader_resolve_branch(struct topoloader_context *context }; MF_TOPOLOGY_TYPE u_type, d_type; IMFTopologyNode *node; + HRESULT hr; TOPOID id; /* Downstream node might have already been cloned. */ @@ -2372,10 +2373,13 @@ static HRESULT topology_loader_resolve_branch(struct topoloader_context *context if (!connectors[u_type][d_type]) { WARN("Unsupported branch kind %d -> %d.\n", u_type, d_type); + IMFTopologyNode_Release(node); return E_FAIL; } - return connectors[u_type][d_type](context, upstream_node, output_index, node, input_index); + hr = connectors[u_type][d_type](context, upstream_node, output_index, node, input_index); + IMFTopologyNode_Release(node); + return hr; } static HRESULT topology_loader_resolve_nodes(struct topoloader_context *context, unsigned int *layer_size) @@ -2391,19 +2395,25 @@ static HRESULT topology_loader_resolve_nodes(struct topoloader_context *context, { ++size; - IMFTopology_GetNodeByID(context->input_topology, id, &orig_node); - IMFTopologyNode_GetNodeType(node, &node_type); switch (node_type) { case MF_TOPOLOGY_SOURCESTREAM_NODE: - if (FAILED(IMFTopologyNode_GetOutput(orig_node, 0, &downstream_node, &input_index))) + if (SUCCEEDED(hr = IMFTopology_GetNodeByID(context->input_topology, id, &orig_node))) + { + hr = IMFTopologyNode_GetOutput(orig_node, 0, &downstream_node, &input_index); + IMFTopologyNode_Release(orig_node); + } + + if (FAILED(hr)) { IMFTopology_RemoveNode(context->output_topology, node); + IMFTopologyNode_Release(node); continue; } hr = topology_loader_resolve_branch(context, node, 0, downstream_node, input_index); + IMFTopologyNode_Release(downstream_node); break; case MF_TOPOLOGY_TRANSFORM_NODE: case MF_TOPOLOGY_TEE_NODE: @@ -2414,6 +2424,7 @@ static HRESULT topology_loader_resolve_nodes(struct topoloader_context *context, } IMFTopologyNode_DeleteItem(node, &context->key); + IMFTopologyNode_Release(node); if (FAILED(hr)) break; @@ -2661,10 +2672,13 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in break; } - if (SUCCEEDED(hr)) + if (FAILED(hr)) + IMFTopology_Release(output_topology); + else + { topology_loader_resolve_complete(&context); - - *ret_topology = output_topology; + *ret_topology = output_topology; + } return hr; }
1
0
0
0
Rémi Bernon : mf/tests: Add some missing IMFActivate_ShutdownObject calls.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: d7c3aac296031071e6eebc0420da16ed7bcfe823 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=d7c3aac296031071e6eebc04…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon Jun 27 17:45:29 2022 +0200 mf/tests: Add some missing IMFActivate_ShutdownObject calls. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/mf/tests/mf.c | 61 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 5d8ff2dc4ac..27596e4f527 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2377,7 +2377,8 @@ todo_wine { ok(hr == S_OK, "Failed to get attribute count, hr %#lx.\n", hr); ok(!count, "Unexpected count %u.\n", count); - IMFActivate_ShutdownObject(sink_activate); + hr = IMFActivate_ShutdownObject(sink_activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ref = IMFActivate_Release(sink_activate); ok(ref == 0, "Release returned %ld\n", ref); } @@ -2547,15 +2548,16 @@ static void test_topology_loader_evr(void) todo_wine ok(ref == 0, "Release returned %ld\n", ref); + hr = IMFActivate_ShutdownObject(activate); + ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); ref = IMFActivate_Release(activate); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaSink_Release(sink); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(media_type); todo_wine - ok(ref == 2, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); DestroyWindow(window); @@ -3521,13 +3523,15 @@ static void test_sample_grabber(void) ref = IMFActivate_Release(activate); ok(ref == 0, "Release returned %ld\n", ref); + /* required for the sink to be fully released */ + hr = IMFMediaSink_Shutdown(sink); + ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ref = IMFMediaSink_Release(sink); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(media_type); - todo_wine - ok(ref > 0, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); hr = MFShutdown(); ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); @@ -3627,19 +3631,23 @@ static void test_sample_grabber_is_mediatype_supported(void) IMFMediaTypeHandler_Release(handler); + hr = IMFActivate_ShutdownObject(activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ref = IMFActivate_Release(activate); ok(ref == 0, "Release returned %ld\n", ref); + /* required for the sink to be fully released */ + hr = IMFMediaSink_Shutdown(sink); + ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ref = IMFMediaSink_Release(sink); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(media_type2); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaType_Release(media_type); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); } static BOOL is_supported_video_type(const GUID *guid) @@ -4668,6 +4676,9 @@ if (SUCCEEDED(hr)) hr = IMFActivate_DetachObject(activate); ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + hr = IMFActivate_ShutdownObject(activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ref = IMFActivate_Release(activate); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaSink_Release(sink); @@ -4690,9 +4701,12 @@ if (SUCCEEDED(hr)) hr = MFCreateAudioRenderer(attributes, &sink); ok(hr == S_OK, "Failed to create a sink, hr %#lx.\n", hr); + /* required for the sink to be fully released */ + hr = IMFMediaSink_Shutdown(sink); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ref = IMFMediaSink_Release(sink); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); /* Invalid endpoint. */ hr = IMFAttributes_SetString(attributes, &MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, L"endpoint"); @@ -4753,9 +4767,16 @@ static void test_evr(void) hr = IMFVideoRenderer_InitializeRenderer(video_renderer, NULL, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + /* required for the video renderer to be fully released */ + hr = IMFVideoRenderer_QueryInterface(video_renderer, &IID_IMFMediaSink, (void **)&sink); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaSink_Shutdown(sink); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaSink_Release(sink); + ref = IMFVideoRenderer_Release(video_renderer); todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); hr = MFCreateVideoRendererActivate(NULL, NULL); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); @@ -4801,11 +4822,13 @@ static void test_evr(void) IMFVideoDisplayControl_Release(display_control); + hr = IMFActivate_ShutdownObject(activate); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ref = IMFActivate_Release(activate); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaSink_Release(sink); - todo_wine - ok(ref == 1, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); DestroyWindow(window); hr = MFCreateVideoRendererActivate(NULL, &activate);
1
0
0
0
Rémi Bernon : mf/tests: Add more consistent reference count checks.
by Alexandre Julliard
29 Jun '22
29 Jun '22
Module: wine Branch: master Commit: e71fe80c3a29e08010aeac167d4f4f7db28aae95 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=e71fe80c3a29e08010aeac16…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri Jun 24 11:40:52 2022 +0200 mf/tests: Add more consistent reference count checks. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/mf/tests/mf.c | 517 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 353 insertions(+), 164 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=e71fe80c3a29e08010ae…
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
9
...
80
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Results per page:
10
25
50
100
200