[gs-code-review] Re: [gs-cvs] rev 7674 - trunk/gs/src
SaGS
sags5495 at hotmail.com
Sun Feb 4 00:36:15 PST 2007
Hello all,
Current TRUNK (rev 7674) doesn't compile anymore with .NET2003 or VS6. These
define neither "snprintf" nor "vsnprintf_s".
I suggest to emulate the missing "snprintf" using "_[v]snprintf" (with a leading
underscore), which exist in Microsoft CRTLs since ages; see attached patch.
This emulation is not perfect (see comment in code), but I consider that a
perfect emulation, expected to return the exact number of bytes needed for
the output string no matter how large this would be, is overkill.
Non-MS compilers may still need some different solution, with #ifdef /etc.
I don't have any of these to check and suggest something for them.
----- Original Message -----
From: "Leonardo" <leonardo at artifex.com>
To: <gs-cvs at ghostscript.com>
Sent: Saturday, 03 February 2007 15:34
Subject: [gs-cvs] rev 7674 - wrong log message
> The log message should start as this :
>
> > Fix : MSVC doesn't implement snprintf.
>
> Leo.
>
>
>
> ----- Original Message -----
> From: <leonardo at ghostscript.com>
> To: <gs-cvs at ghostscript.com>
> Sent: Saturday, February 03, 2007 4:30 PM
> Subject: [gs-cvs] rev 7674 - trunk/gs/src
>
>
> > Author: leonardo
> > Date: 2007-02-03 05:30:24 -0800 (Sat, 03 Feb 2007)
> > New Revision: 7674
> >
> > Modified:
> > trunk/gs/src/gp_mswin.c
> > trunk/gs/src/iscan.c
> > trunk/gs/src/stdio_.h
> > Log:
> > Fix : MSVC doesn't implement snscanf.
> >
> > DETAILS :
> >
> > The revision 7672 doesn't compile with Microsoft Visual C++ 2005,
> > because this compiler doesn't properly define snprintf.
> >
> > The function snsprintf is a part of the C standard ISO/IEC 9899:1999 (E),
> > so we decided to define it in the Windows platform-dependent module.
> > Possibly we'll need a further improvement for other Windows compilers.
> >
> > Minor change : fixed an MSVC cast warning in iscan.c,
> > which has been introduced in revision 7672.
> >
> > EXPECTED DIFFERENCES :
> >
> > None.
> >
> >
> > Modified: trunk/gs/src/gp_mswin.c
> > ===================================================================
> > --- trunk/gs/src/gp_mswin.c 2007-02-03 06:27:14 UTC (rev 7673)
> > +++ trunk/gs/src/gp_mswin.c 2007-02-03 13:30:24 UTC (rev 7674)
> > @@ -46,6 +46,7 @@
> > #include "gsexit.h"
> >
> > #include "windows_.h"
> > +#include <stdarg.h>
> > #include <shellapi.h>
> > #include <winspool.h>
> > #include "gp_mswin.h"
> > @@ -716,3 +717,16 @@
> > return _fseeki64(strm, offset, origin);
> > #endif
> > }
> > +
> > +/* ------------------------- _snprintf -----------------------------*/
> > +
> > +/* Microsoft Visual C++ 2005 doesn't properly define snprintf,
> > + which is defined in the C standard ISO/IEC 9899:1999 (E) */
> > +
> > +int snprintf(char *buffer, size_t count, const char *format, ...)
> > +{
> > + va_list args;
> > + va_start(args, format);
> > +
> > + return vsnprintf_s(buffer, count, count - 1, format, args);
> > +}
> > \ No newline at end of file
> >
> > Modified: trunk/gs/src/iscan.c
> > ===================================================================
> > --- trunk/gs/src/iscan.c 2007-02-03 06:27:14 UTC (rev 7673)
> > +++ trunk/gs/src/iscan.c 2007-02-03 13:30:24 UTC (rev 7674)
> > @@ -258,7 +258,7 @@
> > int len = strlen(pstate->s_error.string);
> >
> > if (pstate->s_error.is_name) {
> > - int code = name_ref(imemory, pstate->s_error.string, len, pseo, 1);
> > + int code = name_ref(imemory, (const byte *)pstate->s_error.string,
> > len, pseo, 1);
> >
> > if (code < 0)
> > return code;
> >
> > Modified: trunk/gs/src/stdio_.h
> > ===================================================================
> > --- trunk/gs/src/stdio_.h 2007-02-03 06:27:14 UTC (rev 7673)
> > +++ trunk/gs/src/stdio_.h 2007-02-03 13:30:24 UTC (rev 7674)
> > @@ -68,6 +68,8 @@
> > #if defined(_MSC_VER)
> > # define fdopen(handle,mode) _fdopen(handle,mode)
> > # define fileno(file) _fileno(file)
> > +/* Microsoft Visual C++ 2005 doesn't properly define snprintf */
> > +int snprintf(char *buffer, size_t count, const char *format , ...);
> > #endif
> >
> > #endif /* stdio__INCLUDED */
> >
> > _______________________________________________
> > gs-cvs mailing list
> > gs-cvs at ghostscript.com
> > http://www.ghostscript.com/mailman/listinfo/gs-cvs
>
> _______________________________________________
> gs-cvs mailing list
> gs-cvs at ghostscript.com
> http://www.ghostscript.com/mailman/listinfo/gs-cvs
>
-------------- next part --------------
Index: src/gp_mswin.c
===================================================================
--- src/gp_mswin.c (revision 7674)
+++ src/gp_mswin.c (working copy)
@@ -718,15 +718,25 @@
#endif
}
-/* ------------------------- _snprintf -----------------------------*/
+/* --------------------------- snprintf ---------------------------- */
-/* Microsoft Visual C++ 2005 doesn't properly define snprintf,
+/* Microsoft Visual C++ editions don't properly define snprintf,
- which is defined in the C standard ISO/IEC 9899:1999 (E) */
+ which is defined in the C standard ISO/IEC 9899:1999 (E).
+ The following emulation differs from the standard function in
+ the value returned when the number of chars needed by the output,
+ excluding the terminating '\0', is > (and !=) count */
int snprintf(char *buffer, size_t count, const char *format, ...)
{
+ int n;
va_list args;
- va_start(args, format);
- return vsnprintf_s(buffer, count, count - 1, format, args);
-}
\ No newline at end of file
+ if (count > 0) {
+ va_start(args, format);
+ n = _vsnprintf(buffer, count, format, args);
+ buffer[count - 1] = 0;
+ va_end(args);
+ } else
+ n = 0;
+ return n;
+}
More information about the gs-code-review
mailing list