Mercurial > cpython-lru_cache-weakref
view Python/mysnprintf.c @ 42110:e4f649c4f457
Merged revisions 55962-56019 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r55985 | neal.norwitz | 2007-06-14 20:14:38 -0700 (Thu, 14 Jun 2007) | 2 lines
All these tests have been flaky wrt reporting leaks. Disable them.
................
r56003 | neal.norwitz | 2007-06-15 19:41:09 -0700 (Fri, 15 Jun 2007) | 1 line
Fix typo (certain).
................
r56004 | neal.norwitz | 2007-06-15 20:54:18 -0700 (Fri, 15 Jun 2007) | 4 lines
Fix it so test_os no longer reports ref leaks by clearing all the caches
the ABCMeta stores on the class. Apply this to all the ABC collections
as well as the class of os.environ which inherits from an ABC collection.
................
r56013 | neal.norwitz | 2007-06-17 19:56:31 -0700 (Sun, 17 Jun 2007) | 4 lines
This should make it a little easier when adding new collections which use ABCs.
The new subclass won't need to be listed in regrtest.
It will be even better when Guido adds weakrefs. :-)
................
r56014 | martin.v.loewis | 2007-06-17 20:15:51 -0700 (Sun, 17 Jun 2007) | 1 line
Drop inline, as it's not support by VS 2003.
................
r56015 | martin.v.loewis | 2007-06-17 20:17:19 -0700 (Sun, 17 Jun 2007) | 1 line
Expect long objects for DWORD values.
................
r56016 | martin.v.loewis | 2007-06-17 20:18:01 -0700 (Sun, 17 Jun 2007) | 1 line
Drop modules that have been deleted.
................
r56017 | martin.v.loewis | 2007-06-17 20:18:55 -0700 (Sun, 17 Jun 2007) | 1 line
Bump DLL version number to 30.
................
r56018 | neal.norwitz | 2007-06-17 20:55:43 -0700 (Sun, 17 Jun 2007) | 62 lines
Merged revisions 55951-56013 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r55956 | thomas.heller | 2007-06-13 00:07:03 -0700 (Wed, 13 Jun 2007) | 2 lines
Do not hardcode the buildbot's directory name.
........
r55957 | thomas.heller | 2007-06-13 00:07:41 -0700 (Wed, 13 Jun 2007) | 2 lines
Notes about building tcl/tk for windows/AMD64.
........
r55958 | thomas.heller | 2007-06-13 00:54:57 -0700 (Wed, 13 Jun 2007) | 2 lines
Build bzip2.
........
r55962 | walter.doerwald | 2007-06-13 09:57:12 -0700 (Wed, 13 Jun 2007) | 8 lines
Add T_PYSSIZET in structmember.h: This can be used for
Py_ssize_t members.
Simplify the implementation of UnicodeError objects:
start and end attributes are now stored directly as
Py_ssize_t members, which simplifies various get and
set functions.
........
r55975 | martin.v.loewis | 2007-06-14 13:46:25 -0700 (Thu, 14 Jun 2007) | 3 lines
Patch #1734014: Use _I64_MAX instead of LLONG_MAX.
Will backport to 2.5.
........
r55984 | neal.norwitz | 2007-06-14 20:11:41 -0700 (Thu, 14 Jun 2007) | 4 lines
urllib2_localnet says it leaks probably due to threads. So ignore it.
popen2 is also complaining probably for similar reasons.
make install always reports failure, so don't mail in this case.
........
r56001 | andrew.kuchling | 2007-06-15 15:43:03 -0700 (Fri, 15 Jun 2007) | 1 line
Add a word
........
r56005 | martin.v.loewis | 2007-06-16 03:08:43 -0700 (Sat, 16 Jun 2007) | 2 lines
Mention Senthil Kumaran.
........
r56006 | georg.brandl | 2007-06-16 10:10:12 -0700 (Sat, 16 Jun 2007) | 2 lines
Add missing \versionadded.
........
r56009 | neal.norwitz | 2007-06-17 11:48:32 -0700 (Sun, 17 Jun 2007) | 1 line
SF #1738670, make example in doc work
........
r56011 | neal.norwitz | 2007-06-17 19:46:36 -0700 (Sun, 17 Jun 2007) | 1 line
SF #1738754, remove extra backslash in string
........
r56012 | neal.norwitz | 2007-06-17 19:50:15 -0700 (Sun, 17 Jun 2007) | 1 line
Revert last change for SF #1738754, there's no print in there.
........
................
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 18 Jun 2007 17:58:50 +0000 |
| parents | 8af86a952b2c |
| children | 2925b568aacc a8cc8e6f0c1a |
line wrap: on
line source
#include "Python.h" #include <ctype.h> /* snprintf() wrappers. If the platform has vsnprintf, we use it, else we emulate it in a half-hearted way. Even if the platform has it, we wrap it because platforms differ in what vsnprintf does in case the buffer is too small: C99 behavior is to return the number of characters that would have been written had the buffer not been too small, and to set the last byte of the buffer to \0. At least MS _vsnprintf returns a negative value instead, and fills the entire buffer with non-\0 data. The wrappers ensure that str[size-1] is always \0 upon return. PyOS_snprintf and PyOS_vsnprintf never write more than size bytes (including the trailing '\0') into str. If the platform doesn't have vsnprintf, and the buffer size needed to avoid truncation exceeds size by more than 512, Python aborts with a Py_FatalError. Return value (rv): When 0 <= rv < size, the output conversion was unexceptional, and rv characters were written to str (excluding a trailing \0 byte at str[rv]). When rv >= size, output conversion was truncated, and a buffer of size rv+1 would have been needed to avoid truncation. str[size-1] is \0 in this case. When rv < 0, "something bad happened". str[size-1] is \0 in this case too, but the rest of str is unreliable. It could be that an error in format codes was detected by libc, or on platforms with a non-C99 vsnprintf simply that the buffer wasn't big enough to avoid truncation, or on platforms without any vsnprintf that PyMem_Malloc couldn't obtain space for a temp buffer. CAUTION: Unlike C99, str != NULL and size > 0 are required. */ int PyOS_snprintf(char *str, size_t size, const char *format, ...) { int rc; va_list va; va_start(va, format); rc = PyOS_vsnprintf(str, size, format, va); va_end(va); return rc; } int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { int len; /* # bytes written, excluding \0 */ #ifndef HAVE_SNPRINTF char *buffer; #endif assert(str != NULL); assert(size > 0); assert(format != NULL); #ifdef HAVE_SNPRINTF len = vsnprintf(str, size, format, va); #else /* Emulate it. */ buffer = PyMem_MALLOC(size + 512); if (buffer == NULL) { len = -666; goto Done; } len = vsprintf(buffer, format, va); if (len < 0) /* ignore the error */; else if ((size_t)len >= size + 512) Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); else { const size_t to_copy = (size_t)len < size ? (size_t)len : size - 1; assert(to_copy < size); memcpy(str, buffer, to_copy); str[to_copy] = '\0'; } PyMem_FREE(buffer); Done: #endif str[size-1] = '\0'; return len; }
