Mercurial > cpython-lru_cache-weakref
diff Python/sysmodule.c @ 8314:f94d5ae642a9 legacy-trunk
New APIs to write to sys.stdout or sys.stderr using a printf-like interface.
Adapted from code submitted by Just van Rossum.
PySys_WriteStdout(format, ...)
PySys_WriteStderr(format, ...)
The first function writes to sys.stdout; the second to sys.stderr. When
there is a problem, they write to the real (C level) stdout or stderr;
no exceptions are raised (but a pending exception may be cleared when a
new exception is caught).
Both take a printf-style format string as their first argument followed
by a variable length argument list determined by the format string.
*** WARNING ***
The format should limit the total size of the formatted output string to
1000 bytes. In particular, this means that no unrestricted "%s" formats
should occur; these should be limited using "%.<N>s where <N> is a
decimal number calculated so that <N> plus the maximum size of other
formatted text does not exceed 1000 bytes. Also watch out for "%f",
which can print hundreds of digits for very large numbers.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Tue, 12 May 1998 14:59:24 +0000 |
| parents | c7454ca7d3ac |
| children | 6e8b0e754a7f |
line wrap: on
line diff
--- a/Python/sysmodule.c Tue May 12 14:58:52 1998 +0000 +++ b/Python/sysmodule.c Tue May 12 14:59:24 1998 +0000 @@ -486,3 +486,93 @@ } Py_DECREF(av); } + + +/* APIs to write to sys.stdout or sys.stderr using a printf-like interface. + Adapted from code submitted by Just van Rossum. + + PySys_WriteStdout(format, ...) + PySys_WriteStderr(format, ...) + + The first function writes to sys.stdout; the second to sys.stderr. When + there is a problem, they write to the real (C level) stdout or stderr; + no exceptions are raised (but a pending exception may be cleared when a + new exception is caught). + + Both take a printf-style format string as their first argument followed + by a variable length argument list determined by the format string. + + *** WARNING *** + + The format should limit the total size of the formatted output string to + 1000 bytes. In particular, this means that no unrestricted "%s" formats + should occur; these should be limited using "%.<N>s where <N> is a + decimal number calculated so that <N> plus the maximum size of other + formatted text does not exceed 1000 bytes. Also watch out for "%f", + which can print hundreds of digits for very large numbers. + + */ + +static void +mywrite(name, fp, format, va) + char *name; + FILE *fp; + const char *format; + va_list va; +{ + PyObject *file; + + file = PySys_GetObject(name); + if (file == NULL || PyFile_AsFile(file) == fp) + vfprintf(fp, format, va); + else { + char buffer[1001]; + vsprintf(buffer, format, va); + if (PyFile_WriteString(buffer, file) != 0) { + PyErr_Clear(); + fputs(buffer, fp); + } + } +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +PySys_WriteStdout(const char *format, ...) +#else +PySys_WriteStdout(va_alist) + va_dcl +#endif +{ + va_list va; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(va, format); +#else + char *format; + va_start(va); + format = va_arg(va, char *); +#endif + mywrite("stdout", stdout, format, va); + va_end(va); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +PySys_WriteStderr(const char *format, ...) +#else +PySys_WriteStderr(va_alist) + va_dcl +#endif +{ + va_list va; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(va, format); +#else + char *format; + va_start(va); + format = va_arg(va, char *); +#endif + mywrite("stderr", stderr, format, va); + va_end(va); +}
