You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by Farid Zaripov <Fa...@epam.com> on 2007/11/20 15:25:01 UTC

[PATCH] MSVC has non-standard prototype of the wcstok()

  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".

  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.

Re: [PATCH] MSVC has non-standard prototype of the wcstok()

Posted by Martin Sebor <se...@roguewave.com>.
William A. Rowe, Jr. wrote:
> Martin Sebor wrote:
>>
>> I see. Well, there's nothing we can do about that. I guess we'll have
>> to live with the compiler-specific #ifdefs in our code. I tell you, if
>> it weren't for Microsoft porting would be so boring... ;-)
> 
> C'mon - you can't say that aix CC and hpux aCC don't provide endless
> hours of amusement, too :)

Heh. Actually, HP aCC hasn't been nearly as much fun since HP switched
to the EDG C++ front end. But AIX/XLC++ does have a reputation for
keeping people entertained, no doubt! :-)

Martin

Re: [PATCH] MSVC has non-standard prototype of the wcstok()

Posted by "William A. Rowe, Jr." <wr...@rowe-clan.net>.
Martin Sebor wrote:
> 
> I see. Well, there's nothing we can do about that. I guess we'll have
> to live with the compiler-specific #ifdefs in our code. I tell you, if
> it weren't for Microsoft porting would be so boring... ;-)

C'mon - you can't say that aix CC and hpux aCC don't provide endless
hours of amusement, too :)


Re: [PATCH] MSVC has non-standard prototype of the wcstok()

Posted by Martin Sebor <se...@roguewave.com>.
Farid Zaripov wrote:
>> -----Original Message-----
>> From: Martin Sebor [mailto:sebor@roguewave.com] 
>> Sent: Wednesday, December 12, 2007 8:53 AM
>> To: stdcxx-dev@incubator.apache.org
>> Subject: Re: [PATCH] MSVC has non-standard prototype of the wcstok()
> 
>>>   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?
> 
>   This mechanism checks the signatures in header files, but incorrect
> wcstok() will be found in libc.

I see. Well, there's nothing we can do about that. I guess we'll have
to live with the compiler-specific #ifdefs in our code. I tell you, if
it weren't for Microsoft porting would be so boring... ;-)

Martin

> 
> config.h:
> -----------
> #define _RWSTD_NO_WCSTOK
> // #define _RWSTD_NO_WCSTOK_IN_LIBC
> -----------
> 
> Farid.
> 


RE: [PATCH] MSVC has non-standard prototype of the wcstok()

Posted by Farid Zaripov <Fa...@epam.com>.
> -----Original Message-----
> From: Martin Sebor [mailto:sebor@roguewave.com] 
> Sent: Wednesday, December 12, 2007 8:53 AM
> To: stdcxx-dev@incubator.apache.org
> Subject: Re: [PATCH] MSVC has non-standard prototype of the wcstok()

> >   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?

  This mechanism checks the signatures in header files, but incorrect
wcstok() will be found in libc.

config.h:
-----------
#define _RWSTD_NO_WCSTOK
// #define _RWSTD_NO_WCSTOK_IN_LIBC
-----------

Farid.

Re: [PATCH] MSVC has non-standard prototype of the wcstok()

Posted by Martin Sebor <se...@roguewave.com>.

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.