sysmodule.c revision d32ed6f5117a68037e9cb7bcfd8d0f8d1611f442
1
2/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
7Function member:
8- exit(sts): raise SystemExit
9Data members:
10- stdin, stdout, stderr: standard file objects
11- modules: the table of modules (dictionary)
12- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
15*/
16
17#include "Python.h"
18#include "structseq.h"
19#include "code.h"
20#include "frameobject.h"
21#include "eval.h"
22
23#include "osdefs.h"
24
25#ifdef MS_WINDOWS
26#define WIN32_LEAN_AND_MEAN
27#include <windows.h>
28#endif /* MS_WINDOWS */
29
30#ifdef MS_COREDLL
31extern void *PyWin_DLLhModule;
32/* A string loaded from the DLL at startup: */
33extern const char *PyWin_DLLVersionString;
34#endif
35
36#ifdef __VMS
37#include <unixlib.h>
38#endif
39
40#ifdef HAVE_LANGINFO_H
41#include <locale.h>
42#include <langinfo.h>
43#endif
44
45PyObject *
46PySys_GetObject(const char *name)
47{
48	PyThreadState *tstate = PyThreadState_GET();
49	PyObject *sd = tstate->interp->sysdict;
50	if (sd == NULL)
51		return NULL;
52	return PyDict_GetItemString(sd, name);
53}
54
55int
56PySys_SetObject(const char *name, PyObject *v)
57{
58	PyThreadState *tstate = PyThreadState_GET();
59	PyObject *sd = tstate->interp->sysdict;
60	if (v == NULL) {
61		if (PyDict_GetItemString(sd, name) == NULL)
62			return 0;
63		else
64			return PyDict_DelItemString(sd, name);
65	}
66	else
67		return PyDict_SetItemString(sd, name, v);
68}
69
70static PyObject *
71sys_displayhook(PyObject *self, PyObject *o)
72{
73	PyObject *outf;
74	PyInterpreterState *interp = PyThreadState_GET()->interp;
75	PyObject *modules = interp->modules;
76	PyObject *builtins = PyDict_GetItemString(modules, "builtins");
77
78	if (builtins == NULL) {
79		PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
80		return NULL;
81	}
82
83	/* Print value except if None */
84	/* After printing, also assign to '_' */
85	/* Before, set '_' to None to avoid recursion */
86	if (o == Py_None) {
87		Py_INCREF(Py_None);
88		return Py_None;
89	}
90	if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
91		return NULL;
92	outf = PySys_GetObject("stdout");
93	if (outf == NULL || outf == Py_None) {
94		PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
95		return NULL;
96	}
97	if (PyFile_WriteObject(o, outf, 0) != 0)
98		return NULL;
99	if (PyFile_WriteString("\n", outf) != 0)
100		return NULL;
101	if (PyObject_SetAttrString(builtins, "_", o) != 0)
102		return NULL;
103	Py_INCREF(Py_None);
104	return Py_None;
105}
106
107PyDoc_STRVAR(displayhook_doc,
108"displayhook(object) -> None\n"
109"\n"
110"Print an object to sys.stdout and also save it in builtins.\n"
111);
112
113static PyObject *
114sys_excepthook(PyObject* self, PyObject* args)
115{
116	PyObject *exc, *value, *tb;
117	if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
118		return NULL;
119	PyErr_Display(exc, value, tb);
120	Py_INCREF(Py_None);
121	return Py_None;
122}
123
124PyDoc_STRVAR(excepthook_doc,
125"excepthook(exctype, value, traceback) -> None\n"
126"\n"
127"Handle an exception by displaying it with a traceback on sys.stderr.\n"
128);
129
130static PyObject *
131sys_exc_info(PyObject *self, PyObject *noargs)
132{
133	PyThreadState *tstate;
134	tstate = PyThreadState_GET();
135	return Py_BuildValue(
136		"(OOO)",
137		tstate->exc_type != NULL ? tstate->exc_type : Py_None,
138		tstate->exc_value != NULL ? tstate->exc_value : Py_None,
139		tstate->exc_traceback != NULL ?
140			tstate->exc_traceback : Py_None);
141}
142
143PyDoc_STRVAR(exc_info_doc,
144"exc_info() -> (type, value, traceback)\n\
145\n\
146Return information about the most recent exception caught by an except\n\
147clause in the current stack frame or in an older stack frame."
148);
149
150static PyObject *
151sys_exit(PyObject *self, PyObject *args)
152{
153	PyObject *exit_code = 0;
154	if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
155		return NULL;
156	/* Raise SystemExit so callers may catch it or clean up. */
157	PyErr_SetObject(PyExc_SystemExit, exit_code);
158	return NULL;
159}
160
161PyDoc_STRVAR(exit_doc,
162"exit([status])\n\
163\n\
164Exit the interpreter by raising SystemExit(status).\n\
165If the status is omitted or None, it defaults to zero (i.e., success).\n\
166If the status is numeric, it will be used as the system exit status.\n\
167If it is another kind of object, it will be printed and the system\n\
168exit status will be one (i.e., failure)."
169);
170
171
172static PyObject *
173sys_getdefaultencoding(PyObject *self)
174{
175	return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
176}
177
178PyDoc_STRVAR(getdefaultencoding_doc,
179"getdefaultencoding() -> string\n\
180\n\
181Return the current default string encoding used by the Unicode \n\
182implementation."
183);
184
185static PyObject *
186sys_setdefaultencoding(PyObject *self, PyObject *args)
187{
188	char *encoding;
189	if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
190		return NULL;
191	if (PyUnicode_SetDefaultEncoding(encoding))
192	    	return NULL;
193	Py_INCREF(Py_None);
194	return Py_None;
195}
196
197PyDoc_STRVAR(setdefaultencoding_doc,
198"setdefaultencoding(encoding)\n\
199\n\
200Set the current default string encoding used by the Unicode implementation."
201);
202
203static PyObject *
204sys_getfilesystemencoding(PyObject *self)
205{
206	if (Py_FileSystemDefaultEncoding)
207		return PyUnicode_FromString(Py_FileSystemDefaultEncoding);
208	Py_INCREF(Py_None);
209	return Py_None;
210}
211
212PyDoc_STRVAR(getfilesystemencoding_doc,
213"getfilesystemencoding() -> string\n\
214\n\
215Return the encoding used to convert Unicode filenames in\n\
216operating system filenames."
217);
218
219
220
221static PyObject *
222sys_intern(PyObject *self, PyObject *args)
223{
224	PyObject *s;
225	if (!PyArg_ParseTuple(args, "U:intern", &s))
226		return NULL;
227	if (PyUnicode_CheckExact(s)) {
228		Py_INCREF(s);
229		PyUnicode_InternInPlace(&s);
230		return s;
231	}
232	else {
233		PyErr_Format(PyExc_TypeError,
234				"can't intern %.400s", s->ob_type->tp_name);
235		return NULL;
236	}
237}
238
239PyDoc_STRVAR(intern_doc,
240"intern(string) -> string\n\
241\n\
242``Intern'' the given string.  This enters the string in the (global)\n\
243table of interned strings whose purpose is to speed up dictionary lookups.\n\
244Return the string itself or the previously interned string object with the\n\
245same value.");
246
247
248/*
249 * Cached interned string objects used for calling the profile and
250 * trace functions.  Initialized by trace_init().
251 */
252static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
253
254static int
255trace_init(void)
256{
257	static char *whatnames[7] = {"call", "exception", "line", "return",
258					"c_call", "c_exception", "c_return"};
259	PyObject *name;
260	int i;
261	for (i = 0; i < 7; ++i) {
262		if (whatstrings[i] == NULL) {
263			name = PyUnicode_InternFromString(whatnames[i]);
264			if (name == NULL)
265				return -1;
266			whatstrings[i] = name;
267                }
268	}
269	return 0;
270}
271
272
273static PyObject *
274call_trampoline(PyThreadState *tstate, PyObject* callback,
275		PyFrameObject *frame, int what, PyObject *arg)
276{
277	PyObject *args = PyTuple_New(3);
278	PyObject *whatstr;
279	PyObject *result;
280
281	if (args == NULL)
282		return NULL;
283	Py_INCREF(frame);
284	whatstr = whatstrings[what];
285	Py_INCREF(whatstr);
286	if (arg == NULL)
287		arg = Py_None;
288	Py_INCREF(arg);
289	PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
290	PyTuple_SET_ITEM(args, 1, whatstr);
291	PyTuple_SET_ITEM(args, 2, arg);
292
293	/* call the Python-level function */
294	PyFrame_FastToLocals(frame);
295	result = PyEval_CallObject(callback, args);
296	PyFrame_LocalsToFast(frame, 1);
297	if (result == NULL)
298		PyTraceBack_Here(frame);
299
300	/* cleanup */
301	Py_DECREF(args);
302	return result;
303}
304
305static int
306profile_trampoline(PyObject *self, PyFrameObject *frame,
307		   int what, PyObject *arg)
308{
309	PyThreadState *tstate = frame->f_tstate;
310	PyObject *result;
311
312	if (arg == NULL)
313		arg = Py_None;
314	result = call_trampoline(tstate, self, frame, what, arg);
315	if (result == NULL) {
316		PyEval_SetProfile(NULL, NULL);
317		return -1;
318	}
319	Py_DECREF(result);
320	return 0;
321}
322
323static int
324trace_trampoline(PyObject *self, PyFrameObject *frame,
325		 int what, PyObject *arg)
326{
327	PyThreadState *tstate = frame->f_tstate;
328	PyObject *callback;
329	PyObject *result;
330
331	if (what == PyTrace_CALL)
332		callback = self;
333	else
334		callback = frame->f_trace;
335	if (callback == NULL)
336		return 0;
337	result = call_trampoline(tstate, callback, frame, what, arg);
338	if (result == NULL) {
339		PyEval_SetTrace(NULL, NULL);
340		Py_XDECREF(frame->f_trace);
341		frame->f_trace = NULL;
342		return -1;
343	}
344	if (result != Py_None) {
345		PyObject *temp = frame->f_trace;
346		frame->f_trace = NULL;
347		Py_XDECREF(temp);
348		frame->f_trace = result;
349	}
350	else {
351		Py_DECREF(result);
352	}
353	return 0;
354}
355
356static PyObject *
357sys_settrace(PyObject *self, PyObject *args)
358{
359	if (trace_init() == -1)
360		return NULL;
361	if (args == Py_None)
362		PyEval_SetTrace(NULL, NULL);
363	else
364		PyEval_SetTrace(trace_trampoline, args);
365	Py_INCREF(Py_None);
366	return Py_None;
367}
368
369PyDoc_STRVAR(settrace_doc,
370"settrace(function)\n\
371\n\
372Set the global debug tracing function.  It will be called on each\n\
373function call.  See the debugger chapter in the library manual."
374);
375
376static PyObject *
377sys_setprofile(PyObject *self, PyObject *args)
378{
379	if (trace_init() == -1)
380		return NULL;
381	if (args == Py_None)
382		PyEval_SetProfile(NULL, NULL);
383	else
384		PyEval_SetProfile(profile_trampoline, args);
385	Py_INCREF(Py_None);
386	return Py_None;
387}
388
389PyDoc_STRVAR(setprofile_doc,
390"setprofile(function)\n\
391\n\
392Set the profiling function.  It will be called on each function call\n\
393and return.  See the profiler chapter in the library manual."
394);
395
396static PyObject *
397sys_setcheckinterval(PyObject *self, PyObject *args)
398{
399	if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
400		return NULL;
401	Py_INCREF(Py_None);
402	return Py_None;
403}
404
405PyDoc_STRVAR(setcheckinterval_doc,
406"setcheckinterval(n)\n\
407\n\
408Tell the Python interpreter to check for asynchronous events every\n\
409n instructions.  This also affects how often thread switches occur."
410);
411
412static PyObject *
413sys_getcheckinterval(PyObject *self, PyObject *args)
414{
415	return PyLong_FromLong(_Py_CheckInterval);
416}
417
418PyDoc_STRVAR(getcheckinterval_doc,
419"getcheckinterval() -> current check interval; see setcheckinterval()."
420);
421
422#ifdef WITH_TSC
423static PyObject *
424sys_settscdump(PyObject *self, PyObject *args)
425{
426	int bool;
427	PyThreadState *tstate = PyThreadState_Get();
428
429	if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
430		return NULL;
431	if (bool)
432		tstate->interp->tscdump = 1;
433	else
434		tstate->interp->tscdump = 0;
435	Py_INCREF(Py_None);
436	return Py_None;
437
438}
439
440PyDoc_STRVAR(settscdump_doc,
441"settscdump(bool)\n\
442\n\
443If true, tell the Python interpreter to dump VM measurements to\n\
444stderr.  If false, turn off dump.  The measurements are based on the\n\
445processor's time-stamp counter."
446);
447#endif /* TSC */
448
449static PyObject *
450sys_setrecursionlimit(PyObject *self, PyObject *args)
451{
452	int new_limit;
453	if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
454		return NULL;
455	if (new_limit <= 0) {
456		PyErr_SetString(PyExc_ValueError,
457				"recursion limit must be positive");
458		return NULL;
459	}
460	Py_SetRecursionLimit(new_limit);
461	Py_INCREF(Py_None);
462	return Py_None;
463}
464
465PyDoc_STRVAR(setrecursionlimit_doc,
466"setrecursionlimit(n)\n\
467\n\
468Set the maximum depth of the Python interpreter stack to n.  This\n\
469limit prevents infinite recursion from causing an overflow of the C\n\
470stack and crashing Python.  The highest possible limit is platform-\n\
471dependent."
472);
473
474static PyObject *
475sys_getrecursionlimit(PyObject *self)
476{
477	return PyLong_FromLong(Py_GetRecursionLimit());
478}
479
480PyDoc_STRVAR(getrecursionlimit_doc,
481"getrecursionlimit()\n\
482\n\
483Return the current value of the recursion limit, the maximum depth\n\
484of the Python interpreter stack.  This limit prevents infinite\n\
485recursion from causing an overflow of the C stack and crashing Python."
486);
487
488#ifdef MS_WINDOWS
489PyDoc_STRVAR(getwindowsversion_doc,
490"getwindowsversion()\n\
491\n\
492Return information about the running version of Windows.\n\
493The result is a tuple of (major, minor, build, platform, text)\n\
494All elements are numbers, except text which is a string.\n\
495Platform may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP\n\
496"
497);
498
499static PyObject *
500sys_getwindowsversion(PyObject *self)
501{
502	OSVERSIONINFO ver;
503	ver.dwOSVersionInfoSize = sizeof(ver);
504	if (!GetVersionEx(&ver))
505		return PyErr_SetFromWindowsErr(0);
506	return Py_BuildValue("HHHHs",
507	                     ver.dwMajorVersion,
508	                     ver.dwMinorVersion,
509	                     ver.dwBuildNumber,
510	                     ver.dwPlatformId,
511	                     ver.szCSDVersion);
512}
513
514#endif /* MS_WINDOWS */
515
516#ifdef HAVE_DLOPEN
517static PyObject *
518sys_setdlopenflags(PyObject *self, PyObject *args)
519{
520	int new_val;
521        PyThreadState *tstate = PyThreadState_GET();
522	if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
523		return NULL;
524        if (!tstate)
525		return NULL;
526        tstate->interp->dlopenflags = new_val;
527	Py_INCREF(Py_None);
528	return Py_None;
529}
530
531PyDoc_STRVAR(setdlopenflags_doc,
532"setdlopenflags(n) -> None\n\
533\n\
534Set the flags that will be used for dlopen() calls. Among other\n\
535things, this will enable a lazy resolving of symbols when importing\n\
536a module, if called as sys.setdlopenflags(0)\n\
537To share symbols across extension modules, call as\n\
538sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)"
539);
540
541static PyObject *
542sys_getdlopenflags(PyObject *self, PyObject *args)
543{
544        PyThreadState *tstate = PyThreadState_GET();
545        if (!tstate)
546		return NULL;
547        return PyLong_FromLong(tstate->interp->dlopenflags);
548}
549
550PyDoc_STRVAR(getdlopenflags_doc,
551"getdlopenflags() -> int\n\
552\n\
553Return the current value of the flags that are used for dlopen()\n\
554calls. The flag constants are defined in the dl module."
555);
556#endif
557
558#ifdef USE_MALLOPT
559/* Link with -lmalloc (or -lmpc) on an SGI */
560#include <malloc.h>
561
562static PyObject *
563sys_mdebug(PyObject *self, PyObject *args)
564{
565	int flag;
566	if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
567		return NULL;
568	mallopt(M_DEBUG, flag);
569	Py_INCREF(Py_None);
570	return Py_None;
571}
572#endif /* USE_MALLOPT */
573
574static PyObject *
575sys_getrefcount(PyObject *self, PyObject *arg)
576{
577	return PyLong_FromSsize_t(arg->ob_refcnt);
578}
579
580#ifdef Py_REF_DEBUG
581static PyObject *
582sys_gettotalrefcount(PyObject *self)
583{
584	return PyLong_FromSsize_t(_Py_GetRefTotal());
585}
586#endif /* Py_REF_DEBUG */
587
588PyDoc_STRVAR(getrefcount_doc,
589"getrefcount(object) -> integer\n\
590\n\
591Return the reference count of object.  The count returned is generally\n\
592one higher than you might expect, because it includes the (temporary)\n\
593reference as an argument to getrefcount()."
594);
595
596#ifdef COUNT_ALLOCS
597static PyObject *
598sys_getcounts(PyObject *self)
599{
600	extern PyObject *get_counts(void);
601
602	return get_counts();
603}
604#endif
605
606PyDoc_STRVAR(getframe_doc,
607"_getframe([depth]) -> frameobject\n\
608\n\
609Return a frame object from the call stack.  If optional integer depth is\n\
610given, return the frame object that many calls below the top of the stack.\n\
611If that is deeper than the call stack, ValueError is raised.  The default\n\
612for depth is zero, returning the frame at the top of the call stack.\n\
613\n\
614This function should be used for internal and specialized\n\
615purposes only."
616);
617
618static PyObject *
619sys_getframe(PyObject *self, PyObject *args)
620{
621	PyFrameObject *f = PyThreadState_GET()->frame;
622	int depth = -1;
623
624	if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
625		return NULL;
626
627	while (depth > 0 && f != NULL) {
628		f = f->f_back;
629		--depth;
630	}
631	if (f == NULL) {
632		PyErr_SetString(PyExc_ValueError,
633				"call stack is not deep enough");
634		return NULL;
635	}
636	Py_INCREF(f);
637	return (PyObject*)f;
638}
639
640PyDoc_STRVAR(current_frames_doc,
641"_current_frames() -> dictionary\n\
642\n\
643Return a dictionary mapping each current thread T's thread id to T's\n\
644current stack frame.\n\
645\n\
646This function should be used for specialized purposes only."
647);
648
649static PyObject *
650sys_current_frames(PyObject *self, PyObject *noargs)
651{
652	return _PyThread_CurrentFrames();
653}
654
655PyDoc_STRVAR(call_tracing_doc,
656"call_tracing(func, args) -> object\n\
657\n\
658Call func(*args), while tracing is enabled.  The tracing state is\n\
659saved, and restored afterwards.  This is intended to be called from\n\
660a debugger from a checkpoint, to recursively debug some other code."
661);
662
663static PyObject *
664sys_call_tracing(PyObject *self, PyObject *args)
665{
666	PyObject *func, *funcargs;
667	if (!PyArg_UnpackTuple(args, "call_tracing", 2, 2, &func, &funcargs))
668		return NULL;
669	return _PyEval_CallTracing(func, funcargs);
670}
671
672PyDoc_STRVAR(callstats_doc,
673"callstats() -> tuple of integers\n\
674\n\
675Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
676when Python was built.  Otherwise, return None.\n\
677\n\
678When enabled, this function returns detailed, implementation-specific\n\
679details about the number of function calls executed. The return value is\n\
680a 11-tuple where the entries in the tuple are counts of:\n\
6810. all function calls\n\
6821. calls to PyFunction_Type objects\n\
6832. PyFunction calls that do not create an argument tuple\n\
6843. PyFunction calls that do not create an argument tuple\n\
685   and bypass PyEval_EvalCodeEx()\n\
6864. PyMethod calls\n\
6875. PyMethod calls on bound methods\n\
6886. PyType calls\n\
6897. PyCFunction calls\n\
6908. generator calls\n\
6919. All other calls\n\
69210. Number of stack pops performed by call_function()"
693);
694
695#ifdef __cplusplus
696extern "C" {
697#endif
698
699#ifdef Py_TRACE_REFS
700/* Defined in objects.c because it uses static globals if that file */
701extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
702#endif
703
704#ifdef DYNAMIC_EXECUTION_PROFILE
705/* Defined in ceval.c because it uses static globals if that file */
706extern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
707#endif
708
709#ifdef __cplusplus
710}
711#endif
712
713static PyMethodDef sys_methods[] = {
714	/* Might as well keep this in alphabetic order */
715	{"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
716	 callstats_doc},
717	{"_current_frames", sys_current_frames, METH_NOARGS,
718	 current_frames_doc},
719	{"displayhook",	sys_displayhook, METH_O, displayhook_doc},
720	{"exc_info",	sys_exc_info, METH_NOARGS, exc_info_doc},
721	{"excepthook",	sys_excepthook, METH_VARARGS, excepthook_doc},
722	{"exit",	sys_exit, METH_VARARGS, exit_doc},
723	{"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
724	 METH_NOARGS, getdefaultencoding_doc},
725#ifdef HAVE_DLOPEN
726	{"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
727	 getdlopenflags_doc},
728#endif
729#ifdef COUNT_ALLOCS
730	{"getcounts",	(PyCFunction)sys_getcounts, METH_NOARGS},
731#endif
732#ifdef DYNAMIC_EXECUTION_PROFILE
733	{"getdxp",	_Py_GetDXProfile, METH_VARARGS},
734#endif
735	{"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
736	 METH_NOARGS, getfilesystemencoding_doc},
737#ifdef Py_TRACE_REFS
738	{"getobjects",	_Py_GetObjects, METH_VARARGS},
739#endif
740#ifdef Py_REF_DEBUG
741	{"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
742#endif
743	{"getrefcount",	(PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
744	{"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
745	 getrecursionlimit_doc},
746	{"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
747#ifdef MS_WINDOWS
748	{"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
749	 getwindowsversion_doc},
750#endif /* MS_WINDOWS */
751 	{"intern",	sys_intern,     METH_VARARGS, intern_doc},
752#ifdef USE_MALLOPT
753	{"mdebug",	sys_mdebug, METH_VARARGS},
754#endif
755	{"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
756	 setdefaultencoding_doc},
757	{"setcheckinterval",	sys_setcheckinterval, METH_VARARGS,
758	 setcheckinterval_doc},
759	{"getcheckinterval",	sys_getcheckinterval, METH_NOARGS,
760	 getcheckinterval_doc},
761#ifdef HAVE_DLOPEN
762	{"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
763	 setdlopenflags_doc},
764#endif
765	{"setprofile",	sys_setprofile, METH_O, setprofile_doc},
766	{"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
767	 setrecursionlimit_doc},
768#ifdef WITH_TSC
769	{"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
770#endif
771	{"settrace",	sys_settrace, METH_O, settrace_doc},
772	{"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
773	{NULL,		NULL}		/* sentinel */
774};
775
776static PyObject *
777list_builtin_module_names(void)
778{
779	PyObject *list = PyList_New(0);
780	int i;
781	if (list == NULL)
782		return NULL;
783	for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
784		PyObject *name = PyUnicode_FromString(
785			PyImport_Inittab[i].name);
786		if (name == NULL)
787			break;
788		PyList_Append(list, name);
789		Py_DECREF(name);
790	}
791	if (PyList_Sort(list) != 0) {
792		Py_DECREF(list);
793		list = NULL;
794	}
795	if (list) {
796		PyObject *v = PyList_AsTuple(list);
797		Py_DECREF(list);
798		list = v;
799	}
800	return list;
801}
802
803static PyObject *warnoptions = NULL;
804
805void
806PySys_ResetWarnOptions(void)
807{
808	if (warnoptions == NULL || !PyList_Check(warnoptions))
809		return;
810	PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
811}
812
813void
814PySys_AddWarnOption(const char *s)
815{
816	PyObject *str;
817
818	if (warnoptions == NULL || !PyList_Check(warnoptions)) {
819		Py_XDECREF(warnoptions);
820		warnoptions = PyList_New(0);
821		if (warnoptions == NULL)
822			return;
823	}
824	str = PyUnicode_FromString(s);
825	if (str != NULL) {
826		PyList_Append(warnoptions, str);
827		Py_DECREF(str);
828	}
829}
830
831/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
832   Two literals concatenated works just fine.  If you have a K&R compiler
833   or other abomination that however *does* understand longer strings,
834   get rid of the !!! comment in the middle and the quotes that surround it. */
835PyDoc_VAR(sys_doc) =
836PyDoc_STR(
837"This module provides access to some objects used or maintained by the\n\
838interpreter and to functions that interact strongly with the interpreter.\n\
839\n\
840Dynamic objects:\n\
841\n\
842argv -- command line arguments; argv[0] is the script pathname if known\n\
843path -- module search path; path[0] is the script directory, else ''\n\
844modules -- dictionary of loaded modules\n\
845\n\
846displayhook -- called to show results in an interactive session\n\
847excepthook -- called to handle any uncaught exception other than SystemExit\n\
848  To customize printing in an interactive session or to install a custom\n\
849  top-level exception handler, assign other functions to replace these.\n\
850\n\
851stdin -- standard input file object; used by raw_input() and input()\n\
852stdout -- standard output file object; used by print()\n\
853stderr -- standard error object; used for error messages\n\
854  By assigning other file objects (or objects that behave like files)\n\
855  to these, it is possible to redirect all of the interpreter's I/O.\n\
856\n\
857last_type -- type of last uncaught exception\n\
858last_value -- value of last uncaught exception\n\
859last_traceback -- traceback of last uncaught exception\n\
860  These three are only available in an interactive session after a\n\
861  traceback has been printed.\n\
862"
863)
864/* concatenating string here */
865PyDoc_STR(
866"\n\
867Static objects:\n\
868\n\
869float_info -- a dict with information about the float implementation.\n\
870maxsize -- the largest supported length of containers.\n\
871maxunicode -- the largest supported character\n\
872builtin_module_names -- tuple of module names built into this interpreter\n\
873subversion -- subversion information of the build as tuple\n\
874version -- the version of this interpreter as a string\n\
875version_info -- version information as a tuple\n\
876hexversion -- version information encoded as a single integer\n\
877copyright -- copyright notice pertaining to this interpreter\n\
878platform -- platform identifier\n\
879executable -- pathname of this Python interpreter\n\
880prefix -- prefix used to find the Python library\n\
881exec_prefix -- prefix used to find the machine-specific Python library\n\
882"
883)
884#ifdef MS_WINDOWS
885/* concatenating string here */
886PyDoc_STR(
887"dllhandle -- [Windows only] integer handle of the Python DLL\n\
888winver -- [Windows only] version number of the Python DLL\n\
889"
890)
891#endif /* MS_WINDOWS */
892PyDoc_STR(
893"__stdin__ -- the original stdin; don't touch!\n\
894__stdout__ -- the original stdout; don't touch!\n\
895__stderr__ -- the original stderr; don't touch!\n\
896__displayhook__ -- the original displayhook; don't touch!\n\
897__excepthook__ -- the original excepthook; don't touch!\n\
898\n\
899Functions:\n\
900\n\
901displayhook() -- print an object to the screen, and save it in builtins._\n\
902excepthook() -- print an exception and its traceback to sys.stderr\n\
903exc_info() -- return thread-safe information about the current exception\n\
904exit() -- exit the interpreter by raising SystemExit\n\
905getdlopenflags() -- returns flags to be used for dlopen() calls\n\
906getrefcount() -- return the reference count for an object (plus one :-)\n\
907getrecursionlimit() -- return the max recursion depth for the interpreter\n\
908setcheckinterval() -- control how often the interpreter checks for events\n\
909setdlopenflags() -- set the flags to be used for dlopen() calls\n\
910setprofile() -- set the global profiling function\n\
911setrecursionlimit() -- set the max recursion depth for the interpreter\n\
912settrace() -- set the global debug tracing function\n\
913"
914)
915/* end of sys_doc */ ;
916
917/* Subversion branch and revision management */
918static const char _patchlevel_revision[] = PY_PATCHLEVEL_REVISION;
919static const char headurl[] = "$HeadURL$";
920static int svn_initialized;
921static char patchlevel_revision[50]; /* Just the number */
922static char branch[50];
923static char shortbranch[50];
924static const char *svn_revision;
925
926static void
927svnversion_init(void)
928{
929	const char *python, *br_start, *br_end, *br_end2, *svnversion;
930	Py_ssize_t len;
931	int istag = 0;
932
933	if (svn_initialized)
934		return;
935
936	python = strstr(headurl, "/python/");
937	if (!python) {
938		strcpy(branch, "unknown branch");
939		strcpy(shortbranch, "unknown");
940	}
941	else {
942		br_start = python + 8;
943		br_end = strchr(br_start, '/');
944		assert(br_end);
945
946		/* Works even for trunk,
947		   as we are in trunk/Python/sysmodule.c */
948		br_end2 = strchr(br_end+1, '/');
949
950		istag = strncmp(br_start, "tags", 4) == 0;
951		if (strncmp(br_start, "trunk", 5) == 0) {
952			strcpy(branch, "trunk");
953			strcpy(shortbranch, "trunk");
954		}
955		else if (istag || strncmp(br_start, "branches", 8) == 0) {
956			len = br_end2 - br_start;
957			strncpy(branch, br_start, len);
958			branch[len] = '\0';
959
960			len = br_end2 - (br_end + 1);
961			strncpy(shortbranch, br_end + 1, len);
962			shortbranch[len] = '\0';
963		}
964		else {
965			Py_FatalError("bad HeadURL");
966			return;
967		}
968	}
969
970
971	svnversion = _Py_svnversion();
972	if (strcmp(svnversion, "exported") != 0)
973		svn_revision = svnversion;
974	else if (istag) {
975		len = strlen(_patchlevel_revision);
976		assert(len >= 13);
977		assert(len < (sizeof(patchlevel_revision) + 13));
978		strncpy(patchlevel_revision, _patchlevel_revision + 11,
979			len - 13);
980		patchlevel_revision[len - 13] = '\0';
981		svn_revision = patchlevel_revision;
982	}
983	else
984		svn_revision = "";
985
986	svn_initialized = 1;
987}
988
989/* Return svnversion output if available.
990   Else return Revision of patchlevel.h if on branch.
991   Else return empty string */
992const char*
993Py_SubversionRevision()
994{
995	svnversion_init();
996	return svn_revision;
997}
998
999const char*
1000Py_SubversionShortBranch()
1001{
1002	svnversion_init();
1003	return shortbranch;
1004}
1005
1006
1007PyDoc_STRVAR(flags__doc__,
1008"sys.flags\n\
1009\n\
1010Flags provided through command line arguments or environment vars.");
1011
1012static PyTypeObject FlagsType;
1013
1014static PyStructSequence_Field flags_fields[] = {
1015	{"debug",		"-d"},
1016	{"division_warning",	"-Q"},
1017	{"inspect",		"-i"},
1018	{"interactive",		"-i"},
1019	{"optimize",		"-O or -OO"},
1020	{"dont_write_bytecode",	"-B"},
1021	/* {"no_user_site",	"-s"}, */
1022	{"no_site",		"-S"},
1023	{"ingnore_environment",	"-E"},
1024	{"tabcheck",		"-t or -tt"},
1025	{"verbose",		"-v"},
1026#ifdef RISCOS
1027	{"ricos_wimp",		"???"},
1028#endif
1029	/* {"unbuffered",		"-u"}, */
1030	/* {"skip_first",		"-x"}, */
1031	{0}
1032};
1033
1034static PyStructSequence_Desc flags_desc = {
1035	"sys.flags",	/* name */
1036	flags__doc__,	/* doc */
1037	flags_fields,	/* fields */
1038#ifdef RISCOS
1039	11
1040#else
1041	10
1042#endif
1043};
1044
1045static PyObject*
1046make_flags(void)
1047{
1048	int pos = 0;
1049	PyObject *seq;
1050
1051	seq = PyStructSequence_New(&FlagsType);
1052	if (seq == NULL)
1053		return NULL;
1054
1055#define SetFlag(flag) \
1056	PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
1057
1058	SetFlag(Py_DebugFlag);
1059	SetFlag(Py_DivisionWarningFlag);
1060	SetFlag(Py_InspectFlag);
1061	SetFlag(Py_InteractiveFlag);
1062	SetFlag(Py_OptimizeFlag);
1063	SetFlag(Py_DontWriteBytecodeFlag);
1064	/* SetFlag(Py_NoUserSiteDirectory); */
1065	SetFlag(Py_NoSiteFlag);
1066	SetFlag(Py_IgnoreEnvironmentFlag);
1067	SetFlag(Py_TabcheckFlag);
1068	SetFlag(Py_VerboseFlag);
1069#ifdef RISCOS
1070	SetFlag(Py_RISCOSWimpFlag);
1071#endif
1072	/* SetFlag(saw_unbuffered_flag); */
1073	/* SetFlag(skipfirstline); */
1074#undef SetFlag
1075
1076	if (PyErr_Occurred()) {
1077		return NULL;
1078	}
1079
1080	Py_INCREF(seq);
1081	return seq;
1082}
1083
1084PyObject *
1085_PySys_Init(void)
1086{
1087	PyObject *m, *v, *sysdict;
1088	char *s;
1089
1090	m = Py_InitModule3("sys", sys_methods, sys_doc);
1091	if (m == NULL)
1092		return NULL;
1093	sysdict = PyModule_GetDict(m);
1094
1095	{
1096		/* XXX: does this work on Win/Win64? (see posix_fstat) */
1097		struct stat sb;
1098		if (fstat(fileno(stdin), &sb) == 0 &&
1099		    S_ISDIR(sb.st_mode)) {
1100			/* There's nothing more we can do. */
1101			/* Py_FatalError() will core dump, so just exit. */
1102			PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1103			exit(EXIT_FAILURE);
1104		}
1105	}
1106
1107        /* stdin/stdout/stderr are now set by pythonrun.c */
1108
1109	PyDict_SetItemString(sysdict, "__displayhook__",
1110                             PyDict_GetItemString(sysdict, "displayhook"));
1111	PyDict_SetItemString(sysdict, "__excepthook__",
1112                             PyDict_GetItemString(sysdict, "excepthook"));
1113	PyDict_SetItemString(sysdict, "version",
1114			     v = PyUnicode_FromString(Py_GetVersion()));
1115	Py_XDECREF(v);
1116	PyDict_SetItemString(sysdict, "hexversion",
1117			     v = PyLong_FromLong(PY_VERSION_HEX));
1118	Py_XDECREF(v);
1119	svnversion_init();
1120	v = Py_BuildValue("(UUU)", "CPython", branch, svn_revision);
1121	PyDict_SetItemString(sysdict, "subversion", v);
1122	Py_XDECREF(v);
1123	PyDict_SetItemString(sysdict, "dont_write_bytecode",
1124			     v = PyBool_FromLong(Py_DontWriteBytecodeFlag));
1125	Py_XDECREF(v);
1126	/*
1127	 * These release level checks are mutually exclusive and cover
1128	 * the field, so don't get too fancy with the pre-processor!
1129	 */
1130#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1131	s = "alpha";
1132#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1133	s = "beta";
1134#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1135	s = "candidate";
1136#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1137	s = "final";
1138#endif
1139
1140#define SET_SYS_FROM_STRING(key, value)			\
1141	v = value;					\
1142	if (v != NULL)					\
1143		PyDict_SetItemString(sysdict, key, v);	\
1144	Py_XDECREF(v)
1145
1146	SET_SYS_FROM_STRING("version_info",
1147			    Py_BuildValue("iiiUi", PY_MAJOR_VERSION,
1148					       PY_MINOR_VERSION,
1149					       PY_MICRO_VERSION, s,
1150					       PY_RELEASE_SERIAL));
1151	SET_SYS_FROM_STRING("api_version",
1152			    PyLong_FromLong(PYTHON_API_VERSION));
1153	SET_SYS_FROM_STRING("copyright",
1154			    PyUnicode_FromString(Py_GetCopyright()));
1155	SET_SYS_FROM_STRING("platform",
1156			    PyUnicode_FromString(Py_GetPlatform()));
1157	SET_SYS_FROM_STRING("executable",
1158			    PyUnicode_DecodeFSDefault(
1159				Py_GetProgramFullPath()));
1160	SET_SYS_FROM_STRING("prefix",
1161			    PyUnicode_DecodeFSDefault(Py_GetPrefix()));
1162	SET_SYS_FROM_STRING("exec_prefix",
1163		   	    PyUnicode_DecodeFSDefault(Py_GetExecPrefix()));
1164	SET_SYS_FROM_STRING("maxsize",
1165			    PyLong_FromSsize_t(PY_SSIZE_T_MAX));
1166	SET_SYS_FROM_STRING("float_info",
1167			    PyFloat_GetInfo());
1168	SET_SYS_FROM_STRING("maxunicode",
1169			    PyLong_FromLong(PyUnicode_GetMax()));
1170	SET_SYS_FROM_STRING("builtin_module_names",
1171			    list_builtin_module_names());
1172	{
1173		/* Assumes that longs are at least 2 bytes long.
1174		   Should be safe! */
1175		unsigned long number = 1;
1176		char *value;
1177
1178		s = (char *) &number;
1179		if (s[0] == 0)
1180			value = "big";
1181		else
1182			value = "little";
1183		SET_SYS_FROM_STRING("byteorder",
1184				    PyUnicode_FromString(value));
1185	}
1186#ifdef MS_COREDLL
1187	SET_SYS_FROM_STRING("dllhandle",
1188			    PyLong_FromVoidPtr(PyWin_DLLhModule));
1189	SET_SYS_FROM_STRING("winver",
1190			    PyUnicode_FromString(PyWin_DLLVersionString));
1191#endif
1192#undef SET_SYS_FROM_STRING
1193	if (warnoptions == NULL) {
1194		warnoptions = PyList_New(0);
1195	}
1196	else {
1197		Py_INCREF(warnoptions);
1198	}
1199	if (warnoptions != NULL) {
1200		PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1201	}
1202
1203	PyStructSequence_InitType(&FlagsType, &flags_desc);
1204	PyDict_SetItemString(sysdict, "flags", make_flags());
1205	/* prevent user from creating new instances */
1206	FlagsType.tp_init = NULL;
1207	FlagsType.tp_new = NULL;
1208
1209	if (PyErr_Occurred())
1210		return NULL;
1211	return m;
1212}
1213
1214static PyObject *
1215makepathobject(const char *path, int delim)
1216{
1217	int i, n;
1218	const char *p;
1219	PyObject *v, *w;
1220
1221	n = 1;
1222	p = path;
1223	while ((p = strchr(p, delim)) != NULL) {
1224		n++;
1225		p++;
1226	}
1227	v = PyList_New(n);
1228	if (v == NULL)
1229		return NULL;
1230	for (i = 0; ; i++) {
1231		p = strchr(path, delim);
1232		if (p == NULL)
1233			p = strchr(path, '\0'); /* End of string */
1234		w = PyUnicode_DecodeFSDefaultAndSize(path, (Py_ssize_t) (p - path));
1235		if (w == NULL) {
1236			Py_DECREF(v);
1237			return NULL;
1238		}
1239		PyList_SetItem(v, i, w);
1240		if (*p == '\0')
1241			break;
1242		path = p+1;
1243	}
1244	return v;
1245}
1246
1247void
1248PySys_SetPath(const char *path)
1249{
1250	PyObject *v;
1251	if ((v = makepathobject(path, DELIM)) == NULL)
1252		Py_FatalError("can't create sys.path");
1253	if (PySys_SetObject("path", v) != 0)
1254		Py_FatalError("can't assign sys.path");
1255	Py_DECREF(v);
1256}
1257
1258static PyObject *
1259makeargvobject(int argc, char **argv)
1260{
1261	PyObject *av;
1262	if (argc <= 0 || argv == NULL) {
1263		/* Ensure at least one (empty) argument is seen */
1264		static char *empty_argv[1] = {""};
1265		argv = empty_argv;
1266		argc = 1;
1267	}
1268	av = PyList_New(argc);
1269	if (av != NULL) {
1270		int i;
1271		for (i = 0; i < argc; i++) {
1272#ifdef __VMS
1273			PyObject *v;
1274
1275			/* argv[0] is the script pathname if known */
1276			if (i == 0) {
1277				char* fn = decc$translate_vms(argv[0]);
1278				if ((fn == (char *)0) || fn == (char *)-1)
1279					v = PyUnicode_FromString(argv[0]);
1280				else
1281					v = PyUnicode_FromString(
1282						decc$translate_vms(argv[0]));
1283			} else
1284				v = PyUnicode_FromString(argv[i]);
1285#else
1286			PyObject *v = PyUnicode_FromString(argv[i]);
1287#endif
1288			if (v == NULL) {
1289				Py_DECREF(av);
1290				av = NULL;
1291				break;
1292			}
1293			PyList_SetItem(av, i, v);
1294		}
1295	}
1296	return av;
1297}
1298
1299void
1300PySys_SetArgv(int argc, char **argv)
1301{
1302#if defined(HAVE_REALPATH)
1303	char fullpath[MAXPATHLEN];
1304#elif defined(MS_WINDOWS)
1305	char fullpath[MAX_PATH];
1306#endif
1307	PyObject *av = makeargvobject(argc, argv);
1308	PyObject *path = PySys_GetObject("path");
1309	if (av == NULL)
1310		Py_FatalError("no mem for sys.argv");
1311	if (PySys_SetObject("argv", av) != 0)
1312		Py_FatalError("can't assign sys.argv");
1313	if (path != NULL) {
1314		char *argv0 = argv[0];
1315		char *p = NULL;
1316		Py_ssize_t n = 0;
1317		PyObject *a;
1318#ifdef HAVE_READLINK
1319		char link[MAXPATHLEN+1];
1320		char argv0copy[2*MAXPATHLEN+1];
1321		int nr = 0;
1322		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
1323			nr = readlink(argv0, link, MAXPATHLEN);
1324		if (nr > 0) {
1325			/* It's a symlink */
1326			link[nr] = '\0';
1327			if (link[0] == SEP)
1328				argv0 = link; /* Link to absolute path */
1329			else if (strchr(link, SEP) == NULL)
1330				; /* Link without path */
1331			else {
1332				/* Must join(dirname(argv0), link) */
1333				char *q = strrchr(argv0, SEP);
1334				if (q == NULL)
1335					argv0 = link; /* argv0 without path */
1336				else {
1337					/* Must make a copy */
1338					strcpy(argv0copy, argv0);
1339					q = strrchr(argv0copy, SEP);
1340					strcpy(q+1, link);
1341					argv0 = argv0copy;
1342				}
1343			}
1344		}
1345#endif /* HAVE_READLINK */
1346#if SEP == '\\' /* Special case for MS filename syntax */
1347		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1348			char *q;
1349#ifdef MS_WINDOWS
1350			char *ptemp;
1351			if (GetFullPathName(argv0,
1352					   sizeof(fullpath),
1353					   fullpath,
1354					   &ptemp)) {
1355				argv0 = fullpath;
1356			}
1357#endif
1358			p = strrchr(argv0, SEP);
1359			/* Test for alternate separator */
1360			q = strrchr(p ? p : argv0, '/');
1361			if (q != NULL)
1362				p = q;
1363			if (p != NULL) {
1364				n = p + 1 - argv0;
1365				if (n > 1 && p[-1] != ':')
1366					n--; /* Drop trailing separator */
1367			}
1368		}
1369#else /* All other filename syntaxes */
1370		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1371#if defined(HAVE_REALPATH)
1372			if (realpath(argv0, fullpath)) {
1373				argv0 = fullpath;
1374			}
1375#endif
1376			p = strrchr(argv0, SEP);
1377		}
1378		if (p != NULL) {
1379			n = p + 1 - argv0;
1380#if SEP == '/' /* Special case for Unix filename syntax */
1381			if (n > 1)
1382				n--; /* Drop trailing separator */
1383#endif /* Unix */
1384		}
1385#endif /* All others */
1386		a = PyUnicode_FromStringAndSize(argv0, n);
1387		if (a == NULL)
1388			Py_FatalError("no mem for sys.path insertion");
1389		if (PyList_Insert(path, 0, a) < 0)
1390			Py_FatalError("sys.path.insert(0) failed");
1391		Py_DECREF(a);
1392	}
1393	Py_DECREF(av);
1394}
1395
1396
1397/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1398   Adapted from code submitted by Just van Rossum.
1399
1400   PySys_WriteStdout(format, ...)
1401   PySys_WriteStderr(format, ...)
1402
1403      The first function writes to sys.stdout; the second to sys.stderr.  When
1404      there is a problem, they write to the real (C level) stdout or stderr;
1405      no exceptions are raised.
1406
1407      Both take a printf-style format string as their first argument followed
1408      by a variable length argument list determined by the format string.
1409
1410      *** WARNING ***
1411
1412      The format should limit the total size of the formatted output string to
1413      1000 bytes.  In particular, this means that no unrestricted "%s" formats
1414      should occur; these should be limited using "%.<N>s where <N> is a
1415      decimal number calculated so that <N> plus the maximum size of other
1416      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
1417      which can print hundreds of digits for very large numbers.
1418
1419 */
1420
1421static void
1422mywrite(char *name, FILE *fp, const char *format, va_list va)
1423{
1424	PyObject *file;
1425	PyObject *error_type, *error_value, *error_traceback;
1426	char buffer[1001];
1427	int written;
1428
1429	PyErr_Fetch(&error_type, &error_value, &error_traceback);
1430	file = PySys_GetObject(name);
1431	written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
1432	if (PyFile_WriteString(buffer, file) != 0) {
1433		PyErr_Clear();
1434		fputs(buffer, fp);
1435	}
1436	if (written < 0 || (size_t)written >= sizeof(buffer)) {
1437		const char *truncated = "... truncated";
1438		if (PyFile_WriteString(truncated, file) != 0) {
1439			PyErr_Clear();
1440			fputs(truncated, fp);
1441		}
1442	}
1443	PyErr_Restore(error_type, error_value, error_traceback);
1444}
1445
1446void
1447PySys_WriteStdout(const char *format, ...)
1448{
1449	va_list va;
1450
1451	va_start(va, format);
1452	mywrite("stdout", stdout, format, va);
1453	va_end(va);
1454}
1455
1456void
1457PySys_WriteStderr(const char *format, ...)
1458{
1459	va_list va;
1460
1461	va_start(va, format);
1462	mywrite("stderr", stderr, format, va);
1463	va_end(va);
1464}
1465