Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a890e68

Browse files
committed
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.
1 parent bf6a9b1 commit a890e68

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

Python/sysmodule.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,3 +486,93 @@ PySys_SetArgv(argc, argv)
486486
}
487487
Py_DECREF(av);
488488
}
489+
490+
491+
/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
492+
Adapted from code submitted by Just van Rossum.
493+
494+
PySys_WriteStdout(format, ...)
495+
PySys_WriteStderr(format, ...)
496+
497+
The first function writes to sys.stdout; the second to sys.stderr. When
498+
there is a problem, they write to the real (C level) stdout or stderr;
499+
no exceptions are raised (but a pending exception may be cleared when a
500+
new exception is caught).
501+
502+
Both take a printf-style format string as their first argument followed
503+
by a variable length argument list determined by the format string.
504+
505+
*** WARNING ***
506+
507+
The format should limit the total size of the formatted output string to
508+
1000 bytes. In particular, this means that no unrestricted "%s" formats
509+
should occur; these should be limited using "%.<N>s where <N> is a
510+
decimal number calculated so that <N> plus the maximum size of other
511+
formatted text does not exceed 1000 bytes. Also watch out for "%f",
512+
which can print hundreds of digits for very large numbers.
513+
514+
*/
515+
516+
static void
517+
mywrite(name, fp, format, va)
518+
char *name;
519+
FILE *fp;
520+
const char *format;
521+
va_list va;
522+
{
523+
PyObject *file;
524+
525+
file = PySys_GetObject(name);
526+
if (file == NULL || PyFile_AsFile(file) == fp)
527+
vfprintf(fp, format, va);
528+
else {
529+
char buffer[1001];
530+
vsprintf(buffer, format, va);
531+
if (PyFile_WriteString(buffer, file) != 0) {
532+
PyErr_Clear();
533+
fputs(buffer, fp);
534+
}
535+
}
536+
}
537+
538+
void
539+
#ifdef HAVE_STDARG_PROTOTYPES
540+
PySys_WriteStdout(const char *format, ...)
541+
#else
542+
PySys_WriteStdout(va_alist)
543+
va_dcl
544+
#endif
545+
{
546+
va_list va;
547+
548+
#ifdef HAVE_STDARG_PROTOTYPES
549+
va_start(va, format);
550+
#else
551+
char *format;
552+
va_start(va);
553+
format = va_arg(va, char *);
554+
#endif
555+
mywrite("stdout", stdout, format, va);
556+
va_end(va);
557+
}
558+
559+
void
560+
#ifdef HAVE_STDARG_PROTOTYPES
561+
PySys_WriteStderr(const char *format, ...)
562+
#else
563+
PySys_WriteStderr(va_alist)
564+
va_dcl
565+
#endif
566+
{
567+
va_list va;
568+
569+
#ifdef HAVE_STDARG_PROTOTYPES
570+
va_start(va, format);
571+
#else
572+
char *format;
573+
va_start(va);
574+
format = va_arg(va, char *);
575+
#endif
576+
mywrite("stderr", stderr, format, va);
577+
va_end(va);
578+
}

0 commit comments

Comments
 (0)