blob: 5fc098d527bf3510c6d511c321d2f8a729ed8034 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* System module */
26
27/*
28Various bits of information used by the interpreter are collected in
29module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +000030Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +000031- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032Data members:
33- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000035- path: module search path (list of strings)
36- argv: script arguments (list of strings)
37- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038*/
39
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042#include "sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044#include "modsupport.h"
Guido van Rossume2437a11992-03-23 18:20:18 +000045#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000046
Guido van Rossume2437a11992-03-23 18:20:18 +000047object *sys_trace, *sys_profile;
Guido van Rossum9a1f3881995-03-30 11:01:58 +000048int sys_checkinterval = 10;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
50static object *sysdict;
51
52object *
53sysget(name)
54 char *name;
55{
56 return dictlookup(sysdict, name);
57}
58
59FILE *
60sysgetfile(name, def)
61 char *name;
62 FILE *def;
63{
64 FILE *fp = NULL;
65 object *v = sysget(name);
Guido van Rossum3165fe61992-09-25 21:59:05 +000066 if (v != NULL && is_fileobject(v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 fp = getfilefile(v);
68 if (fp == NULL)
69 fp = def;
70 return fp;
71}
72
73int
74sysset(name, v)
75 char *name;
76 object *v;
77{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000078 if (v == NULL) {
79 if (dictlookup(sysdict, name) == NULL)
80 return 0;
81 else
82 return dictremove(sysdict, name);
83 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084 else
85 return dictinsert(sysdict, name, v);
86}
87
88static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089sys_exit(self, args)
90 object *self;
91 object *args;
92{
Guido van Rossum6a468bf1991-12-31 13:15:35 +000093 /* Raise SystemExit so callers may catch it or clean up. */
94 err_setval(SystemExit, args);
95 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096}
97
Guido van Rossume2437a11992-03-23 18:20:18 +000098static object *
99sys_settrace(self, args)
100 object *self;
101 object *args;
102{
103 if (args == None)
104 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000105 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000106 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000107 XDECREF(sys_trace);
Guido van Rossume2437a11992-03-23 18:20:18 +0000108 sys_trace = args;
109 INCREF(None);
110 return None;
111}
112
113static object *
114sys_setprofile(self, args)
115 object *self;
116 object *args;
117{
118 if (args == None)
119 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000120 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000121 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000122 XDECREF(sys_profile);
Guido van Rossume2437a11992-03-23 18:20:18 +0000123 sys_profile = args;
124 INCREF(None);
125 return None;
126}
127
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000128static object *
129sys_setcheckinterval(self, args)
130 object *self;
131 object *args;
132{
133 if (!newgetargs(args, "i", &sys_checkinterval))
134 return NULL;
135 INCREF(None);
136 return None;
137}
138
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000139#ifdef USE_MALLOPT
140/* Link with -lmalloc (or -lmpc) on an SGI */
141#include <malloc.h>
142
143static object *
144sys_mdebug(self, args)
145 object *self;
146 object *args;
147{
148 int flag;
149 if (!getargs(args, "i", &flag))
150 return NULL;
151 mallopt(M_DEBUG, flag);
152 INCREF(None);
153 return None;
154}
155#endif /* USE_MALLOPT */
156
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000157static object *
158sys_getrefcount(self, args)
159 object *self;
160 object *args;
161{
162 object *arg;
163 if (!getargs(args, "O", &arg))
164 return NULL;
165 return newintobject((long) arg->ob_refcnt);
166}
167
168#ifdef COUNT_ALLOCS
169static PyObject *
170sys_getcounts(self, args)
171 PyObject *self, *args;
172{
173 extern PyObject *get_counts Py_PROTO((void));
174
175 if (!PyArg_Parse(args, ""))
176 return NULL;
177 return get_counts();
178}
179#endif
180
181#ifdef TRACE_REFS
182extern PyObject *getobjects Py_PROTO((PyObject *, PyObject *));
183#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000184static struct methodlist sys_methods[] = {
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000185 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000186 {"getrefcount", sys_getrefcount, 0},
187#ifdef COUNT_ALLOCS
188 {"getcounts", sys_getcounts, 0},
189#endif
190#ifdef TRACE_REFS
191 {"getobjects", getobjects, 1},
192#endif
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000193#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000194 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000195#endif
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000196 {"setprofile", sys_setprofile, 0},
197 {"settrace", sys_settrace, 0},
198 {"setcheckinterval", sys_setcheckinterval, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199 {NULL, NULL} /* sentinel */
200};
201
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202static object *sysin, *sysout, *syserr;
203
Guido van Rossum34679b71993-01-26 13:33:44 +0000204static object *
205list_builtin_module_names()
206{
207 object *list = newlistobject(0);
208 int i;
209 if (list == NULL)
210 return NULL;
211 for (i = 0; inittab[i].name != NULL; i++) {
212 object *name = newstringobject(inittab[i].name);
213 if (name == NULL)
214 break;
215 addlistitem(list, name);
216 DECREF(name);
217 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000218 if (sortlist(list) != 0) {
219 DECREF(list);
220 list = NULL;
221 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000222 return list;
223}
224
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226initsys()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000228 extern long getmaxint PROTO((void));
229 extern char *getversion PROTO((void));
230 extern char *getcopyright PROTO((void));
Guido van Rossumaaf18391995-07-07 22:45:02 +0000231 extern char *getplatform PROTO((void));
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000232 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000234 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235 sysdict = getmoduledict(m);
236 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 /* NB keep an extra ref to the std files to avoid closing them
238 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000239 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
240 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
241 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000243 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 dictinsert(sysdict, "stdin", sysin);
245 dictinsert(sysdict, "stdout", sysout);
246 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000247 dictinsert(sysdict, "version", v = newstringobject(getversion()));
248 XDECREF(v);
249 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
250 XDECREF(v);
Guido van Rossumaaf18391995-07-07 22:45:02 +0000251 dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
252 XDECREF(v);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000253 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
254 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000255 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000256 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000257 v = list_builtin_module_names());
258 XDECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 if (err_occurred())
260 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000261}
262
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263static object *
264makepathobject(path, delim)
265 char *path;
266 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000267{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 int i, n;
269 char *p;
270 object *v, *w;
271
272 n = 1;
273 p = path;
274 while ((p = strchr(p, delim)) != NULL) {
275 n++;
276 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000277 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000278 v = newlistobject(n);
279 if (v == NULL)
280 return NULL;
281 for (i = 0; ; i++) {
282 p = strchr(path, delim);
283 if (p == NULL)
284 p = strchr(path, '\0'); /* End of string */
285 w = newsizedstringobject(path, (int) (p - path));
286 if (w == NULL) {
287 DECREF(v);
288 return NULL;
289 }
290 setlistitem(v, i, w);
291 if (*p == '\0')
292 break;
293 path = p+1;
294 }
295 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296}
297
298void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000299setpythonpath(path)
300 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 object *v;
303 if ((v = makepathobject(path, DELIM)) == NULL)
304 fatal("can't create sys.path");
305 if (sysset("path", v) != 0)
306 fatal("can't assign sys.path");
307 DECREF(v);
308}
309
310static object *
311makeargvobject(argc, argv)
312 int argc;
313 char **argv;
314{
315 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000316 if (argc <= 0 || argv == NULL) {
317 /* Ensure at least one (empty) argument is seen */
318 static char *empty_argv[1] = {""};
319 argv = empty_argv;
320 argc = 1;
321 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 av = newlistobject(argc);
323 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000324 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325 for (i = 0; i < argc; i++) {
326 object *v = newstringobject(argv[i]);
327 if (v == NULL) {
328 DECREF(av);
329 av = NULL;
330 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000331 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000333 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000334 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 return av;
336}
337
338void
339setpythonargv(argc, argv)
340 int argc;
341 char **argv;
342{
343 object *av = makeargvobject(argc, argv);
344 if (av == NULL)
345 fatal("no mem for sys.argv");
346 if (sysset("argv", av) != 0)
347 fatal("can't assign sys.argv");
348 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}