blob: 82d29997cb0ab36a81240a4b1499befd53bf563c [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
Guido van Rossum1254d791997-05-20 15:57:25 +000023#ifdef HAVE_UNISTD_H
Guido van Rossumc474dea1997-04-25 15:38:31 +000024#include <unistd.h>
25#endif
26
Guido van Rossum9b38a141996-09-11 23:12:24 +000027#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000028extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000029/* A string loaded from the DLL at startup: */
30extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000031#endif
32
Guido van Rossum65bf9f21997-04-29 18:33:38 +000033PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000034PySys_GetObject(char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035{
Guido van Rossum25ce5661997-08-02 03:10:38 +000036 PyThreadState *tstate = PyThreadState_Get();
37 PyObject *sd = tstate->interp->sysdict;
Guido van Rossumbe203361999-10-05 22:17:41 +000038 if (sd == NULL)
39 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000040 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041}
42
43FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000044PySys_GetFile(char *name, FILE *def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045{
46 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000047 PyObject *v = PySys_GetObject(name);
48 if (v != NULL && PyFile_Check(v))
49 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 if (fp == NULL)
51 fp = def;
52 return fp;
53}
54
55int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000056PySys_SetObject(char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossum25ce5661997-08-02 03:10:38 +000058 PyThreadState *tstate = PyThreadState_Get();
59 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000060 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000061 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000062 return 0;
63 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000064 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000065 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000067 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068}
69
Guido van Rossum65bf9f21997-04-29 18:33:38 +000070static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000071sys_displayhook(PyObject *self, PyObject *o)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000072{
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000073 PyObject *outf;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000074 PyInterpreterState *interp = PyThreadState_Get()->interp;
75 PyObject *modules = interp->modules;
76 PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
77
Moshe Zadka03897ea2001-07-23 13:32:43 +000078 if (builtins == NULL) {
79 PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
80 return NULL;
81 }
82
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000083 /* 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 if (Py_FlushLine() != 0)
93 return NULL;
Greg Steinceb9b7c2001-01-11 09:27:34 +000094 outf = PySys_GetObject("stdout");
95 if (outf == NULL) {
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000096 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
97 return NULL;
98 }
Greg Steinceb9b7c2001-01-11 09:27:34 +000099 if (PyFile_WriteObject(o, outf, 0) != 0)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000100 return NULL;
Greg Steinceb9b7c2001-01-11 09:27:34 +0000101 PyFile_SoftSpace(outf, 1);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000102 if (Py_FlushLine() != 0)
103 return NULL;
104 if (PyObject_SetAttrString(builtins, "_", o) != 0)
105 return NULL;
106 Py_INCREF(Py_None);
107 return Py_None;
108}
109
110static char displayhook_doc[] =
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000111"displayhook(object) -> None\n"
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000112"\n"
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000113"Print an object to sys.stdout and also save it in __builtin__._\n";
114
115static PyObject *
116sys_excepthook(PyObject* self, PyObject* args)
117{
118 PyObject *exc, *value, *tb;
119 if (!PyArg_ParseTuple(args, "OOO:excepthook", &exc, &value, &tb))
120 return NULL;
121 PyErr_Display(exc, value, tb);
122 Py_INCREF(Py_None);
123 return Py_None;
124}
125
126static char excepthook_doc[] =
127"excepthook(exctype, value, traceback) -> None\n"
128"\n"
129"Handle an exception by displaying it with a traceback on sys.stderr.\n";
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000130
131static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000132sys_exc_info(PyObject *self)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133{
134 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135 tstate = PyThreadState_Get();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136 return Py_BuildValue(
137 "(OOO)",
138 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
139 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
140 tstate->exc_traceback != NULL ?
141 tstate->exc_traceback : Py_None);
142}
143
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000144static char exc_info_doc[] =
145"exc_info() -> (type, value, traceback)\n\
146\n\
147Return information about the exception that is currently being handled.\n\
148This should be called from inside an except clause only.";
149
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151sys_exit(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000153 /* Raise SystemExit so callers may catch it or clean up. */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000154 PyErr_SetObject(PyExc_SystemExit, args);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000155 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156}
157
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000158static char exit_doc[] =
159"exit([status])\n\
160\n\
161Exit the interpreter by raising SystemExit(status).\n\
162If the status is omitted or None, it defaults to zero (i.e., success).\n\
163If the status numeric, it will be used as the system exit status.\n\
164If it is another kind of object, it will be printed and the system\n\
165exit status will be one (i.e., failure).";
166
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000167static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000168sys_getdefaultencoding(PyObject *self)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000169{
Fred Drake8b4d01d2000-05-09 19:57:01 +0000170 return PyString_FromString(PyUnicode_GetDefaultEncoding());
171}
172
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000173static char getdefaultencoding_doc[] =
174"getdefaultencoding() -> string\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000175\n\
176Return the current default string encoding used by the Unicode \n\
177implementation.";
178
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000179#ifdef Py_USING_UNICODE
180
Fred Drake8b4d01d2000-05-09 19:57:01 +0000181static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000182sys_setdefaultencoding(PyObject *self, PyObject *args)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000183{
184 char *encoding;
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000185 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
Fred Drake8b4d01d2000-05-09 19:57:01 +0000186 return NULL;
187 if (PyUnicode_SetDefaultEncoding(encoding))
188 return NULL;
189 Py_INCREF(Py_None);
190 return Py_None;
191}
192
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000193static char setdefaultencoding_doc[] =
194"setdefaultencoding(encoding)\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000195\n\
196Set the current default string encoding used by the Unicode implementation.";
197
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000198#endif
199
Fred Drake5755ce62001-06-27 19:19:46 +0000200/*
201 * Cached interned string objects used for calling the profile and
202 * trace functions. Initialized by trace_init().
203 */
204static PyObject *whatstrings[4] = {NULL, NULL, NULL, NULL};
205
206static int
207trace_init(void)
208{
209 static char *whatnames[4] = {"call", "exception", "line", "return"};
210 PyObject *name;
211 int i;
212 for (i = 0; i < 4; ++i) {
213 if (whatstrings[i] == NULL) {
214 name = PyString_InternFromString(whatnames[i]);
215 if (name == NULL)
216 return -1;
217 whatstrings[i] = name;
218 }
219 }
220 return 0;
221}
222
223
224static PyObject *
225call_trampoline(PyThreadState *tstate, PyObject* callback,
226 PyFrameObject *frame, int what, PyObject *arg)
227{
228 PyObject *args = PyTuple_New(3);
229 PyObject *whatstr;
230 PyObject *result;
231
232 if (args == NULL)
233 return NULL;
234 Py_INCREF(frame);
235 whatstr = whatstrings[what];
236 Py_INCREF(whatstr);
237 if (arg == NULL)
238 arg = Py_None;
239 Py_INCREF(arg);
240 PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
241 PyTuple_SET_ITEM(args, 1, whatstr);
242 PyTuple_SET_ITEM(args, 2, arg);
243
244 /* call the Python-level function */
245 PyFrame_FastToLocals(frame);
246 result = PyEval_CallObject(callback, args);
247 PyFrame_LocalsToFast(frame, 1);
248 if (result == NULL)
249 PyTraceBack_Here(frame);
250
251 /* cleanup */
252 Py_DECREF(args);
253 return result;
254}
255
256static int
257profile_trampoline(PyObject *self, PyFrameObject *frame,
258 int what, PyObject *arg)
259{
260 PyThreadState *tstate = frame->f_tstate;
261 PyObject *result;
262
263 result = call_trampoline(tstate, self, frame, what, arg);
264 if (result == NULL) {
265 PyEval_SetProfile(NULL, NULL);
266 return -1;
267 }
268 Py_DECREF(result);
269 return 0;
270}
271
272static int
273trace_trampoline(PyObject *self, PyFrameObject *frame,
274 int what, PyObject *arg)
275{
276 PyThreadState *tstate = frame->f_tstate;
277 PyObject *callback;
278 PyObject *result;
279
280 if (what == PyTrace_CALL)
281 callback = self;
282 else
283 callback = frame->f_trace;
284 if (callback == NULL)
285 return 0;
286 result = call_trampoline(tstate, callback, frame, what, arg);
287 if (result == NULL) {
288 PyEval_SetTrace(NULL, NULL);
289 Py_XDECREF(frame->f_trace);
290 frame->f_trace = NULL;
291 return -1;
292 }
293 if (result != Py_None) {
294 PyObject *temp = frame->f_trace;
295 frame->f_trace = NULL;
296 Py_XDECREF(temp);
297 frame->f_trace = result;
298 }
299 else {
300 Py_DECREF(result);
301 }
302 return 0;
303}
Fred Draked0838392001-06-16 21:02:31 +0000304
Fred Drake8b4d01d2000-05-09 19:57:01 +0000305static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000306sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000307{
Fred Drake5755ce62001-06-27 19:19:46 +0000308 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000309 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000310 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000311 PyEval_SetTrace(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000312 else
Fred Drake5755ce62001-06-27 19:19:46 +0000313 PyEval_SetTrace(trace_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000314 Py_INCREF(Py_None);
315 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000316}
317
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000318static char settrace_doc[] =
319"settrace(function)\n\
320\n\
321Set the global debug tracing function. It will be called on each\n\
322function call. See the debugger chapter in the library manual.";
323
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000324static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000325sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000326{
Fred Drake5755ce62001-06-27 19:19:46 +0000327 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000328 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000329 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000330 PyEval_SetProfile(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000331 else
Fred Drake5755ce62001-06-27 19:19:46 +0000332 PyEval_SetProfile(profile_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000333 Py_INCREF(Py_None);
334 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000335}
336
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000337static char setprofile_doc[] =
338"setprofile(function)\n\
339\n\
340Set the profiling function. It will be called on each function call\n\
341and return. See the profiler chapter in the library manual.";
342
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000343static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000344sys_setcheckinterval(PyObject *self, PyObject *args)
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000345{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000346 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum43713e52000-02-29 13:59:29 +0000347 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &tstate->interp->checkinterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000348 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000349 Py_INCREF(Py_None);
350 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000351}
352
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000353static char setcheckinterval_doc[] =
354"setcheckinterval(n)\n\
355\n\
356Tell the Python interpreter to check for asynchronous events every\n\
357n instructions. This also affects how often thread switches occur.";
358
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000359static PyObject *
360sys_setrecursionlimit(PyObject *self, PyObject *args)
361{
362 int new_limit;
363 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
364 return NULL;
365 if (new_limit <= 0) {
366 PyErr_SetString(PyExc_ValueError,
367 "recursion limit must be positive");
368 return NULL;
369 }
370 Py_SetRecursionLimit(new_limit);
371 Py_INCREF(Py_None);
372 return Py_None;
373}
374
375static char setrecursionlimit_doc[] =
376"setrecursionlimit(n)\n\
377\n\
378Set the maximum depth of the Python interpreter stack to n. This\n\
379limit prevents infinite recursion from causing an overflow of the C\n\
380stack and crashing Python. The highest possible limit is platform-\n\
381dependent.";
382
383static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000384sys_getrecursionlimit(PyObject *self)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000385{
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000386 return PyInt_FromLong(Py_GetRecursionLimit());
387}
388
389static char getrecursionlimit_doc[] =
390"getrecursionlimit()\n\
391\n\
392Return the current value of the recursion limit, the maximum depth\n\
393of the Python interpreter stack. This limit prevents infinite\n\
394recursion from causing an overflow of the C stack and crashing Python.";
395
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000396#ifdef HAVE_DLOPEN
397static PyObject *
398sys_setdlopenflags(PyObject *self, PyObject *args)
399{
400 int new_val;
401 PyThreadState *tstate = PyThreadState_Get();
402 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
403 return NULL;
404 if (!tstate)
405 return NULL;
406 tstate->interp->dlopenflags = new_val;
407 Py_INCREF(Py_None);
408 return Py_None;
409}
410
411static char setdlopenflags_doc[] =
412"setdlopenflags(n) -> None\n\
413\n\
414Set the flags that will be used for dlopen() calls. Among other\n\
415things, this will enable a lazy resolving of symbols when imporing\n\
416a module, if called as sys.setdlopenflags(0)\n\
417To share symols across extension modules, call as\n\
418sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)";
419
420static PyObject *
421sys_getdlopenflags(PyObject *self, PyObject *args)
422{
423 PyThreadState *tstate = PyThreadState_Get();
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000424 if (!tstate)
425 return NULL;
426 return PyInt_FromLong(tstate->interp->dlopenflags);
427}
428
429static char getdlopenflags_doc[] =
430"getdlopenflags() -> int\n\
431\n\
432Return the current value of the flags that are used for dlopen()\n\
433calls. The flag constants are defined in the dl module.";
434#endif
435
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000436#ifdef USE_MALLOPT
437/* Link with -lmalloc (or -lmpc) on an SGI */
438#include <malloc.h>
439
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000440static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441sys_mdebug(PyObject *self, PyObject *args)
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000442{
443 int flag;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000444 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000445 return NULL;
446 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000447 Py_INCREF(Py_None);
448 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000449}
450#endif /* USE_MALLOPT */
451
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000452static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453sys_getrefcount(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000454{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000455 PyObject *arg;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000456 if (!PyArg_ParseTuple(args, "O:getrefcount", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000457 return NULL;
Mark Hammond440d8982000-06-20 08:12:48 +0000458 return PyInt_FromLong(arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000459}
460
Mark Hammond440d8982000-06-20 08:12:48 +0000461#ifdef Py_TRACE_REFS
462static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000463sys_gettotalrefcount(PyObject *self)
Mark Hammond440d8982000-06-20 08:12:48 +0000464{
465 extern long _Py_RefTotal;
Mark Hammond440d8982000-06-20 08:12:48 +0000466 return PyInt_FromLong(_Py_RefTotal);
467}
468
469#endif /* Py_TRACE_REFS */
470
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000471static char getrefcount_doc[] =
472"getrefcount(object) -> integer\n\
473\n\
474Return the current reference count for the object. This includes the\n\
475temporary reference in the argument list, so it is at least 2.";
476
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000477#ifdef COUNT_ALLOCS
478static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000479sys_getcounts(PyObject *self)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000480{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000481 extern PyObject *get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000482
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000483 return get_counts();
484}
485#endif
486
Barry Warsawb6a54d22000-12-06 21:47:46 +0000487static char getframe_doc[] =
488"_getframe([depth]) -> frameobject\n\
489\n\
490Return a frame object from the call stack. If optional integer depth is\n\
491given, return the frame object that many calls below the top of the stack.\n\
492If that is deeper than the call stack, ValueError is raised. The default\n\
493for depth is zero, returning the frame at the top of the call stack.\n\
494\n\
495This function should be used for internal and specialized\n\
496purposes only.";
497
498static PyObject *
499sys_getframe(PyObject *self, PyObject *args)
500{
501 PyFrameObject *f = PyThreadState_Get()->frame;
502 int depth = -1;
503
504 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
505 return NULL;
506
507 while (depth > 0 && f != NULL) {
508 f = f->f_back;
509 --depth;
510 }
511 if (f == NULL) {
512 PyErr_SetString(PyExc_ValueError,
513 "call stack is not deep enough");
514 return NULL;
515 }
516 Py_INCREF(f);
517 return (PyObject*)f;
518}
519
520
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000521#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000522/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000524#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000525
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000526#ifdef DYNAMIC_EXECUTION_PROFILE
527/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000528extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000529#endif
530
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000531static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000532 /* Might as well keep this in alphabetic order */
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000533 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
534 {"exc_info", (PyCFunction)sys_exc_info, METH_NOARGS, exc_info_doc},
535 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
536 {"exit", sys_exit, METH_OLDARGS, exit_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000537#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000538 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000539 getdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000540#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000541#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000542 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
543 getdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000544#endif
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000545#ifdef COUNT_ALLOCS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000546 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000547#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000548#ifdef DYNAMIC_EXECUTION_PROFILE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000549 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000550#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000551#ifdef Py_TRACE_REFS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000552 {"getobjects", _Py_GetObjects, METH_VARARGS},
553 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000554#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000555 {"getrefcount", sys_getrefcount, METH_VARARGS, getrefcount_doc},
556 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000557 getrecursionlimit_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000558 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000559#ifdef USE_MALLOPT
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000560 {"mdebug", sys_mdebug, METH_VARARGS},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000561#endif
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000562#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000563 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000564 setdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000565#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000566 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000567 setcheckinterval_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000568#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000569 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
570 setdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000571#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000572 {"setprofile", sys_setprofile, METH_OLDARGS, setprofile_doc},
573 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000574 setrecursionlimit_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000575 {"settrace", sys_settrace, METH_OLDARGS, settrace_doc},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000576 {NULL, NULL} /* sentinel */
577};
578
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000579static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000580list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +0000581{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000582 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000583 int i;
584 if (list == NULL)
585 return NULL;
Guido van Rossum25c649f1997-11-04 17:04:34 +0000586 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000587 PyObject *name = PyString_FromString(
Guido van Rossum25c649f1997-11-04 17:04:34 +0000588 PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000589 if (name == NULL)
590 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000591 PyList_Append(list, name);
592 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000593 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000594 if (PyList_Sort(list) != 0) {
595 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000596 list = NULL;
597 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000598 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000599 PyObject *v = PyList_AsTuple(list);
600 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000601 list = v;
602 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000603 return list;
604}
605
Guido van Rossum23fff912000-12-15 22:02:05 +0000606static PyObject *warnoptions = NULL;
607
608void
609PySys_ResetWarnOptions(void)
610{
611 if (warnoptions == NULL || !PyList_Check(warnoptions))
612 return;
613 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
614}
615
616void
617PySys_AddWarnOption(char *s)
618{
619 PyObject *str;
620
621 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
622 Py_XDECREF(warnoptions);
623 warnoptions = PyList_New(0);
624 if (warnoptions == NULL)
625 return;
626 }
627 str = PyString_FromString(s);
628 if (str != NULL) {
629 PyList_Append(warnoptions, str);
630 Py_DECREF(str);
631 }
632}
633
Guido van Rossum40552d01998-08-06 03:34:39 +0000634/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
635 Two literals concatenated works just fine. If you have a K&R compiler
636 or other abomination that however *does* understand longer strings,
637 get rid of the !!! comment in the middle and the quotes that surround it. */
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000638static char sys_doc[] =
639"This module provides access to some objects used or maintained by the\n\
640interpreter and to functions that interact strongly with the interpreter.\n\
641\n\
642Dynamic objects:\n\
643\n\
644argv -- command line arguments; argv[0] is the script pathname if known\n\
645path -- module search path; path[0] is the script directory, else ''\n\
646modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000647\n\
648displayhook -- called to show results in an interactive session\n\
649excepthook -- called to handle any uncaught exception other than SystemExit\n\
650 To customize printing in an interactive session or to install a custom\n\
651 top-level exception handler, assign other functions to replace these.\n\
652\n\
653exitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
654 Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000655\n\
656stdin -- standard input file object; used by raw_input() and input()\n\
657stdout -- standard output file object; used by the print statement\n\
658stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000659 By assigning other file objects (or objects that behave like files)\n\
660 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000661\n\
662last_type -- type of last uncaught exception\n\
663last_value -- value of last uncaught exception\n\
664last_traceback -- traceback of last uncaught exception\n\
665 These three are only available in an interactive session after a\n\
666 traceback has been printed.\n\
667\n\
668exc_type -- type of exception currently being handled\n\
669exc_value -- value of exception currently being handled\n\
670exc_traceback -- traceback of exception currently being handled\n\
671 The function exc_info() should be used instead of these three,\n\
672 because it is thread-safe.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000673"
674#ifndef MS_WIN16
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000675/* concatenating string here */
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000676"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000677Static objects:\n\
678\n\
679maxint -- the largest supported integer (the smallest is -maxint-1)\n\
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000680maxunicode -- the largest supported character\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000681builtin_module_names -- tuple of module names built into this intepreter\n\
Fred Drake801c08d2000-04-13 15:29:10 +0000682version -- the version of this interpreter as a string\n\
683version_info -- version information as a tuple\n\
684hexversion -- version information encoded as a single integer\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000685copyright -- copyright notice pertaining to this interpreter\n\
686platform -- platform identifier\n\
687executable -- pathname of this Python interpreter\n\
688prefix -- prefix used to find the Python library\n\
689exec_prefix -- prefix used to find the machine-specific Python library\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000690"
691#ifdef MS_WINDOWS
692/* concatenating string here */
693"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000694winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000695"
696#endif /* MS_WINDOWS */
697"__stdin__ -- the original stdin; don't touch!\n\
698__stdout__ -- the original stdout; don't touch!\n\
699__stderr__ -- the original stderr; don't touch!\n\
700__displayhook__ -- the original displayhook; don't touch!\n\
701__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000702\n\
703Functions:\n\
704\n\
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000705displayhook() -- print an object to the screen, and save it in __builtin__._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000706excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000707exc_info() -- return thread-safe information about the current exception\n\
708exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000709getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000710getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000711getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000712setcheckinterval() -- control how often the interpreter checks for events\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000713setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000714setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000715setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000716settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +0000717"
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000718#endif /* MS_WIN16 */
Fred Drakeccede592000-08-14 20:59:57 +0000719/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000720
Guido van Rossum25ce5661997-08-02 03:10:38 +0000721PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000722_PySys_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000724 PyObject *m, *v, *sysdict;
725 PyObject *sysin, *sysout, *syserr;
Fred Drake6d27c1e2000-04-13 20:03:20 +0000726 char *s;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000727
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000728 m = Py_InitModule3("sys", sys_methods, sys_doc);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000729 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000730
731 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
732 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
733 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000734 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000735 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000736 PyDict_SetItemString(sysdict, "stdin", sysin);
737 PyDict_SetItemString(sysdict, "stdout", sysout);
738 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossumbd36dba1998-02-19 20:53:06 +0000739 /* Make backup copies for cleanup */
740 PyDict_SetItemString(sysdict, "__stdin__", sysin);
741 PyDict_SetItemString(sysdict, "__stdout__", sysout);
742 PyDict_SetItemString(sysdict, "__stderr__", syserr);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000743 PyDict_SetItemString(sysdict, "__displayhook__",
744 PyDict_GetItemString(sysdict, "displayhook"));
745 PyDict_SetItemString(sysdict, "__excepthook__",
746 PyDict_GetItemString(sysdict, "excepthook"));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000747 Py_XDECREF(sysin);
748 Py_XDECREF(sysout);
749 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000750 PyDict_SetItemString(sysdict, "version",
751 v = PyString_FromString(Py_GetVersion()));
Barry Warsaw54892c41999-01-27 16:33:19 +0000752 Py_XDECREF(v);
Guido van Rossume0d7dae1999-01-03 12:55:39 +0000753 PyDict_SetItemString(sysdict, "hexversion",
754 v = PyInt_FromLong(PY_VERSION_HEX));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000755 Py_XDECREF(v);
Fred Drake93a20bf2000-04-13 17:44:51 +0000756 /*
757 * These release level checks are mutually exclusive and cover
758 * the field, so don't get too fancy with the pre-processor!
759 */
760#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000761 s = "alpha";
Fred Drake592f2d62000-08-31 15:21:11 +0000762#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000763 s = "beta";
Fred Drake592f2d62000-08-31 15:21:11 +0000764#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000765 s = "candidate";
Fred Drake592f2d62000-08-31 15:21:11 +0000766#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Fred Drake6d27c1e2000-04-13 20:03:20 +0000767 s = "final";
Fred Drake93a20bf2000-04-13 17:44:51 +0000768#endif
Fred Drake801c08d2000-04-13 15:29:10 +0000769 PyDict_SetItemString(sysdict, "version_info",
Fred Drake6d27c1e2000-04-13 20:03:20 +0000770 v = Py_BuildValue("iiisi", PY_MAJOR_VERSION,
Fred Drake801c08d2000-04-13 15:29:10 +0000771 PY_MINOR_VERSION,
Fred Drake6d27c1e2000-04-13 20:03:20 +0000772 PY_MICRO_VERSION, s,
Fred Drake93a20bf2000-04-13 17:44:51 +0000773 PY_RELEASE_SERIAL));
Fred Drake801c08d2000-04-13 15:29:10 +0000774 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000775 PyDict_SetItemString(sysdict, "copyright",
776 v = PyString_FromString(Py_GetCopyright()));
777 Py_XDECREF(v);
778 PyDict_SetItemString(sysdict, "platform",
779 v = PyString_FromString(Py_GetPlatform()));
780 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000781 PyDict_SetItemString(sysdict, "executable",
782 v = PyString_FromString(Py_GetProgramFullPath()));
783 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000784 PyDict_SetItemString(sysdict, "prefix",
785 v = PyString_FromString(Py_GetPrefix()));
786 Py_XDECREF(v);
787 PyDict_SetItemString(sysdict, "exec_prefix",
788 v = PyString_FromString(Py_GetExecPrefix()));
789 Py_XDECREF(v);
790 PyDict_SetItemString(sysdict, "maxint",
791 v = PyInt_FromLong(PyInt_GetMax()));
792 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000793#ifdef Py_USING_UNICODE
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000794 PyDict_SetItemString(sysdict, "maxunicode",
795 v = PyInt_FromLong(PyUnicode_GetMax()));
796 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000797#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000798 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000800 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000801 {
802 /* Assumes that longs are at least 2 bytes long.
803 Should be safe! */
804 unsigned long number = 1;
Fred Drakea2b6ad62000-08-15 04:24:43 +0000805 char *value;
Fred Drake099325e2000-08-14 15:47:03 +0000806
807 s = (char *) &number;
808 if (s[0] == 0)
Fred Drakea2b6ad62000-08-15 04:24:43 +0000809 value = "big";
Fred Drake099325e2000-08-14 15:47:03 +0000810 else
Fred Drakea2b6ad62000-08-15 04:24:43 +0000811 value = "little";
812 PyDict_SetItemString(sysdict, "byteorder",
Barry Warsawf2581c92000-08-16 23:03:57 +0000813 v = PyString_FromString(value));
814 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000815 }
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000816#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000817 PyDict_SetItemString(sysdict, "dllhandle",
Guido van Rossum582acec2000-06-28 22:07:35 +0000818 v = PyLong_FromVoidPtr(PyWin_DLLhModule));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000819 Py_XDECREF(v);
820 PyDict_SetItemString(sysdict, "winver",
Guido van Rossum6c1e5f21997-09-29 23:34:23 +0000821 v = PyString_FromString(PyWin_DLLVersionString));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000822 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000823#endif
Guido van Rossum23fff912000-12-15 22:02:05 +0000824 if (warnoptions == NULL) {
825 warnoptions = PyList_New(0);
826 }
827 else {
828 Py_INCREF(warnoptions);
829 }
830 if (warnoptions != NULL) {
Guido van Rossum03df3b32001-01-13 22:06:05 +0000831 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
Guido van Rossum23fff912000-12-15 22:02:05 +0000832 }
833
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000834 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000835 return NULL;
836 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000837}
838
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000839static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000840makepathobject(char *path, int delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000841{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 int i, n;
843 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000844 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845
846 n = 1;
847 p = path;
848 while ((p = strchr(p, delim)) != NULL) {
849 n++;
850 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000851 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000852 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000853 if (v == NULL)
854 return NULL;
855 for (i = 0; ; i++) {
856 p = strchr(path, delim);
857 if (p == NULL)
858 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000859 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000861 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862 return NULL;
863 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000864 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000865 if (*p == '\0')
866 break;
867 path = p+1;
868 }
869 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000870}
871
872void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000873PySys_SetPath(char *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000874{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000875 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000876 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000877 Py_FatalError("can't create sys.path");
878 if (PySys_SetObject("path", v) != 0)
879 Py_FatalError("can't assign sys.path");
880 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000881}
882
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000883static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000884makeargvobject(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000885{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000886 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000887 if (argc <= 0 || argv == NULL) {
888 /* Ensure at least one (empty) argument is seen */
889 static char *empty_argv[1] = {""};
890 argv = empty_argv;
891 argc = 1;
892 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000893 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000894 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000895 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000897 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000899 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000900 av = NULL;
901 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000902 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000903 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000904 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000905 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906 return av;
907}
908
909void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000910PySys_SetArgv(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000911{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000912 PyObject *av = makeargvobject(argc, argv);
913 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000914 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000915 Py_FatalError("no mem for sys.argv");
916 if (PySys_SetObject("argv", av) != 0)
917 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000918 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000919 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000920 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000921 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000922 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000923#ifdef HAVE_READLINK
924 char link[MAXPATHLEN+1];
925 char argv0copy[2*MAXPATHLEN+1];
926 int nr = 0;
927 if (argc > 0 && argv0 != NULL)
928 nr = readlink(argv0, link, MAXPATHLEN);
929 if (nr > 0) {
930 /* It's a symlink */
931 link[nr] = '\0';
932 if (link[0] == SEP)
933 argv0 = link; /* Link to absolute path */
934 else if (strchr(link, SEP) == NULL)
935 ; /* Link without path */
936 else {
937 /* Must join(dirname(argv0), link) */
938 char *q = strrchr(argv0, SEP);
939 if (q == NULL)
940 argv0 = link; /* argv0 without path */
941 else {
942 /* Must make a copy */
943 strcpy(argv0copy, argv0);
944 q = strrchr(argv0copy, SEP);
945 strcpy(q+1, link);
946 argv0 = argv0copy;
947 }
948 }
949 }
950#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000951#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000952 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000953 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000954 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000955 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000956 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000957 if (q != NULL)
958 p = q;
959 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000960 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000961 if (n > 1 && p[-1] != ':')
962 n--; /* Drop trailing separator */
963 }
964 }
965#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000966 if (argc > 0 && argv0 != NULL)
967 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000968 if (p != NULL) {
Guido van Rossumbceccf52001-04-10 22:07:43 +0000969#ifndef RISCOS
Guido van Rossumc474dea1997-04-25 15:38:31 +0000970 n = p + 1 - argv0;
Guido van Rossumbceccf52001-04-10 22:07:43 +0000971#else /* don't include trailing separator */
972 n = p - argv0;
973#endif /* RISCOS */
Guido van Rossumcc883411996-09-10 14:44:21 +0000974#if SEP == '/' /* Special case for Unix filename syntax */
975 if (n > 1)
976 n--; /* Drop trailing separator */
977#endif /* Unix */
978 }
979#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000980 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000981 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000982 Py_FatalError("no mem for sys.path insertion");
983 if (PyList_Insert(path, 0, a) < 0)
984 Py_FatalError("sys.path.insert(0) failed");
985 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000986 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000987 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000988}
Guido van Rossuma890e681998-05-12 14:59:24 +0000989
990
991/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
992 Adapted from code submitted by Just van Rossum.
993
994 PySys_WriteStdout(format, ...)
995 PySys_WriteStderr(format, ...)
996
997 The first function writes to sys.stdout; the second to sys.stderr. When
998 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +0000999 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00001000
1001 Both take a printf-style format string as their first argument followed
1002 by a variable length argument list determined by the format string.
1003
1004 *** WARNING ***
1005
1006 The format should limit the total size of the formatted output string to
1007 1000 bytes. In particular, this means that no unrestricted "%s" formats
1008 should occur; these should be limited using "%.<N>s where <N> is a
1009 decimal number calculated so that <N> plus the maximum size of other
1010 formatted text does not exceed 1000 bytes. Also watch out for "%f",
1011 which can print hundreds of digits for very large numbers.
1012
1013 */
1014
1015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001016mywrite(char *name, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00001017{
1018 PyObject *file;
Guido van Rossum8442af31998-10-12 18:22:10 +00001019 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossuma890e681998-05-12 14:59:24 +00001020
Guido van Rossum8442af31998-10-12 18:22:10 +00001021 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001022 file = PySys_GetObject(name);
1023 if (file == NULL || PyFile_AsFile(file) == fp)
1024 vfprintf(fp, format, va);
1025 else {
1026 char buffer[1001];
Guido van Rossum8442af31998-10-12 18:22:10 +00001027 if (vsprintf(buffer, format, va) >= sizeof(buffer))
1028 Py_FatalError("PySys_WriteStdout/err: buffer overrun");
Guido van Rossuma890e681998-05-12 14:59:24 +00001029 if (PyFile_WriteString(buffer, file) != 0) {
1030 PyErr_Clear();
1031 fputs(buffer, fp);
1032 }
1033 }
Guido van Rossum8442af31998-10-12 18:22:10 +00001034 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001035}
1036
1037void
Guido van Rossuma890e681998-05-12 14:59:24 +00001038PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001039{
1040 va_list va;
1041
Guido van Rossuma890e681998-05-12 14:59:24 +00001042 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001043 mywrite("stdout", stdout, format, va);
1044 va_end(va);
1045}
1046
1047void
Guido van Rossuma890e681998-05-12 14:59:24 +00001048PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001049{
1050 va_list va;
1051
Guido van Rossuma890e681998-05-12 14:59:24 +00001052 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001053 mywrite("stderr", stderr, format, va);
1054 va_end(va);
1055}