blob: 13b86f2270bc6017f1fc4ce031378a116c029c77 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +00007Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +00008- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009Data members:
10- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000012- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015*/
16
Guido van Rossum65bf9f21997-04-29 18:33:38 +000017#include "Python.h"
Barry Warsawb6a54d22000-12-06 21:47:46 +000018#include "compile.h"
19#include "frameobject.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
Guido van Rossume2437a11992-03-23 18:20:18 +000021#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000022
Mark Hammond8696ebc2002-10-08 02:44:31 +000023#ifdef MS_WINDOWS
24#define WIN32_LEAN_AND_MEAN
25#include "windows.h"
26#endif /* MS_WINDOWS */
27
Guido van Rossum9b38a141996-09-11 23:12:24 +000028#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000029extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000030/* A string loaded from the DLL at startup: */
31extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000032#endif
33
Guido van Rossum65bf9f21997-04-29 18:33:38 +000034PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000035PySys_GetObject(char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036{
Guido van Rossum25ce5661997-08-02 03:10:38 +000037 PyThreadState *tstate = PyThreadState_Get();
38 PyObject *sd = tstate->interp->sysdict;
Guido van Rossumbe203361999-10-05 22:17:41 +000039 if (sd == NULL)
40 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000041 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042}
43
44FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000045PySys_GetFile(char *name, FILE *def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046{
47 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000048 PyObject *v = PySys_GetObject(name);
49 if (v != NULL && PyFile_Check(v))
50 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 if (fp == NULL)
52 fp = def;
53 return fp;
54}
55
56int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000057PySys_SetObject(char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058{
Guido van Rossum25ce5661997-08-02 03:10:38 +000059 PyThreadState *tstate = PyThreadState_Get();
60 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000061 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000062 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000063 return 0;
64 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000065 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000066 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000068 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069}
70
Guido van Rossum65bf9f21997-04-29 18:33:38 +000071static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000072sys_displayhook(PyObject *self, PyObject *o)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000073{
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000074 PyObject *outf;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000075 PyInterpreterState *interp = PyThreadState_Get()->interp;
76 PyObject *modules = interp->modules;
77 PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
78
Moshe Zadka03897ea2001-07-23 13:32:43 +000079 if (builtins == NULL) {
80 PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
81 return NULL;
82 }
83
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000084 /* Print value except if None */
85 /* After printing, also assign to '_' */
86 /* Before, set '_' to None to avoid recursion */
87 if (o == Py_None) {
88 Py_INCREF(Py_None);
89 return Py_None;
90 }
91 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
92 return NULL;
93 if (Py_FlushLine() != 0)
94 return NULL;
Greg Steinceb9b7c2001-01-11 09:27:34 +000095 outf = PySys_GetObject("stdout");
96 if (outf == NULL) {
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000097 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
98 return NULL;
99 }
Greg Steinceb9b7c2001-01-11 09:27:34 +0000100 if (PyFile_WriteObject(o, outf, 0) != 0)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000101 return NULL;
Greg Steinceb9b7c2001-01-11 09:27:34 +0000102 PyFile_SoftSpace(outf, 1);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000103 if (Py_FlushLine() != 0)
104 return NULL;
105 if (PyObject_SetAttrString(builtins, "_", o) != 0)
106 return NULL;
107 Py_INCREF(Py_None);
108 return Py_None;
109}
110
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000111PyDoc_STRVAR(displayhook_doc,
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000112"displayhook(object) -> None\n"
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000113"\n"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000114"Print an object to sys.stdout and also save it in __builtin__._\n"
115);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000116
117static PyObject *
118sys_excepthook(PyObject* self, PyObject* args)
119{
120 PyObject *exc, *value, *tb;
Fred Drakea7688822001-10-24 20:47:48 +0000121 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000122 return NULL;
123 PyErr_Display(exc, value, tb);
124 Py_INCREF(Py_None);
125 return Py_None;
126}
127
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000128PyDoc_STRVAR(excepthook_doc,
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000129"excepthook(exctype, value, traceback) -> None\n"
130"\n"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000131"Handle an exception by displaying it with a traceback on sys.stderr.\n"
132);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000133
134static PyObject *
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000135sys_exc_info(PyObject *self, PyObject *noargs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136{
137 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138 tstate = PyThreadState_Get();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139 return Py_BuildValue(
140 "(OOO)",
141 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
142 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
143 tstate->exc_traceback != NULL ?
144 tstate->exc_traceback : Py_None);
145}
146
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000147PyDoc_STRVAR(exc_info_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000148"exc_info() -> (type, value, traceback)\n\
149\n\
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000150Return information about the most recent exception caught by an except\n\
151clause in the current stack frame or in an older stack frame."
152);
153
154static PyObject *
155sys_exc_clear(PyObject *self, PyObject *noargs)
156{
157 PyThreadState *tstate = PyThreadState_Get();
158 PyObject *tmp_type, *tmp_value, *tmp_tb;
159 tmp_type = tstate->exc_type;
160 tmp_value = tstate->exc_value;
161 tmp_tb = tstate->exc_traceback;
162 tstate->exc_type = NULL;
163 tstate->exc_value = NULL;
164 tstate->exc_traceback = NULL;
165 Py_XDECREF(tmp_type);
166 Py_XDECREF(tmp_value);
167 Py_XDECREF(tmp_tb);
168 /* For b/w compatibility */
169 PySys_SetObject("exc_type", Py_None);
170 PySys_SetObject("exc_value", Py_None);
171 PySys_SetObject("exc_traceback", Py_None);
172 Py_INCREF(Py_None);
173 return Py_None;
174}
175
176PyDoc_STRVAR(exc_clear_doc,
177"exc_clear() -> None\n\
178\n\
179Clear global information on the current exception. Subsequent calls to\n\
180exc_info() will return (None,None,None) until another exception is raised\n\
181in the current thread or the execution stack returns to a frame where\n\
182another exception is being handled."
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000183);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000184
Guido van Rossuma027efa1997-05-05 20:56:21 +0000185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000186sys_exit(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187{
Neal Norwitz0c766a02002-03-27 13:03:09 +0000188 PyObject *exit_code = 0;
189 if (!PyArg_ParseTuple(args, "|O:exit", &exit_code))
190 return NULL;
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000191 /* Raise SystemExit so callers may catch it or clean up. */
Neal Norwitz0c766a02002-03-27 13:03:09 +0000192 PyErr_SetObject(PyExc_SystemExit, exit_code);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000193 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000196PyDoc_STRVAR(exit_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000197"exit([status])\n\
198\n\
199Exit the interpreter by raising SystemExit(status).\n\
200If the status is omitted or None, it defaults to zero (i.e., success).\n\
Neil Schemenauer0f2103f2002-03-23 20:46:35 +0000201If the status is numeric, it will be used as the system exit status.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000202If it is another kind of object, it will be printed and the system\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000203exit status will be one (i.e., failure)."
204);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000205
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000206#ifdef Py_USING_UNICODE
207
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000208static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000209sys_getdefaultencoding(PyObject *self)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000210{
Fred Drake8b4d01d2000-05-09 19:57:01 +0000211 return PyString_FromString(PyUnicode_GetDefaultEncoding());
212}
213
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000214PyDoc_STRVAR(getdefaultencoding_doc,
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000215"getdefaultencoding() -> string\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000216\n\
217Return the current default string encoding used by the Unicode \n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000218implementation."
219);
Fred Drake8b4d01d2000-05-09 19:57:01 +0000220
221static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000222sys_setdefaultencoding(PyObject *self, PyObject *args)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000223{
224 char *encoding;
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000225 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
Fred Drake8b4d01d2000-05-09 19:57:01 +0000226 return NULL;
227 if (PyUnicode_SetDefaultEncoding(encoding))
228 return NULL;
229 Py_INCREF(Py_None);
230 return Py_None;
231}
232
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000233PyDoc_STRVAR(setdefaultencoding_doc,
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000234"setdefaultencoding(encoding)\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000235\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000236Set the current default string encoding used by the Unicode implementation."
237);
Fred Drake8b4d01d2000-05-09 19:57:01 +0000238
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000239#endif
240
Fred Drake5755ce62001-06-27 19:19:46 +0000241/*
242 * Cached interned string objects used for calling the profile and
243 * trace functions. Initialized by trace_init().
244 */
245static PyObject *whatstrings[4] = {NULL, NULL, NULL, NULL};
246
247static int
248trace_init(void)
249{
250 static char *whatnames[4] = {"call", "exception", "line", "return"};
251 PyObject *name;
252 int i;
253 for (i = 0; i < 4; ++i) {
254 if (whatstrings[i] == NULL) {
255 name = PyString_InternFromString(whatnames[i]);
256 if (name == NULL)
257 return -1;
258 whatstrings[i] = name;
259 }
260 }
261 return 0;
262}
263
264
265static PyObject *
266call_trampoline(PyThreadState *tstate, PyObject* callback,
267 PyFrameObject *frame, int what, PyObject *arg)
268{
269 PyObject *args = PyTuple_New(3);
270 PyObject *whatstr;
271 PyObject *result;
272
273 if (args == NULL)
274 return NULL;
275 Py_INCREF(frame);
276 whatstr = whatstrings[what];
277 Py_INCREF(whatstr);
278 if (arg == NULL)
279 arg = Py_None;
280 Py_INCREF(arg);
281 PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
282 PyTuple_SET_ITEM(args, 1, whatstr);
283 PyTuple_SET_ITEM(args, 2, arg);
284
285 /* call the Python-level function */
286 PyFrame_FastToLocals(frame);
287 result = PyEval_CallObject(callback, args);
288 PyFrame_LocalsToFast(frame, 1);
289 if (result == NULL)
290 PyTraceBack_Here(frame);
291
292 /* cleanup */
293 Py_DECREF(args);
294 return result;
295}
296
297static int
298profile_trampoline(PyObject *self, PyFrameObject *frame,
299 int what, PyObject *arg)
300{
301 PyThreadState *tstate = frame->f_tstate;
302 PyObject *result;
303
Fred Drake8f51f542001-10-04 14:48:42 +0000304 if (arg == NULL)
305 arg = Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000306 result = call_trampoline(tstate, self, frame, what, arg);
307 if (result == NULL) {
308 PyEval_SetProfile(NULL, NULL);
309 return -1;
310 }
311 Py_DECREF(result);
312 return 0;
313}
314
315static int
316trace_trampoline(PyObject *self, PyFrameObject *frame,
317 int what, PyObject *arg)
318{
319 PyThreadState *tstate = frame->f_tstate;
320 PyObject *callback;
321 PyObject *result;
322
323 if (what == PyTrace_CALL)
324 callback = self;
325 else
326 callback = frame->f_trace;
327 if (callback == NULL)
328 return 0;
329 result = call_trampoline(tstate, callback, frame, what, arg);
330 if (result == NULL) {
331 PyEval_SetTrace(NULL, NULL);
332 Py_XDECREF(frame->f_trace);
333 frame->f_trace = NULL;
334 return -1;
335 }
336 if (result != Py_None) {
337 PyObject *temp = frame->f_trace;
338 frame->f_trace = NULL;
339 Py_XDECREF(temp);
340 frame->f_trace = result;
341 }
342 else {
343 Py_DECREF(result);
344 }
345 return 0;
346}
Fred Draked0838392001-06-16 21:02:31 +0000347
Fred Drake8b4d01d2000-05-09 19:57:01 +0000348static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000349sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000350{
Fred Drake5755ce62001-06-27 19:19:46 +0000351 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000352 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000353 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000354 PyEval_SetTrace(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000355 else
Fred Drake5755ce62001-06-27 19:19:46 +0000356 PyEval_SetTrace(trace_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000357 Py_INCREF(Py_None);
358 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000359}
360
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000361PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000362"settrace(function)\n\
363\n\
364Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000365function call. See the debugger chapter in the library manual."
366);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000367
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000368static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000369sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000370{
Fred Drake5755ce62001-06-27 19:19:46 +0000371 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000372 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000373 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000374 PyEval_SetProfile(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000375 else
Fred Drake5755ce62001-06-27 19:19:46 +0000376 PyEval_SetProfile(profile_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000377 Py_INCREF(Py_None);
378 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000379}
380
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000381PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000382"setprofile(function)\n\
383\n\
384Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000385and return. See the profiler chapter in the library manual."
386);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000387
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000388static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389sys_setcheckinterval(PyObject *self, PyObject *args)
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000390{
Skip Montanarod581d772002-09-03 20:10:45 +0000391 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000392 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000393 Py_INCREF(Py_None);
394 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000395}
396
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000397PyDoc_STRVAR(setcheckinterval_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000398"setcheckinterval(n)\n\
399\n\
400Tell the Python interpreter to check for asynchronous events every\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000401n instructions. This also affects how often thread switches occur."
402);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000403
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000404static PyObject *
405sys_setrecursionlimit(PyObject *self, PyObject *args)
406{
407 int new_limit;
408 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
409 return NULL;
410 if (new_limit <= 0) {
411 PyErr_SetString(PyExc_ValueError,
412 "recursion limit must be positive");
413 return NULL;
414 }
415 Py_SetRecursionLimit(new_limit);
416 Py_INCREF(Py_None);
417 return Py_None;
418}
419
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000420PyDoc_STRVAR(setrecursionlimit_doc,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000421"setrecursionlimit(n)\n\
422\n\
423Set the maximum depth of the Python interpreter stack to n. This\n\
424limit prevents infinite recursion from causing an overflow of the C\n\
425stack and crashing Python. The highest possible limit is platform-\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000426dependent."
427);
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000428
429static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000430sys_getrecursionlimit(PyObject *self)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000431{
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000432 return PyInt_FromLong(Py_GetRecursionLimit());
433}
434
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000435PyDoc_STRVAR(getrecursionlimit_doc,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000436"getrecursionlimit()\n\
437\n\
438Return the current value of the recursion limit, the maximum depth\n\
439of the Python interpreter stack. This limit prevents infinite\n\
Jack Jansene739a0d2002-06-26 20:39:20 +0000440recursion from causing an overflow of the C stack and crashing Python."
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000441);
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000442
Mark Hammond8696ebc2002-10-08 02:44:31 +0000443#ifdef MS_WINDOWS
444PyDoc_STRVAR(getwindowsversion_doc,
445"getwindowsversion()\n\
446\n\
447Return information about the running version of Windows.\n\
448The result is a tuple of (major, minor, build, platform, text)\n\
449All elements are numbers, except text which is a string.\n\
450Platform may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP\n\
451"
452);
453
454static PyObject *
455sys_getwindowsversion(PyObject *self)
456{
457 OSVERSIONINFO ver;
458 ver.dwOSVersionInfoSize = sizeof(ver);
459 if (!GetVersionEx(&ver))
460 return PyErr_SetFromWindowsErr(0);
461 return Py_BuildValue("HHHHs",
462 ver.dwMajorVersion,
463 ver.dwMinorVersion,
464 ver.dwBuildNumber,
465 ver.dwPlatformId,
466 ver.szCSDVersion);
467}
468
469#endif /* MS_WINDOWS */
470
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000471#ifdef HAVE_DLOPEN
472static PyObject *
473sys_setdlopenflags(PyObject *self, PyObject *args)
474{
475 int new_val;
476 PyThreadState *tstate = PyThreadState_Get();
477 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
478 return NULL;
479 if (!tstate)
480 return NULL;
481 tstate->interp->dlopenflags = new_val;
482 Py_INCREF(Py_None);
483 return Py_None;
484}
485
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000486PyDoc_STRVAR(setdlopenflags_doc,
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000487"setdlopenflags(n) -> None\n\
488\n\
489Set the flags that will be used for dlopen() calls. Among other\n\
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000490things, this will enable a lazy resolving of symbols when importing\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000491a module, if called as sys.setdlopenflags(0)\n\
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000492To share symbols across extension modules, call as\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000493sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)"
494);
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000495
496static PyObject *
497sys_getdlopenflags(PyObject *self, PyObject *args)
498{
499 PyThreadState *tstate = PyThreadState_Get();
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000500 if (!tstate)
501 return NULL;
502 return PyInt_FromLong(tstate->interp->dlopenflags);
503}
504
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000505PyDoc_STRVAR(getdlopenflags_doc,
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000506"getdlopenflags() -> int\n\
507\n\
508Return the current value of the flags that are used for dlopen()\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000509calls. The flag constants are defined in the dl module."
510);
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000511#endif
512
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000513#ifdef USE_MALLOPT
514/* Link with -lmalloc (or -lmpc) on an SGI */
515#include <malloc.h>
516
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000517static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000518sys_mdebug(PyObject *self, PyObject *args)
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000519{
520 int flag;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000521 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000522 return NULL;
523 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000524 Py_INCREF(Py_None);
525 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000526}
527#endif /* USE_MALLOPT */
528
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000529static PyObject *
Fred Drakea7688822001-10-24 20:47:48 +0000530sys_getrefcount(PyObject *self, PyObject *arg)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000531{
Mark Hammond440d8982000-06-20 08:12:48 +0000532 return PyInt_FromLong(arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000533}
534
Tim Peters4be93d02002-07-07 19:59:50 +0000535#ifdef Py_REF_DEBUG
Mark Hammond440d8982000-06-20 08:12:48 +0000536static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000537sys_gettotalrefcount(PyObject *self)
Mark Hammond440d8982000-06-20 08:12:48 +0000538{
Mark Hammond440d8982000-06-20 08:12:48 +0000539 return PyInt_FromLong(_Py_RefTotal);
540}
541
542#endif /* Py_TRACE_REFS */
543
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000544PyDoc_STRVAR(getrefcount_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000545"getrefcount(object) -> integer\n\
546\n\
Fred Drakeba3ff1b2002-06-20 21:36:19 +0000547Return the reference count of object. The count returned is generally\n\
548one higher than you might expect, because it includes the (temporary)\n\
549reference as an argument to getrefcount()."
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000550);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000551
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000552#ifdef COUNT_ALLOCS
553static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000554sys_getcounts(PyObject *self)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000555{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000556 extern PyObject *get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000557
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000558 return get_counts();
559}
560#endif
561
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000562PyDoc_STRVAR(getframe_doc,
Barry Warsawb6a54d22000-12-06 21:47:46 +0000563"_getframe([depth]) -> frameobject\n\
564\n\
565Return a frame object from the call stack. If optional integer depth is\n\
566given, return the frame object that many calls below the top of the stack.\n\
567If that is deeper than the call stack, ValueError is raised. The default\n\
568for depth is zero, returning the frame at the top of the call stack.\n\
569\n\
570This function should be used for internal and specialized\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000571purposes only."
572);
Barry Warsawb6a54d22000-12-06 21:47:46 +0000573
574static PyObject *
575sys_getframe(PyObject *self, PyObject *args)
576{
577 PyFrameObject *f = PyThreadState_Get()->frame;
578 int depth = -1;
579
580 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
581 return NULL;
582
583 while (depth > 0 && f != NULL) {
584 f = f->f_back;
585 --depth;
586 }
587 if (f == NULL) {
588 PyErr_SetString(PyExc_ValueError,
589 "call stack is not deep enough");
590 return NULL;
591 }
592 Py_INCREF(f);
593 return (PyObject*)f;
594}
595
Jeremy Hylton985eba52003-02-05 23:13:00 +0000596PyDoc_STRVAR(callstats_doc,
597"callstats() -> tuple of integers\n\
598\n\
599Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
600when Python was built. Otherwise, return None.\n\
601\n\
602When enabled, this function returns detailed, implementation-specific\n\
603details about the number of function calls executed. The return value is\n\
604a 11-tuple where the entries in the tuple are counts of:\n\
6050. all function calls\n\
6061. calls to PyFunction_Type objects\n\
6072. PyFunction calls that do not create an argument tuple\n\
6083. PyFunction calls that do not create an argument tuple\n\
609 and bypass PyEval_EvalCodeEx()\n\
6104. PyMethod calls\n\
6115. PyMethod calls on bound methods\n\
6126. PyType calls\n\
6137. PyCFunction calls\n\
6148. generator calls\n\
6159. All other calls\n\
61610. Number of stack pops performed by call_function()"
617);
Barry Warsawb6a54d22000-12-06 21:47:46 +0000618
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000619#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000620/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000621extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000622#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000623
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000624#ifdef DYNAMIC_EXECUTION_PROFILE
625/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000626extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000627#endif
628
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000629static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000630 /* Might as well keep this in alphabetic order */
Jeremy Hylton985eba52003-02-05 23:13:00 +0000631 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
632 callstats_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000633 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000634 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc},
635 {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000636 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
Neal Norwitz0c766a02002-03-27 13:03:09 +0000637 {"exit", sys_exit, METH_VARARGS, exit_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000638#ifdef Py_USING_UNICODE
Jeremy Hylton985eba52003-02-05 23:13:00 +0000639 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
640 METH_NOARGS, getdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000641#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000642#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000643 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
644 getdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000645#endif
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000646#ifdef COUNT_ALLOCS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000647 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000648#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000649#ifdef DYNAMIC_EXECUTION_PROFILE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000650 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000651#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000652#ifdef Py_TRACE_REFS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000653 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +0000654#endif
655#ifdef Py_REF_DEBUG
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000656 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000657#endif
Fred Drakea7688822001-10-24 20:47:48 +0000658 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000659 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000660 getrecursionlimit_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000661 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
Mark Hammond8696ebc2002-10-08 02:44:31 +0000662#ifdef MS_WINDOWS
663 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
664 getwindowsversion_doc},
665#endif /* MS_WINDOWS */
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000666#ifdef USE_MALLOPT
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000667 {"mdebug", sys_mdebug, METH_VARARGS},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000668#endif
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000669#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000670 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000671 setdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000672#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000673 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000674 setcheckinterval_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000675#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000676 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
677 setdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000678#endif
Neal Norwitz290d31e2002-03-03 15:12:58 +0000679 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000680 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000681 setrecursionlimit_doc},
Neal Norwitz290d31e2002-03-03 15:12:58 +0000682 {"settrace", sys_settrace, METH_O, settrace_doc},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 {NULL, NULL} /* sentinel */
684};
685
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000686static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +0000688{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000689 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000690 int i;
691 if (list == NULL)
692 return NULL;
Guido van Rossum25c649f1997-11-04 17:04:34 +0000693 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000694 PyObject *name = PyString_FromString(
Guido van Rossum25c649f1997-11-04 17:04:34 +0000695 PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000696 if (name == NULL)
697 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000698 PyList_Append(list, name);
699 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000700 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000701 if (PyList_Sort(list) != 0) {
702 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000703 list = NULL;
704 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000705 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000706 PyObject *v = PyList_AsTuple(list);
707 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000708 list = v;
709 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000710 return list;
711}
712
Guido van Rossum23fff912000-12-15 22:02:05 +0000713static PyObject *warnoptions = NULL;
714
715void
716PySys_ResetWarnOptions(void)
717{
718 if (warnoptions == NULL || !PyList_Check(warnoptions))
719 return;
720 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
721}
722
723void
724PySys_AddWarnOption(char *s)
725{
726 PyObject *str;
727
728 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
729 Py_XDECREF(warnoptions);
730 warnoptions = PyList_New(0);
731 if (warnoptions == NULL)
732 return;
733 }
734 str = PyString_FromString(s);
735 if (str != NULL) {
736 PyList_Append(warnoptions, str);
737 Py_DECREF(str);
738 }
739}
740
Guido van Rossum40552d01998-08-06 03:34:39 +0000741/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
742 Two literals concatenated works just fine. If you have a K&R compiler
743 or other abomination that however *does* understand longer strings,
744 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000745PyDoc_VAR(sys_doc) =
746PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000747"This module provides access to some objects used or maintained by the\n\
748interpreter and to functions that interact strongly with the interpreter.\n\
749\n\
750Dynamic objects:\n\
751\n\
752argv -- command line arguments; argv[0] is the script pathname if known\n\
753path -- module search path; path[0] is the script directory, else ''\n\
754modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000755\n\
756displayhook -- called to show results in an interactive session\n\
757excepthook -- called to handle any uncaught exception other than SystemExit\n\
758 To customize printing in an interactive session or to install a custom\n\
759 top-level exception handler, assign other functions to replace these.\n\
760\n\
761exitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
762 Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000763\n\
764stdin -- standard input file object; used by raw_input() and input()\n\
765stdout -- standard output file object; used by the print statement\n\
766stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000767 By assigning other file objects (or objects that behave like files)\n\
768 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000769\n\
770last_type -- type of last uncaught exception\n\
771last_value -- value of last uncaught exception\n\
772last_traceback -- traceback of last uncaught exception\n\
773 These three are only available in an interactive session after a\n\
774 traceback has been printed.\n\
775\n\
776exc_type -- type of exception currently being handled\n\
777exc_value -- value of exception currently being handled\n\
778exc_traceback -- traceback of exception currently being handled\n\
779 The function exc_info() should be used instead of these three,\n\
780 because it is thread-safe.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000781"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000782)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000783/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000784PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000785"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000786Static objects:\n\
787\n\
788maxint -- the largest supported integer (the smallest is -maxint-1)\n\
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000789maxunicode -- the largest supported character\n\
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000790builtin_module_names -- tuple of module names built into this interpreter\n\
Fred Drake801c08d2000-04-13 15:29:10 +0000791version -- the version of this interpreter as a string\n\
792version_info -- version information as a tuple\n\
793hexversion -- version information encoded as a single integer\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000794copyright -- copyright notice pertaining to this interpreter\n\
795platform -- platform identifier\n\
796executable -- pathname of this Python interpreter\n\
797prefix -- prefix used to find the Python library\n\
798exec_prefix -- prefix used to find the machine-specific Python library\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000799"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000800)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000801#ifdef MS_WINDOWS
802/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000803PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000804"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000805winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000806"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000807)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000808#endif /* MS_WINDOWS */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000809PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000810"__stdin__ -- the original stdin; don't touch!\n\
811__stdout__ -- the original stdout; don't touch!\n\
812__stderr__ -- the original stderr; don't touch!\n\
813__displayhook__ -- the original displayhook; don't touch!\n\
814__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000815\n\
816Functions:\n\
817\n\
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000818displayhook() -- print an object to the screen, and save it in __builtin__._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000819excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000820exc_info() -- return thread-safe information about the current exception\n\
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000821exc_clear() -- clear the exception state for the current thread\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000822exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000823getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000824getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000825getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000826setcheckinterval() -- control how often the interpreter checks for events\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000827setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000828setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000829setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000830settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +0000831"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000832)
Fred Drakeccede592000-08-14 20:59:57 +0000833/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000834
Guido van Rossum25ce5661997-08-02 03:10:38 +0000835PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000836_PySys_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000838 PyObject *m, *v, *sysdict;
839 PyObject *sysin, *sysout, *syserr;
Fred Drake6d27c1e2000-04-13 20:03:20 +0000840 char *s;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000841
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000842 m = Py_InitModule3("sys", sys_methods, sys_doc);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000843 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000844
845 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
846 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
847 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000848 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000849 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000850 PyDict_SetItemString(sysdict, "stdin", sysin);
851 PyDict_SetItemString(sysdict, "stdout", sysout);
852 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossumbd36dba1998-02-19 20:53:06 +0000853 /* Make backup copies for cleanup */
854 PyDict_SetItemString(sysdict, "__stdin__", sysin);
855 PyDict_SetItemString(sysdict, "__stdout__", sysout);
856 PyDict_SetItemString(sysdict, "__stderr__", syserr);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000857 PyDict_SetItemString(sysdict, "__displayhook__",
858 PyDict_GetItemString(sysdict, "displayhook"));
859 PyDict_SetItemString(sysdict, "__excepthook__",
860 PyDict_GetItemString(sysdict, "excepthook"));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000861 Py_XDECREF(sysin);
862 Py_XDECREF(sysout);
863 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000864 PyDict_SetItemString(sysdict, "version",
865 v = PyString_FromString(Py_GetVersion()));
Barry Warsaw54892c41999-01-27 16:33:19 +0000866 Py_XDECREF(v);
Guido van Rossume0d7dae1999-01-03 12:55:39 +0000867 PyDict_SetItemString(sysdict, "hexversion",
868 v = PyInt_FromLong(PY_VERSION_HEX));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000869 Py_XDECREF(v);
Fred Drake93a20bf2000-04-13 17:44:51 +0000870 /*
871 * These release level checks are mutually exclusive and cover
872 * the field, so don't get too fancy with the pre-processor!
873 */
874#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000875 s = "alpha";
Fred Drake592f2d62000-08-31 15:21:11 +0000876#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000877 s = "beta";
Fred Drake592f2d62000-08-31 15:21:11 +0000878#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000879 s = "candidate";
Fred Drake592f2d62000-08-31 15:21:11 +0000880#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Fred Drake6d27c1e2000-04-13 20:03:20 +0000881 s = "final";
Fred Drake93a20bf2000-04-13 17:44:51 +0000882#endif
Fred Drake801c08d2000-04-13 15:29:10 +0000883 PyDict_SetItemString(sysdict, "version_info",
Fred Drake6d27c1e2000-04-13 20:03:20 +0000884 v = Py_BuildValue("iiisi", PY_MAJOR_VERSION,
Fred Drake801c08d2000-04-13 15:29:10 +0000885 PY_MINOR_VERSION,
Fred Drake6d27c1e2000-04-13 20:03:20 +0000886 PY_MICRO_VERSION, s,
Fred Drake93a20bf2000-04-13 17:44:51 +0000887 PY_RELEASE_SERIAL));
Fred Drake801c08d2000-04-13 15:29:10 +0000888 Py_XDECREF(v);
Skip Montanaro8e790e72002-09-03 13:25:17 +0000889 PyDict_SetItemString(sysdict, "api_version",
890 v = PyInt_FromLong(PYTHON_API_VERSION));
891 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000892 PyDict_SetItemString(sysdict, "copyright",
893 v = PyString_FromString(Py_GetCopyright()));
894 Py_XDECREF(v);
895 PyDict_SetItemString(sysdict, "platform",
896 v = PyString_FromString(Py_GetPlatform()));
897 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000898 PyDict_SetItemString(sysdict, "executable",
899 v = PyString_FromString(Py_GetProgramFullPath()));
900 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000901 PyDict_SetItemString(sysdict, "prefix",
902 v = PyString_FromString(Py_GetPrefix()));
903 Py_XDECREF(v);
904 PyDict_SetItemString(sysdict, "exec_prefix",
905 v = PyString_FromString(Py_GetExecPrefix()));
906 Py_XDECREF(v);
907 PyDict_SetItemString(sysdict, "maxint",
908 v = PyInt_FromLong(PyInt_GetMax()));
909 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000910#ifdef Py_USING_UNICODE
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000911 PyDict_SetItemString(sysdict, "maxunicode",
912 v = PyInt_FromLong(PyUnicode_GetMax()));
913 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000914#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000915 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000917 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000918 {
919 /* Assumes that longs are at least 2 bytes long.
920 Should be safe! */
921 unsigned long number = 1;
Fred Drakea2b6ad62000-08-15 04:24:43 +0000922 char *value;
Fred Drake099325e2000-08-14 15:47:03 +0000923
924 s = (char *) &number;
925 if (s[0] == 0)
Fred Drakea2b6ad62000-08-15 04:24:43 +0000926 value = "big";
Fred Drake099325e2000-08-14 15:47:03 +0000927 else
Fred Drakea2b6ad62000-08-15 04:24:43 +0000928 value = "little";
929 PyDict_SetItemString(sysdict, "byteorder",
Barry Warsawf2581c92000-08-16 23:03:57 +0000930 v = PyString_FromString(value));
931 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000932 }
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000933#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000934 PyDict_SetItemString(sysdict, "dllhandle",
Guido van Rossum582acec2000-06-28 22:07:35 +0000935 v = PyLong_FromVoidPtr(PyWin_DLLhModule));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000936 Py_XDECREF(v);
937 PyDict_SetItemString(sysdict, "winver",
Guido van Rossum6c1e5f21997-09-29 23:34:23 +0000938 v = PyString_FromString(PyWin_DLLVersionString));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000939 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000940#endif
Guido van Rossum23fff912000-12-15 22:02:05 +0000941 if (warnoptions == NULL) {
942 warnoptions = PyList_New(0);
943 }
944 else {
945 Py_INCREF(warnoptions);
946 }
947 if (warnoptions != NULL) {
Guido van Rossum03df3b32001-01-13 22:06:05 +0000948 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
Guido van Rossum23fff912000-12-15 22:02:05 +0000949 }
950
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000951 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000952 return NULL;
953 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000954}
955
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000956static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000957makepathobject(char *path, int delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000958{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 int i, n;
960 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000961 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962
963 n = 1;
964 p = path;
965 while ((p = strchr(p, delim)) != NULL) {
966 n++;
967 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000968 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000969 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000970 if (v == NULL)
971 return NULL;
972 for (i = 0; ; i++) {
973 p = strchr(path, delim);
974 if (p == NULL)
975 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000976 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000977 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000978 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000979 return NULL;
980 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000981 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982 if (*p == '\0')
983 break;
984 path = p+1;
985 }
986 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000987}
988
989void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990PySys_SetPath(char *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000991{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000992 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000993 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000994 Py_FatalError("can't create sys.path");
995 if (PySys_SetObject("path", v) != 0)
996 Py_FatalError("can't assign sys.path");
997 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000998}
999
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001000static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001001makeargvobject(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001002{
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001003 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +00001004 if (argc <= 0 || argv == NULL) {
1005 /* Ensure at least one (empty) argument is seen */
1006 static char *empty_argv[1] = {""};
1007 argv = empty_argv;
1008 argc = 1;
1009 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001010 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001011 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001012 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001013 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001014 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001015 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001016 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017 av = NULL;
1018 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001019 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001020 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001021 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001022 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001023 return av;
1024}
1025
1026void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001027PySys_SetArgv(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001028{
Guido van Rossum162e38c2003-02-19 15:25:10 +00001029#if defined(HAVE_REALPATH)
1030 char fullpath[MAXPATHLEN];
1031#elif defined(MS_WINDOWS)
Thomas Heller27bb71e2003-01-08 14:33:48 +00001032 char fullpath[MAX_PATH];
1033#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001034 PyObject *av = makeargvobject(argc, argv);
1035 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001036 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001037 Py_FatalError("no mem for sys.argv");
1038 if (PySys_SetObject("argv", av) != 0)
1039 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +00001040 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +00001041 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +00001042 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +00001043 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001044 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +00001045#ifdef HAVE_READLINK
1046 char link[MAXPATHLEN+1];
1047 char argv0copy[2*MAXPATHLEN+1];
1048 int nr = 0;
1049 if (argc > 0 && argv0 != NULL)
1050 nr = readlink(argv0, link, MAXPATHLEN);
1051 if (nr > 0) {
1052 /* It's a symlink */
1053 link[nr] = '\0';
1054 if (link[0] == SEP)
1055 argv0 = link; /* Link to absolute path */
1056 else if (strchr(link, SEP) == NULL)
1057 ; /* Link without path */
1058 else {
1059 /* Must join(dirname(argv0), link) */
1060 char *q = strrchr(argv0, SEP);
1061 if (q == NULL)
1062 argv0 = link; /* argv0 without path */
1063 else {
1064 /* Must make a copy */
1065 strcpy(argv0copy, argv0);
1066 q = strrchr(argv0copy, SEP);
1067 strcpy(q+1, link);
1068 argv0 = argv0copy;
1069 }
1070 }
1071 }
1072#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +00001073#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +00001074 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +00001075 char *q;
Thomas Heller27bb71e2003-01-08 14:33:48 +00001076#ifdef MS_WINDOWS
1077 char *ptemp;
1078 if (GetFullPathName(argv0,
1079 sizeof(fullpath),
1080 fullpath,
1081 &ptemp)) {
1082 argv0 = fullpath;
1083 }
1084#endif
Guido van Rossumc474dea1997-04-25 15:38:31 +00001085 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +00001086 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +00001087 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +00001088 if (q != NULL)
1089 p = q;
1090 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +00001091 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +00001092 if (n > 1 && p[-1] != ':')
1093 n--; /* Drop trailing separator */
1094 }
1095 }
1096#else /* All other filename syntaxes */
Guido van Rossum162e38c2003-02-19 15:25:10 +00001097 if (argc > 0 && argv0 != NULL) {
1098#if defined(HAVE_REALPATH)
1099 if (realpath(argv0, fullpath)) {
1100 argv0 = fullpath;
1101 }
1102#endif
Guido van Rossumc474dea1997-04-25 15:38:31 +00001103 p = strrchr(argv0, SEP);
Guido van Rossum162e38c2003-02-19 15:25:10 +00001104 }
Guido van Rossumcc883411996-09-10 14:44:21 +00001105 if (p != NULL) {
Guido van Rossumbceccf52001-04-10 22:07:43 +00001106#ifndef RISCOS
Guido van Rossumc474dea1997-04-25 15:38:31 +00001107 n = p + 1 - argv0;
Guido van Rossumbceccf52001-04-10 22:07:43 +00001108#else /* don't include trailing separator */
1109 n = p - argv0;
1110#endif /* RISCOS */
Guido van Rossumcc883411996-09-10 14:44:21 +00001111#if SEP == '/' /* Special case for Unix filename syntax */
1112 if (n > 1)
1113 n--; /* Drop trailing separator */
1114#endif /* Unix */
1115 }
1116#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001117 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +00001118 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001119 Py_FatalError("no mem for sys.path insertion");
1120 if (PyList_Insert(path, 0, a) < 0)
1121 Py_FatalError("sys.path.insert(0) failed");
1122 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +00001123 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001124 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001125}
Guido van Rossuma890e681998-05-12 14:59:24 +00001126
1127
1128/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1129 Adapted from code submitted by Just van Rossum.
1130
1131 PySys_WriteStdout(format, ...)
1132 PySys_WriteStderr(format, ...)
1133
1134 The first function writes to sys.stdout; the second to sys.stderr. When
1135 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00001136 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00001137
1138 Both take a printf-style format string as their first argument followed
1139 by a variable length argument list determined by the format string.
1140
1141 *** WARNING ***
1142
1143 The format should limit the total size of the formatted output string to
1144 1000 bytes. In particular, this means that no unrestricted "%s" formats
1145 should occur; these should be limited using "%.<N>s where <N> is a
1146 decimal number calculated so that <N> plus the maximum size of other
1147 formatted text does not exceed 1000 bytes. Also watch out for "%f",
1148 which can print hundreds of digits for very large numbers.
1149
1150 */
1151
1152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001153mywrite(char *name, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00001154{
1155 PyObject *file;
Guido van Rossum8442af31998-10-12 18:22:10 +00001156 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossuma890e681998-05-12 14:59:24 +00001157
Guido van Rossum8442af31998-10-12 18:22:10 +00001158 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001159 file = PySys_GetObject(name);
1160 if (file == NULL || PyFile_AsFile(file) == fp)
1161 vfprintf(fp, format, va);
1162 else {
1163 char buffer[1001];
Tim Peters080d5b32001-12-02 08:29:16 +00001164 const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
1165 format, va);
Guido van Rossuma890e681998-05-12 14:59:24 +00001166 if (PyFile_WriteString(buffer, file) != 0) {
1167 PyErr_Clear();
1168 fputs(buffer, fp);
1169 }
Tim Petersfaad5ad2001-12-03 00:43:33 +00001170 if (written < 0 || written >= sizeof(buffer)) {
Jeremy Hylton5d3d1342001-11-28 21:44:53 +00001171 const char *truncated = "... truncated";
1172 if (PyFile_WriteString(truncated, file) != 0) {
1173 PyErr_Clear();
1174 fputs(truncated, fp);
1175 }
1176 }
Guido van Rossuma890e681998-05-12 14:59:24 +00001177 }
Guido van Rossum8442af31998-10-12 18:22:10 +00001178 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001179}
1180
1181void
Guido van Rossuma890e681998-05-12 14:59:24 +00001182PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001183{
1184 va_list va;
1185
Guido van Rossuma890e681998-05-12 14:59:24 +00001186 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001187 mywrite("stdout", stdout, format, va);
1188 va_end(va);
1189}
1190
1191void
Guido van Rossuma890e681998-05-12 14:59:24 +00001192PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001193{
1194 va_list va;
1195
Guido van Rossuma890e681998-05-12 14:59:24 +00001196 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001197 mywrite("stderr", stderr, format, va);
1198 va_end(va);
1199}