From: JonY <10...@gm...> - 2008-09-05 10:38:06
|
Hi, Some prototype definitions like strcasecmp and _stricmp are missing when using gcc under C99 mode. Does the msvcrt implementation conform to C99? Maybe I'm looking at this problem the wrong way. Any ideas? |
From: Erik de C. L. <ml...@me...> - 2008-09-05 10:44:15
|
JonY wrote: > Some prototype definitions like strcasecmp and _stricmp are missing when > using gcc under C99 mode. Is strcasecmp C99? I didn't think it was. > Does the msvcrt implementation conform to C99? No. For instance the msvcrt implementation of snprintf fails compliance in a couple of important ways. Erik -- ----------------------------------------------------------------- Erik de Castro Lopo ----------------------------------------------------------------- "All this talk about Apple is making me queasy. I'm going to go and lick a Debian CD." -- jdub on the SLUG mailing list |
From: JonY <10...@gm...> - 2008-09-05 10:52:43
|
Erik de Castro Lopo wrote: > JonY wrote: > >> Some prototype definitions like strcasecmp and _stricmp are missing when >> using gcc under C99 mode. > > Is strcasecmp C99? I didn't think it was. > So glibc is at fault? Under Linux: # gcc -std=c99 -E /usr/include/strings.h |grep strcasecmp extern int strcasecmp (__const char *__s1, __const char *__s2) >> Does the msvcrt implementation conform to C99? > > No. For instance the msvcrt implementation of snprintf fails compliance > in a couple of important ways. > > Erik Thanks, some links to read up on would be nice. |
From: Erik de C. L. <ml...@me...> - 2008-09-05 11:29:00
|
JonY wrote: > > So glibc is at fault? > Under Linux: > # gcc -std=c99 -E /usr/include/strings.h |grep strcasecmp > extern int strcasecmp (__const char *__s1, __const char *__s2) Isn't the C99 header file <string.h> while <strings.h> is (I think) a BSD header? This: # gcc -std=c99 -E /usr/include/string.h |grep strcasecmp returns nothing. If you look in /usr/include/string.h, strcasecmp is enclosed in "#ifdef __USE_BSD" > >> Does the msvcrt implementation conform to C99? > > > > No. For instance the msvcrt implementation of snprintf fails compliance > > in a couple of important ways. > > > > Erik > > Thanks, some links to read up on would be nice. Compare the description of the return value described here: http://msdn.microsoft.com/en-us/library/2ts7cx93(VS.71).aspx with the Linux man page: The functions snprintf() and vsnprintf() do not write more than size bytes (including the trailing '\0'). If the output was truncated due to this limit then the return value is the number of characters (not including the trailing '\0') which would have been written to the final string if enough space had been available. In particular, the result when the buffer was not large enough. More generally, from http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.71).aspx "This version of Visual C++ is not conformant with the C99 standard." All versions of msvcrt released so far have the same disclaimer. Erik -- ----------------------------------------------------------------- Erik de Castro Lopo ----------------------------------------------------------------- "All this talk about Apple is making me queasy. I'm going to go and lick a Debian CD." -- jdub on the SLUG mailing list |
From: JonY <10...@gm...> - 2008-09-05 12:16:51
|
Erik de Castro Lopo wrote: > JonY wrote: > >> So glibc is at fault? >> Under Linux: >> # gcc -std=c99 -E /usr/include/strings.h |grep strcasecmp >> extern int strcasecmp (__const char *__s1, __const char *__s2) > > Isn't the C99 header file<string.h> while<strings.h> is (I think) > a BSD header? > > This: > > # gcc -std=c99 -E /usr/include/string.h |grep strcasecmp > > returns nothing. If you look in /usr/include/string.h, strcasecmp is > enclosed in "#ifdef __USE_BSD" > >>>> Does the msvcrt implementation conform to C99? >>> No. For instance the msvcrt implementation of snprintf fails compliance >>> in a couple of important ways. >>> >>> Erik >> Thanks, some links to read up on would be nice. > > Compare the description of the return value described here: > > http://msdn.microsoft.com/en-us/library/2ts7cx93(VS.71).aspx > > with the Linux man page: > > The functions snprintf() and vsnprintf() do not write more than size > bytes (including the trailing '\0'). If the output was truncated > due to this limit then the return value is the number of characters > (not including the trailing '\0') which would have been written > to the final string if enough space had been available. > > In particular, the result when the buffer was not large enough. > > More generally, from > > http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.71).aspx > > "This version of Visual C++ is not conformant with the C99 standard." > > All versions of msvcrt released so far have the same disclaimer. > > Erik Thanks for info, particularly the subtle difference. I need to rethink my porting strategies. |
From: Greg C. <gch...@sb...> - 2008-09-05 11:37:45
|
On 2008-09-05 10:46Z, JonY wrote: > Erik de Castro Lopo wrote: >> JonY wrote: >> >>> Some prototype definitions like strcasecmp and _stricmp are missing when >>> using gcc under C99 mode. >> >> Is strcasecmp C99? I didn't think it was. C99 mentions neither of those functions. > So glibc is at fault? > Under Linux: > # gcc -std=c99 -E /usr/include/strings.h |grep strcasecmp > extern int strcasecmp (__const char *__s1, __const char *__s2) "strings.h" is a POSIX header: http://www.opengroup.org/onlinepubs/009695399/basedefs/strings.h.html C99 isn't POSIX; it mentions no such header. >>> Does the msvcrt implementation conform to C99? >> >> No. For instance the msvcrt implementation of snprintf fails compliance >> in a couple of important ways. > > Thanks, some links to read up on would be nice. Many snprintf() problem reports can be found here: http://search.gmane.org/?query=snprintf+mingw The next release of the MinGW runtime package includes a reimplementation of snprintf() that lacks these problems. |
From: JonY <10...@gm...> - 2008-09-05 12:04:59
|
Greg Chicares wrote: > On 2008-09-05 10:46Z, JonY wrote: >> Erik de Castro Lopo wrote: >>> JonY wrote: >>> >>>> Some prototype definitions like strcasecmp and _stricmp are missing when >>>> using gcc under C99 mode. >>> Is strcasecmp C99? I didn't think it was. > > C99 mentions neither of those functions. > >> So glibc is at fault? >> Under Linux: >> # gcc -std=c99 -E /usr/include/strings.h |grep strcasecmp >> extern int strcasecmp (__const char *__s1, __const char *__s2) > > "strings.h" is a POSIX header: > http://www.opengroup.org/onlinepubs/009695399/basedefs/strings.h.html > C99 isn't POSIX; it mentions no such header. > I was confused when I saw strings.h from MinGW including string.h only. >>>> Does the msvcrt implementation conform to C99? >>> No. For instance the msvcrt implementation of snprintf fails compliance >>> in a couple of important ways. >> Thanks, some links to read up on would be nice. > > Many snprintf() problem reports can be found here: > http://search.gmane.org/?query=snprintf+mingw > Wow, how did I miss something that obvious? Many thanks. > The next release of the MinGW runtime package includes a > reimplementation of snprintf() that lacks these problems. > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK& win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > MinGW-users mailing list > Min...@li... > > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > |