diff options
author | Guido van Rossum <guido@python.org> | 1998-05-12 14:59:24 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-05-12 14:59:24 (GMT) |
commit | a890e688076d323baa8aef5b5da4bc6a60ad3adc (patch) | |
tree | 68357abeb1a43c8ea50bb6650a187ce13a4e1e7a /Python/sysmodule.c | |
parent | bf6a9b165a07f0ab4604458b3977bd9b05f3ad94 (diff) | |
download | cpython-a890e688076d323baa8aef5b5da4bc6a60ad3adc.zip cpython-a890e688076d323baa8aef5b5da4bc6a60ad3adc.tar.gz cpython-a890e688076d323baa8aef5b5da4bc6a60ad3adc.tar.bz2 |
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.
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r-- | Python/sysmodule.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b3bb919..ae16baf 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -486,3 +486,93 @@ PySys_SetArgv(argc, argv) } 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); +} |