blob: c1eaeede5e3e5381eeeb017fb81d5bf72fb42bb3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* System module */
33
34/*
35Various bits of information used by the interpreter are collected in
36module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +000037Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +000038- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039Data members:
40- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000042- path: module search path (list of strings)
43- argv: script arguments (list of strings)
44- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045*/
46
Guido van Rossum3f5da241990-12-20 15:06:42 +000047#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049#include "sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051#include "modsupport.h"
Guido van Rossume2437a11992-03-23 18:20:18 +000052#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000053
Guido van Rossume2437a11992-03-23 18:20:18 +000054object *sys_trace, *sys_profile;
Guido van Rossum9a1f3881995-03-30 11:01:58 +000055int sys_checkinterval = 10;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056
57static object *sysdict;
58
Guido van Rossum9b38a141996-09-11 23:12:24 +000059#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000060extern void *PyWin_DLLhModule;
61#endif
62
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063object *
64sysget(name)
65 char *name;
66{
67 return dictlookup(sysdict, name);
68}
69
70FILE *
71sysgetfile(name, def)
72 char *name;
73 FILE *def;
74{
75 FILE *fp = NULL;
76 object *v = sysget(name);
Guido van Rossum3165fe61992-09-25 21:59:05 +000077 if (v != NULL && is_fileobject(v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 fp = getfilefile(v);
79 if (fp == NULL)
80 fp = def;
81 return fp;
82}
83
84int
85sysset(name, v)
86 char *name;
87 object *v;
88{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000089 if (v == NULL) {
90 if (dictlookup(sysdict, name) == NULL)
91 return 0;
92 else
93 return dictremove(sysdict, name);
94 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095 else
96 return dictinsert(sysdict, name, v);
97}
98
99static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100sys_exit(self, args)
101 object *self;
102 object *args;
103{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000104 /* Raise SystemExit so callers may catch it or clean up. */
105 err_setval(SystemExit, args);
106 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
Guido van Rossume2437a11992-03-23 18:20:18 +0000109static object *
110sys_settrace(self, args)
111 object *self;
112 object *args;
113{
114 if (args == None)
115 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000116 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000117 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000118 XDECREF(sys_trace);
Guido van Rossume2437a11992-03-23 18:20:18 +0000119 sys_trace = args;
120 INCREF(None);
121 return None;
122}
123
124static object *
125sys_setprofile(self, args)
126 object *self;
127 object *args;
128{
129 if (args == None)
130 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000131 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000132 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000133 XDECREF(sys_profile);
Guido van Rossume2437a11992-03-23 18:20:18 +0000134 sys_profile = args;
135 INCREF(None);
136 return None;
137}
138
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000139static object *
140sys_setcheckinterval(self, args)
141 object *self;
142 object *args;
143{
144 if (!newgetargs(args, "i", &sys_checkinterval))
145 return NULL;
146 INCREF(None);
147 return None;
148}
149
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000150#ifdef USE_MALLOPT
151/* Link with -lmalloc (or -lmpc) on an SGI */
152#include <malloc.h>
153
154static object *
155sys_mdebug(self, args)
156 object *self;
157 object *args;
158{
159 int flag;
160 if (!getargs(args, "i", &flag))
161 return NULL;
162 mallopt(M_DEBUG, flag);
163 INCREF(None);
164 return None;
165}
166#endif /* USE_MALLOPT */
167
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000168static object *
169sys_getrefcount(self, args)
170 object *self;
171 object *args;
172{
173 object *arg;
174 if (!getargs(args, "O", &arg))
175 return NULL;
176 return newintobject((long) arg->ob_refcnt);
177}
178
179#ifdef COUNT_ALLOCS
180static PyObject *
181sys_getcounts(self, args)
182 PyObject *self, *args;
183{
184 extern PyObject *get_counts Py_PROTO((void));
185
186 if (!PyArg_Parse(args, ""))
187 return NULL;
188 return get_counts();
189}
190#endif
191
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000192#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000193/* Defined in objects.c because it uses static globals if that file */
194extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000195#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000196
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000197#ifdef DYNAMIC_EXECUTION_PROFILE
198/* Defined in ceval.c because it uses static globals if that file */
199extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *, PyObject *));
200#endif
201
Guido van Rossum3f5da241990-12-20 15:06:42 +0000202static struct methodlist sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000203 /* Might as well keep this in alphabetic order */
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000204 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000205#ifdef COUNT_ALLOCS
206 {"getcounts", sys_getcounts, 0},
207#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000208#ifdef DYNAMIC_EXECUTION_PROFILE
209 {"getdxp", _Py_GetDXProfile, 1},
210#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000211#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000212 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000213#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000214 {"getrefcount", sys_getrefcount, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000215#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000216 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000217#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000218 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000219 {"setprofile", sys_setprofile, 0},
220 {"settrace", sys_settrace, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221 {NULL, NULL} /* sentinel */
222};
223
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224static object *sysin, *sysout, *syserr;
225
Guido van Rossum34679b71993-01-26 13:33:44 +0000226static object *
227list_builtin_module_names()
228{
229 object *list = newlistobject(0);
230 int i;
231 if (list == NULL)
232 return NULL;
233 for (i = 0; inittab[i].name != NULL; i++) {
234 object *name = newstringobject(inittab[i].name);
235 if (name == NULL)
236 break;
237 addlistitem(list, name);
238 DECREF(name);
239 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000240 if (sortlist(list) != 0) {
241 DECREF(list);
242 list = NULL;
243 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000244 if (list) {
245 object *v = listtuple(list);
246 DECREF(list);
247 list = v;
248 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000249 return list;
250}
251
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000253initsys()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000255 extern long getmaxint PROTO((void));
256 extern char *getversion PROTO((void));
257 extern char *getcopyright PROTO((void));
Guido van Rossumaaf18391995-07-07 22:45:02 +0000258 extern char *getplatform PROTO((void));
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000259 extern char *Py_GetPrefix PROTO((void));
260 extern char *Py_GetExecPrefix PROTO((void));
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000261 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000262 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000263 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 sysdict = getmoduledict(m);
265 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266 /* NB keep an extra ref to the std files to avoid closing them
267 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000268 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
269 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
270 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000272 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 dictinsert(sysdict, "stdin", sysin);
274 dictinsert(sysdict, "stdout", sysout);
275 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000276 dictinsert(sysdict, "version", v = newstringobject(getversion()));
277 XDECREF(v);
278 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
279 XDECREF(v);
Guido van Rossumaaf18391995-07-07 22:45:02 +0000280 dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
281 XDECREF(v);
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000282 dictinsert(sysdict, "prefix", v = newstringobject(Py_GetPrefix()));
283 XDECREF(v);
284 dictinsert(sysdict, "exec_prefix",
285 v = newstringobject(Py_GetExecPrefix()));
286 XDECREF(v);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000287 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
288 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000289 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000290 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291 v = list_builtin_module_names());
292 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000293#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +0000294 dictinsert(sysdict, "dllhandle", v = newintobject((int)PyWin_DLLhModule));
295 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000296 dictinsert(sysdict, "winver", v = newstringobject(MS_DLL_ID));
Guido van Rossumc606fe11996-04-09 02:37:57 +0000297 XDECREF(v);
298#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 if (err_occurred())
300 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000301}
302
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303static object *
304makepathobject(path, delim)
305 char *path;
306 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000307{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 int i, n;
309 char *p;
310 object *v, *w;
311
312 n = 1;
313 p = path;
314 while ((p = strchr(p, delim)) != NULL) {
315 n++;
316 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000317 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318 v = newlistobject(n);
319 if (v == NULL)
320 return NULL;
321 for (i = 0; ; i++) {
322 p = strchr(path, delim);
323 if (p == NULL)
324 p = strchr(path, '\0'); /* End of string */
325 w = newsizedstringobject(path, (int) (p - path));
326 if (w == NULL) {
327 DECREF(v);
328 return NULL;
329 }
330 setlistitem(v, i, w);
331 if (*p == '\0')
332 break;
333 path = p+1;
334 }
335 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336}
337
338void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339setpythonpath(path)
340 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 object *v;
343 if ((v = makepathobject(path, DELIM)) == NULL)
344 fatal("can't create sys.path");
345 if (sysset("path", v) != 0)
346 fatal("can't assign sys.path");
347 DECREF(v);
348}
349
350static object *
351makeargvobject(argc, argv)
352 int argc;
353 char **argv;
354{
355 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000356 if (argc <= 0 || argv == NULL) {
357 /* Ensure at least one (empty) argument is seen */
358 static char *empty_argv[1] = {""};
359 argv = empty_argv;
360 argc = 1;
361 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362 av = newlistobject(argc);
363 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000364 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000365 for (i = 0; i < argc; i++) {
366 object *v = newstringobject(argv[i]);
367 if (v == NULL) {
368 DECREF(av);
369 av = NULL;
370 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000371 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000373 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000374 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375 return av;
376}
377
378void
379setpythonargv(argc, argv)
380 int argc;
381 char **argv;
382{
383 object *av = makeargvobject(argc, argv);
Guido van Rossum94a96671996-07-30 20:35:50 +0000384 object *path = sysget("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 if (av == NULL)
386 fatal("no mem for sys.argv");
387 if (sysset("argv", av) != 0)
388 fatal("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000389 if (path != NULL) {
390 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000391 int n = 0;
Guido van Rossum94a96671996-07-30 20:35:50 +0000392 object *a;
Guido van Rossumcc883411996-09-10 14:44:21 +0000393#if SEP == '\\' /* Special case for MS filename syntax */
394 if (argc > 0 && argv[0] != NULL) {
395 char *q;
396 p = strrchr(argv[0], SEP);
397 /* Test for alternate separator */
398 q = strrchr(p ? p : argv[0], '/');
399 if (q != NULL)
400 p = q;
401 if (p != NULL) {
402 n = p + 1 - argv[0];
403 if (n > 1 && p[-1] != ':')
404 n--; /* Drop trailing separator */
405 }
406 }
407#else /* All other filename syntaxes */
Guido van Rossum94a96671996-07-30 20:35:50 +0000408 if (argc > 0 && argv[0] != NULL)
409 p = strrchr(argv[0], SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000410 if (p != NULL) {
Guido van Rossum94a96671996-07-30 20:35:50 +0000411 n = p + 1 - argv[0];
Guido van Rossumcc883411996-09-10 14:44:21 +0000412#if SEP == '/' /* Special case for Unix filename syntax */
413 if (n > 1)
414 n--; /* Drop trailing separator */
415#endif /* Unix */
416 }
417#endif /* All others */
Guido van Rossum94a96671996-07-30 20:35:50 +0000418 a = newsizedstringobject(argv[0], n);
419 if (a == NULL)
420 fatal("no mem for sys.path insertion");
421 if (inslistitem(path, 0, a) < 0)
422 fatal("sys.path.insert(0) failed");
423 DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000424 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}