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);
+}