Farid Zaripov-2 wrote:
> 
>   The all MSVC has the non-standard prototype of the wcstok():
> 
> wchar_t* wcstok(wchar_t*, const wchar_t*);
> 
> 
>   The prototype from C standard:
> wchar_t* wcstok(wchar_t*, const wchar_t*, wchar_t**);
> 
> 
>   Since the configure script performs checking only names and doesn't
> checking the correct prototype, the _RWSTD_NO_WCSTOK macro is
> not defined in config.h. As a result the 21.cwchar.cpp test asserts on
> "wcstok() not declared".
> 
> 

But there is a mechanism to check for signatures too, isn't there?
Could we use it to detect this or are you saying even this is not
enough?

Martin



> 
>   However the MSVC 8 and later has the wcstok_s() function with the
> prototype similar to the standard wcstok():
> 
> wchar_t* wcstok_s(wchar_t* _Str, const wchar_t* _Delim, wchar_t **
> _Context);
> 
> 
>   I've propose the following changes:
> 
>   ChangeLog:
>   * rw/_config_msvcrt.h: #define _RWSTD_NO_WCSTOK and
> _RWSTD_NO_WCSTOK_IN_LIBC
>   macros since the MSVC has the non-standard prototype of the wcstok().
>   * ansi/cwchar [_MSC_VER >= 1400]: Define inline wcstok() function
> using wcstok_s().
>   #undefine _RWSTD_NO_WCSTOK and _RWSTD_NO_WCSTOK_IN_LIBC macros.
> 
> 
> Index: include/ansi/cwchar
> ===================================================================
> --- include/ansi/cwchar       (revision 596338)
> +++ include/ansi/cwchar       (working copy)
> @@ -1074,6 +1074,22 @@
>  using ::wcstok;
>  
>  #  undef _RWSTD_NO_WCSTOK
> +#elif defined (_MSC_VER) && 1400 <= _MSC_VER
> +
> +}   // namespace std
> +
> +/* extern "C++" */ inline wchar_t*
> +wcstok (wchar_t* __s1, const wchar_t* __s2, wchar_t** __ptr)
> +{
> +    return wcstok_s (__s1, __s2, __ptr);
> +}
> +
> +namespace std {
> +
> +using ::wcstok;
> +
> +#  undef _RWSTD_NO_WCSTOK
> +#  undef _RWSTD_NO_WCSTOK_IN_LIBC
>  #endif   // _RWSTD_NO_WCSTOK[_IN_LIBC]
>  
>  #ifndef _RWSTD_NO_WCSTOL
> Index: include/rw/_config-msvcrt.h
> ===================================================================
> --- include/rw/_config-msvcrt.h       (revision 596338)
> +++ include/rw/_config-msvcrt.h       (working copy)
> @@ -54,6 +54,15 @@
>  #  define _RWSTD_NO_DEPRECATED_C_HEADERS
>  #endif   // _RWSTD_NO_DEPRECATED_C_HEADERS
>  
> +#ifndef _RWSTD_NO_WCSTOK
> +// MSVC CRT has incorrect prototype of the wcstok()
> +#  define _RWSTD_NO_WCSTOK
> +#endif   // _RWSTD_NO_WCSTOK
> +
> +#ifndef _RWSTD_NO_WCSTOK_IN_LIBC
> +#  define _RWSTD_NO_WCSTOK_IN_LIBC
> +#endif   // _RWSTD_NO_WCSTOK_IN_LIBC
> +
>     // operator new and delete is not reliably replaceable across
>     // shared library boundaries, which includes the shared library
>     // version of the language support library
> 
> Farid.
> 
> 

-- 
View this message in context: 
http://www.nabble.com/-PATCH--MSVC-has-non-standard-prototype-of-the-wcstok%28%29-tp13857994p14289929.html
Sent from the stdcxx-dev mailing list archive at Nabble.com.

Reply via email to