blob: deead3a93495ffcfb4f26677a725ac5ceb1f5256 [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
Fred Drake8f51f542001-10-04 14:48:42 +0000263 if (arg == NULL)
264 arg = Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000265 result = call_trampoline(tstate, self, frame, what, arg);
266 if (result == NULL) {
267 PyEval_SetProfile(NULL, NULL);
268 return -1;
269 }
270 Py_DECREF(result);
271 return 0;
272}
273
274static int
275trace_trampoline(PyObject *self, PyFrameObject *frame,
276 int what, PyObject *arg)
277{
278 PyThreadState *tstate = frame->f_tstate;
279 PyObject *callback;
280 PyObject *result;
281
282 if (what == PyTrace_CALL)
283 callback = self;
284 else
285 callback = frame->f_trace;
286 if (callback == NULL)
287 return 0;
288 result = call_trampoline(tstate, callback, frame, what, arg);
289 if (result == NULL) {
290 PyEval_SetTrace(NULL, NULL);
291 Py_XDECREF(frame->f_trace);
292 frame->f_trace = NULL;
293 return -1;
294 }
295 if (result != Py_None) {
296 PyObject *temp = frame->f_trace;
297 frame->f_trace = NULL;
298 Py_XDECREF(temp);
299 frame->f_trace = result;
300 }
301 else {
302 Py_DECREF(result);
303 }
304 return 0;
305}
Fred Draked0838392001-06-16 21:02:31 +0000306
Fred Drake8b4d01d2000-05-09 19:57:01 +0000307static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000308sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000309{
Fred Drake5755ce62001-06-27 19:19:46 +0000310 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000311 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000312 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000313 PyEval_SetTrace(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000314 else
Fred Drake5755ce62001-06-27 19:19:46 +0000315 PyEval_SetTrace(trace_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000316 Py_INCREF(Py_None);
317 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000318}
319
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000320static char settrace_doc[] =
321"settrace(function)\n\
322\n\
323Set the global debug tracing function. It will be called on each\n\
324function call. See the debugger chapter in the library manual.";
325
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000326static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000328{
Fred Drake5755ce62001-06-27 19:19:46 +0000329 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000330 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000331 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000332 PyEval_SetProfile(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000333 else
Fred Drake5755ce62001-06-27 19:19:46 +0000334 PyEval_SetProfile(profile_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000335 Py_INCREF(Py_None);
336 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000337}
338
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000339static char setprofile_doc[] =
340"setprofile(function)\n\
341\n\
342Set the profiling function. It will be called on each function call\n\
343and return. See the profiler chapter in the library manual.";
344
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000346sys_setcheckinterval(PyObject *self, PyObject *args)
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000347{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000348 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum43713e52000-02-29 13:59:29 +0000349 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &tstate->interp->checkinterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000350 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000351 Py_INCREF(Py_None);
352 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000353}
354
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000355static char setcheckinterval_doc[] =
356"setcheckinterval(n)\n\
357\n\
358Tell the Python interpreter to check for asynchronous events every\n\
359n instructions. This also affects how often thread switches occur.";
360
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000361static PyObject *
362sys_setrecursionlimit(PyObject *self, PyObject *args)
363{
364 int new_limit;
365 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
366 return NULL;
367 if (new_limit <= 0) {
368 PyErr_SetString(PyExc_ValueError,
369 "recursion limit must be positive");
370 return NULL;
371 }
372 Py_SetRecursionLimit(new_limit);
373 Py_INCREF(Py_None);
374 return Py_None;
375}
376
377static char setrecursionlimit_doc[] =
378"setrecursionlimit(n)\n\
379\n\
380Set the maximum depth of the Python interpreter stack to n. This\n\
381limit prevents infinite recursion from causing an overflow of the C\n\
382stack and crashing Python. The highest possible limit is platform-\n\
383dependent.";
384
385static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000386sys_getrecursionlimit(PyObject *self)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000387{
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000388 return PyInt_FromLong(Py_GetRecursionLimit());
389}
390
391static char getrecursionlimit_doc[] =
392"getrecursionlimit()\n\
393\n\
394Return the current value of the recursion limit, the maximum depth\n\
395of the Python interpreter stack. This limit prevents infinite\n\
396recursion from causing an overflow of the C stack and crashing Python.";
397
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000398#ifdef HAVE_DLOPEN
399static PyObject *
400sys_setdlopenflags(PyObject *self, PyObject *args)
401{
402 int new_val;
403 PyThreadState *tstate = PyThreadState_Get();
404 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
405 return NULL;
406 if (!tstate)
407 return NULL;
408 tstate->interp->dlopenflags = new_val;
409 Py_INCREF(Py_None);
410 return Py_None;
411}
412
413static char setdlopenflags_doc[] =
414"setdlopenflags(n) -> None\n\
415\n\
416Set the flags that will be used for dlopen() calls. Among other\n\
417things, this will enable a lazy resolving of symbols when imporing\n\
418a module, if called as sys.setdlopenflags(0)\n\
419To share symols across extension modules, call as\n\
420sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)";
421
422static PyObject *
423sys_getdlopenflags(PyObject *self, PyObject *args)
424{
425 PyThreadState *tstate = PyThreadState_Get();
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000426 if (!tstate)
427 return NULL;
428 return PyInt_FromLong(tstate->interp->dlopenflags);
429}
430
431static char getdlopenflags_doc[] =
432"getdlopenflags() -> int\n\
433\n\
434Return the current value of the flags that are used for dlopen()\n\
435calls. The flag constants are defined in the dl module.";
436#endif
437
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000438#ifdef USE_MALLOPT
439/* Link with -lmalloc (or -lmpc) on an SGI */
440#include <malloc.h>
441
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000442static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443sys_mdebug(PyObject *self, PyObject *args)
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000444{
445 int flag;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000446 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000447 return NULL;
448 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000449 Py_INCREF(Py_None);
450 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000451}
452#endif /* USE_MALLOPT */
453
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000454static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455sys_getrefcount(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000456{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000457 PyObject *arg;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000458 if (!PyArg_ParseTuple(args, "O:getrefcount", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000459 return NULL;
Mark Hammond440d8982000-06-20 08:12:48 +0000460 return PyInt_FromLong(arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000461}
462
Mark Hammond440d8982000-06-20 08:12:48 +0000463#ifdef Py_TRACE_REFS
464static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000465sys_gettotalrefcount(PyObject *self)
Mark Hammond440d8982000-06-20 08:12:48 +0000466{
467 extern long _Py_RefTotal;
Mark Hammond440d8982000-06-20 08:12:48 +0000468 return PyInt_FromLong(_Py_RefTotal);
469}
470
471#endif /* Py_TRACE_REFS */
472
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000473static char getrefcount_doc[] =
474"getrefcount(object) -> integer\n\
475\n\
476Return the current reference count for the object. This includes the\n\
477temporary reference in the argument list, so it is at least 2.";
478
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000479#ifdef COUNT_ALLOCS
480static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000481sys_getcounts(PyObject *self)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000482{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000483 extern PyObject *get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000484
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000485 return get_counts();
486}
487#endif
488
Barry Warsawb6a54d22000-12-06 21:47:46 +0000489static char getframe_doc[] =
490"_getframe([depth]) -> frameobject\n\
491\n\
492Return a frame object from the call stack. If optional integer depth is\n\
493given, return the frame object that many calls below the top of the stack.\n\
494If that is deeper than the call stack, ValueError is raised. The default\n\
495for depth is zero, returning the frame at the top of the call stack.\n\
496\n\
497This function should be used for internal and specialized\n\
498purposes only.";
499
500static PyObject *
501sys_getframe(PyObject *self, PyObject *args)
502{
503 PyFrameObject *f = PyThreadState_Get()->frame;
504 int depth = -1;
505
506 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
507 return NULL;
508
509 while (depth > 0 && f != NULL) {
510 f = f->f_back;
511 --depth;
512 }
513 if (f == NULL) {
514 PyErr_SetString(PyExc_ValueError,
515 "call stack is not deep enough");
516 return NULL;
517 }
518 Py_INCREF(f);
519 return (PyObject*)f;
520}
521
522
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000523#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000524/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000525extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000526#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000527
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000528#ifdef DYNAMIC_EXECUTION_PROFILE
529/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000530extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000531#endif
532
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000533static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000534 /* Might as well keep this in alphabetic order */
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000535 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
536 {"exc_info", (PyCFunction)sys_exc_info, METH_NOARGS, exc_info_doc},
537 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
538 {"exit", sys_exit, METH_OLDARGS, exit_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000539#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000540 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000541 getdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000542#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000543#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000544 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
545 getdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000546#endif
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000547#ifdef COUNT_ALLOCS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000548 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000549#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000550#ifdef DYNAMIC_EXECUTION_PROFILE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000551 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000552#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000553#ifdef Py_TRACE_REFS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000554 {"getobjects", _Py_GetObjects, METH_VARARGS},
555 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000556#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000557 {"getrefcount", sys_getrefcount, METH_VARARGS, getrefcount_doc},
558 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000559 getrecursionlimit_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000560 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000561#ifdef USE_MALLOPT
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000562 {"mdebug", sys_mdebug, METH_VARARGS},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000563#endif
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000564#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000565 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000566 setdefaultencoding_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000567#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000568 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000569 setcheckinterval_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000570#ifdef HAVE_DLOPEN
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000571 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
572 setdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000573#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000574 {"setprofile", sys_setprofile, METH_OLDARGS, setprofile_doc},
575 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000576 setrecursionlimit_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000577 {"settrace", sys_settrace, METH_OLDARGS, settrace_doc},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000578 {NULL, NULL} /* sentinel */
579};
580
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000581static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +0000583{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000584 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000585 int i;
586 if (list == NULL)
587 return NULL;
Guido van Rossum25c649f1997-11-04 17:04:34 +0000588 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 PyObject *name = PyString_FromString(
Guido van Rossum25c649f1997-11-04 17:04:34 +0000590 PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000591 if (name == NULL)
592 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000593 PyList_Append(list, name);
594 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000595 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000596 if (PyList_Sort(list) != 0) {
597 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000598 list = NULL;
599 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000600 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000601 PyObject *v = PyList_AsTuple(list);
602 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000603 list = v;
604 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000605 return list;
606}
607
Guido van Rossum23fff912000-12-15 22:02:05 +0000608static PyObject *warnoptions = NULL;
609
610void
611PySys_ResetWarnOptions(void)
612{
613 if (warnoptions == NULL || !PyList_Check(warnoptions))
614 return;
615 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
616}
617
618void
619PySys_AddWarnOption(char *s)
620{
621 PyObject *str;
622
623 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
624 Py_XDECREF(warnoptions);
625 warnoptions = PyList_New(0);
626 if (warnoptions == NULL)
627 return;
628 }
629 str = PyString_FromString(s);
630 if (str != NULL) {
631 PyList_Append(warnoptions, str);
632 Py_DECREF(str);
633 }
634}
635
Guido van Rossum40552d01998-08-06 03:34:39 +0000636/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
637 Two literals concatenated works just fine. If you have a K&R compiler
638 or other abomination that however *does* understand longer strings,
639 get rid of the !!! comment in the middle and the quotes that surround it. */
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000640static char sys_doc[] =
641"This module provides access to some objects used or maintained by the\n\
642interpreter and to functions that interact strongly with the interpreter.\n\
643\n\
644Dynamic objects:\n\
645\n\
646argv -- command line arguments; argv[0] is the script pathname if known\n\
647path -- module search path; path[0] is the script directory, else ''\n\
648modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000649\n\
650displayhook -- called to show results in an interactive session\n\
651excepthook -- called to handle any uncaught exception other than SystemExit\n\
652 To customize printing in an interactive session or to install a custom\n\
653 top-level exception handler, assign other functions to replace these.\n\
654\n\
655exitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
656 Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000657\n\
658stdin -- standard input file object; used by raw_input() and input()\n\
659stdout -- standard output file object; used by the print statement\n\
660stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000661 By assigning other file objects (or objects that behave like files)\n\
662 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000663\n\
664last_type -- type of last uncaught exception\n\
665last_value -- value of last uncaught exception\n\
666last_traceback -- traceback of last uncaught exception\n\
667 These three are only available in an interactive session after a\n\
668 traceback has been printed.\n\
669\n\
670exc_type -- type of exception currently being handled\n\
671exc_value -- value of exception currently being handled\n\
672exc_traceback -- traceback of exception currently being handled\n\
673 The function exc_info() should be used instead of these three,\n\
674 because it is thread-safe.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000675"
676#ifndef MS_WIN16
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000677/* concatenating string here */
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000678"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000679Static objects:\n\
680\n\
681maxint -- the largest supported integer (the smallest is -maxint-1)\n\
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000682maxunicode -- the largest supported character\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000683builtin_module_names -- tuple of module names built into this intepreter\n\
Fred Drake801c08d2000-04-13 15:29:10 +0000684version -- the version of this interpreter as a string\n\
685version_info -- version information as a tuple\n\
686hexversion -- version information encoded as a single integer\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000687copyright -- copyright notice pertaining to this interpreter\n\
688platform -- platform identifier\n\
689executable -- pathname of this Python interpreter\n\
690prefix -- prefix used to find the Python library\n\
691exec_prefix -- prefix used to find the machine-specific Python library\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000692"
693#ifdef MS_WINDOWS
694/* concatenating string here */
695"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000696winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000697"
698#endif /* MS_WINDOWS */
699"__stdin__ -- the original stdin; don't touch!\n\
700__stdout__ -- the original stdout; don't touch!\n\
701__stderr__ -- the original stderr; don't touch!\n\
702__displayhook__ -- the original displayhook; don't touch!\n\
703__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000704\n\
705Functions:\n\
706\n\
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000707displayhook() -- print an object to the screen, and save it in __builtin__._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000708excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000709exc_info() -- return thread-safe information about the current exception\n\
710exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000711getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000712getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000713getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000714setcheckinterval() -- control how often the interpreter checks for events\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000715setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000716setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000717setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000718settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +0000719"
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000720#endif /* MS_WIN16 */
Fred Drakeccede592000-08-14 20:59:57 +0000721/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000722
Guido van Rossum25ce5661997-08-02 03:10:38 +0000723PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724_PySys_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000725{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000726 PyObject *m, *v, *sysdict;
727 PyObject *sysin, *sysout, *syserr;
Fred Drake6d27c1e2000-04-13 20:03:20 +0000728 char *s;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000729
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000730 m = Py_InitModule3("sys", sys_methods, sys_doc);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000731 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000732
733 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
734 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
735 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000736 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000737 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000738 PyDict_SetItemString(sysdict, "stdin", sysin);
739 PyDict_SetItemString(sysdict, "stdout", sysout);
740 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossumbd36dba1998-02-19 20:53:06 +0000741 /* Make backup copies for cleanup */
742 PyDict_SetItemString(sysdict, "__stdin__", sysin);
743 PyDict_SetItemString(sysdict, "__stdout__", sysout);
744 PyDict_SetItemString(sysdict, "__stderr__", syserr);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000745 PyDict_SetItemString(sysdict, "__displayhook__",
746 PyDict_GetItemString(sysdict, "displayhook"));
747 PyDict_SetItemString(sysdict, "__excepthook__",
748 PyDict_GetItemString(sysdict, "excepthook"));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000749 Py_XDECREF(sysin);
750 Py_XDECREF(sysout);
751 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000752 PyDict_SetItemString(sysdict, "version",
753 v = PyString_FromString(Py_GetVersion()));
Barry Warsaw54892c41999-01-27 16:33:19 +0000754 Py_XDECREF(v);
Guido van Rossume0d7dae1999-01-03 12:55:39 +0000755 PyDict_SetItemString(sysdict, "hexversion",
756 v = PyInt_FromLong(PY_VERSION_HEX));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000757 Py_XDECREF(v);
Fred Drake93a20bf2000-04-13 17:44:51 +0000758 /*
759 * These release level checks are mutually exclusive and cover
760 * the field, so don't get too fancy with the pre-processor!
761 */
762#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000763 s = "alpha";
Fred Drake592f2d62000-08-31 15:21:11 +0000764#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000765 s = "beta";
Fred Drake592f2d62000-08-31 15:21:11 +0000766#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000767 s = "candidate";
Fred Drake592f2d62000-08-31 15:21:11 +0000768#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Fred Drake6d27c1e2000-04-13 20:03:20 +0000769 s = "final";
Fred Drake93a20bf2000-04-13 17:44:51 +0000770#endif
Fred Drake801c08d2000-04-13 15:29:10 +0000771 PyDict_SetItemString(sysdict, "version_info",
Fred Drake6d27c1e2000-04-13 20:03:20 +0000772 v = Py_BuildValue("iiisi", PY_MAJOR_VERSION,
Fred Drake801c08d2000-04-13 15:29:10 +0000773 PY_MINOR_VERSION,
Fred Drake6d27c1e2000-04-13 20:03:20 +0000774 PY_MICRO_VERSION, s,
Fred Drake93a20bf2000-04-13 17:44:51 +0000775 PY_RELEASE_SERIAL));
Fred Drake801c08d2000-04-13 15:29:10 +0000776 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000777 PyDict_SetItemString(sysdict, "copyright",
778 v = PyString_FromString(Py_GetCopyright()));
779 Py_XDECREF(v);
780 PyDict_SetItemString(sysdict, "platform",
781 v = PyString_FromString(Py_GetPlatform()));
782 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000783 PyDict_SetItemString(sysdict, "executable",
784 v = PyString_FromString(Py_GetProgramFullPath()));
785 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000786 PyDict_SetItemString(sysdict, "prefix",
787 v = PyString_FromString(Py_GetPrefix()));
788 Py_XDECREF(v);
789 PyDict_SetItemString(sysdict, "exec_prefix",
790 v = PyString_FromString(Py_GetExecPrefix()));
791 Py_XDECREF(v);
792 PyDict_SetItemString(sysdict, "maxint",
793 v = PyInt_FromLong(PyInt_GetMax()));
794 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000795#ifdef Py_USING_UNICODE
Martin v. Löwisce9b5a52001-06-27 06:28:56 +0000796 PyDict_SetItemString(sysdict, "maxunicode",
797 v = PyInt_FromLong(PyUnicode_GetMax()));
798 Py_XDECREF(v);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000799#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000800 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000801 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000802 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000803 {
804 /* Assumes that longs are at least 2 bytes long.
805 Should be safe! */
806 unsigned long number = 1;
Fred Drakea2b6ad62000-08-15 04:24:43 +0000807 char *value;
Fred Drake099325e2000-08-14 15:47:03 +0000808
809 s = (char *) &number;
810 if (s[0] == 0)
Fred Drakea2b6ad62000-08-15 04:24:43 +0000811 value = "big";
Fred Drake099325e2000-08-14 15:47:03 +0000812 else
Fred Drakea2b6ad62000-08-15 04:24:43 +0000813 value = "little";
814 PyDict_SetItemString(sysdict, "byteorder",
Barry Warsawf2581c92000-08-16 23:03:57 +0000815 v = PyString_FromString(value));
816 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000817 }
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000818#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000819 PyDict_SetItemString(sysdict, "dllhandle",
Guido van Rossum582acec2000-06-28 22:07:35 +0000820 v = PyLong_FromVoidPtr(PyWin_DLLhModule));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000821 Py_XDECREF(v);
822 PyDict_SetItemString(sysdict, "winver",
Guido van Rossum6c1e5f21997-09-29 23:34:23 +0000823 v = PyString_FromString(PyWin_DLLVersionString));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000824 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000825#endif
Guido van Rossum23fff912000-12-15 22:02:05 +0000826 if (warnoptions == NULL) {
827 warnoptions = PyList_New(0);
828 }
829 else {
830 Py_INCREF(warnoptions);
831 }
832 if (warnoptions != NULL) {
Guido van Rossum03df3b32001-01-13 22:06:05 +0000833 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
Guido van Rossum23fff912000-12-15 22:02:05 +0000834 }
835
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000836 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000837 return NULL;
838 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000839}
840
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000841static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000842makepathobject(char *path, int delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000843{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000844 int i, n;
845 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000846 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000847
848 n = 1;
849 p = path;
850 while ((p = strchr(p, delim)) != NULL) {
851 n++;
852 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000853 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000854 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855 if (v == NULL)
856 return NULL;
857 for (i = 0; ; i++) {
858 p = strchr(path, delim);
859 if (p == NULL)
860 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000861 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000863 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 return NULL;
865 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000866 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 if (*p == '\0')
868 break;
869 path = p+1;
870 }
871 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000872}
873
874void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000875PySys_SetPath(char *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000876{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000877 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000878 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000879 Py_FatalError("can't create sys.path");
880 if (PySys_SetObject("path", v) != 0)
881 Py_FatalError("can't assign sys.path");
882 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000883}
884
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000885static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886makeargvobject(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000887{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000888 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000889 if (argc <= 0 || argv == NULL) {
890 /* Ensure at least one (empty) argument is seen */
891 static char *empty_argv[1] = {""};
892 argv = empty_argv;
893 argc = 1;
894 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000895 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000897 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000899 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000900 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000901 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000902 av = NULL;
903 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000904 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000905 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000906 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000907 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 return av;
909}
910
911void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000912PySys_SetArgv(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000913{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000914 PyObject *av = makeargvobject(argc, argv);
915 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000916 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000917 Py_FatalError("no mem for sys.argv");
918 if (PySys_SetObject("argv", av) != 0)
919 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000920 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000921 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000922 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000923 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000924 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000925#ifdef HAVE_READLINK
926 char link[MAXPATHLEN+1];
927 char argv0copy[2*MAXPATHLEN+1];
928 int nr = 0;
929 if (argc > 0 && argv0 != NULL)
930 nr = readlink(argv0, link, MAXPATHLEN);
931 if (nr > 0) {
932 /* It's a symlink */
933 link[nr] = '\0';
934 if (link[0] == SEP)
935 argv0 = link; /* Link to absolute path */
936 else if (strchr(link, SEP) == NULL)
937 ; /* Link without path */
938 else {
939 /* Must join(dirname(argv0), link) */
940 char *q = strrchr(argv0, SEP);
941 if (q == NULL)
942 argv0 = link; /* argv0 without path */
943 else {
944 /* Must make a copy */
945 strcpy(argv0copy, argv0);
946 q = strrchr(argv0copy, SEP);
947 strcpy(q+1, link);
948 argv0 = argv0copy;
949 }
950 }
951 }
952#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000953#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000954 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000955 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000956 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000957 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000958 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000959 if (q != NULL)
960 p = q;
961 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000962 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000963 if (n > 1 && p[-1] != ':')
964 n--; /* Drop trailing separator */
965 }
966 }
967#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000968 if (argc > 0 && argv0 != NULL)
969 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000970 if (p != NULL) {
Guido van Rossumbceccf52001-04-10 22:07:43 +0000971#ifndef RISCOS
Guido van Rossumc474dea1997-04-25 15:38:31 +0000972 n = p + 1 - argv0;
Guido van Rossumbceccf52001-04-10 22:07:43 +0000973#else /* don't include trailing separator */
974 n = p - argv0;
975#endif /* RISCOS */
Guido van Rossumcc883411996-09-10 14:44:21 +0000976#if SEP == '/' /* Special case for Unix filename syntax */
977 if (n > 1)
978 n--; /* Drop trailing separator */
979#endif /* Unix */
980 }
981#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000982 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000983 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000984 Py_FatalError("no mem for sys.path insertion");
985 if (PyList_Insert(path, 0, a) < 0)
986 Py_FatalError("sys.path.insert(0) failed");
987 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000988 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000989 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000990}
Guido van Rossuma890e681998-05-12 14:59:24 +0000991
992
993/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
994 Adapted from code submitted by Just van Rossum.
995
996 PySys_WriteStdout(format, ...)
997 PySys_WriteStderr(format, ...)
998
999 The first function writes to sys.stdout; the second to sys.stderr. When
1000 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00001001 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00001002
1003 Both take a printf-style format string as their first argument followed
1004 by a variable length argument list determined by the format string.
1005
1006 *** WARNING ***
1007
1008 The format should limit the total size of the formatted output string to
1009 1000 bytes. In particular, this means that no unrestricted "%s" formats
1010 should occur; these should be limited using "%.<N>s where <N> is a
1011 decimal number calculated so that <N> plus the maximum size of other
1012 formatted text does not exceed 1000 bytes. Also watch out for "%f",
1013 which can print hundreds of digits for very large numbers.
1014
1015 */
1016
1017static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018mywrite(char *name, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00001019{
1020 PyObject *file;
Guido van Rossum8442af31998-10-12 18:22:10 +00001021 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossuma890e681998-05-12 14:59:24 +00001022
Guido van Rossum8442af31998-10-12 18:22:10 +00001023 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001024 file = PySys_GetObject(name);
1025 if (file == NULL || PyFile_AsFile(file) == fp)
1026 vfprintf(fp, format, va);
1027 else {
1028 char buffer[1001];
Guido van Rossum8442af31998-10-12 18:22:10 +00001029 if (vsprintf(buffer, format, va) >= sizeof(buffer))
1030 Py_FatalError("PySys_WriteStdout/err: buffer overrun");
Guido van Rossuma890e681998-05-12 14:59:24 +00001031 if (PyFile_WriteString(buffer, file) != 0) {
1032 PyErr_Clear();
1033 fputs(buffer, fp);
1034 }
1035 }
Guido van Rossum8442af31998-10-12 18:22:10 +00001036 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001037}
1038
1039void
Guido van Rossuma890e681998-05-12 14:59:24 +00001040PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001041{
1042 va_list va;
1043
Guido van Rossuma890e681998-05-12 14:59:24 +00001044 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001045 mywrite("stdout", stdout, format, va);
1046 va_end(va);
1047}
1048
1049void
Guido van Rossuma890e681998-05-12 14:59:24 +00001050PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001051{
1052 va_list va;
1053
Guido van Rossuma890e681998-05-12 14:59:24 +00001054 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001055 mywrite("stderr", stderr, format, va);
1056 va_end(va);
1057}