blob: 6e153e45946a5bd947887fa32633cf877c1b9bf7 [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
Guido van Rossum3f5da241990-12-20 15:06:42 +0000157static struct methodlist sys_methods[] = {
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000158 {"exit", sys_exit, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000159#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000160 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000161#endif
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000162 {"setprofile", sys_setprofile, 0},
163 {"settrace", sys_settrace, 0},
164 {"setcheckinterval", sys_setcheckinterval, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000165 {NULL, NULL} /* sentinel */
166};
167
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168static object *sysin, *sysout, *syserr;
169
Guido van Rossum34679b71993-01-26 13:33:44 +0000170static object *
171list_builtin_module_names()
172{
173 object *list = newlistobject(0);
174 int i;
175 if (list == NULL)
176 return NULL;
177 for (i = 0; inittab[i].name != NULL; i++) {
178 object *name = newstringobject(inittab[i].name);
179 if (name == NULL)
180 break;
181 addlistitem(list, name);
182 DECREF(name);
183 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000184 if (sortlist(list) != 0) {
185 DECREF(list);
186 list = NULL;
187 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000188 return list;
189}
190
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000192initsys()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000194 extern long getmaxint PROTO((void));
195 extern char *getversion PROTO((void));
196 extern char *getcopyright PROTO((void));
Guido van Rossumaaf18391995-07-07 22:45:02 +0000197 extern char *getplatform PROTO((void));
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000198 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000200 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201 sysdict = getmoduledict(m);
202 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 /* NB keep an extra ref to the std files to avoid closing them
204 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000205 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
206 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
207 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000209 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 dictinsert(sysdict, "stdin", sysin);
211 dictinsert(sysdict, "stdout", sysout);
212 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000213 dictinsert(sysdict, "version", v = newstringobject(getversion()));
214 XDECREF(v);
215 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
216 XDECREF(v);
Guido van Rossumaaf18391995-07-07 22:45:02 +0000217 dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
218 XDECREF(v);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000219 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
220 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000222 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000223 v = list_builtin_module_names());
224 XDECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 if (err_occurred())
226 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000227}
228
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229static object *
230makepathobject(path, delim)
231 char *path;
232 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000233{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 int i, n;
235 char *p;
236 object *v, *w;
237
238 n = 1;
239 p = path;
240 while ((p = strchr(p, delim)) != NULL) {
241 n++;
242 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000243 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244 v = newlistobject(n);
245 if (v == NULL)
246 return NULL;
247 for (i = 0; ; i++) {
248 p = strchr(path, delim);
249 if (p == NULL)
250 p = strchr(path, '\0'); /* End of string */
251 w = newsizedstringobject(path, (int) (p - path));
252 if (w == NULL) {
253 DECREF(v);
254 return NULL;
255 }
256 setlistitem(v, i, w);
257 if (*p == '\0')
258 break;
259 path = p+1;
260 }
261 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
264void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265setpythonpath(path)
266 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 object *v;
269 if ((v = makepathobject(path, DELIM)) == NULL)
270 fatal("can't create sys.path");
271 if (sysset("path", v) != 0)
272 fatal("can't assign sys.path");
273 DECREF(v);
274}
275
276static object *
277makeargvobject(argc, argv)
278 int argc;
279 char **argv;
280{
281 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000282 if (argc <= 0 || argv == NULL) {
283 /* Ensure at least one (empty) argument is seen */
284 static char *empty_argv[1] = {""};
285 argv = empty_argv;
286 argc = 1;
287 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 av = newlistobject(argc);
289 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000290 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 for (i = 0; i < argc; i++) {
292 object *v = newstringobject(argv[i]);
293 if (v == NULL) {
294 DECREF(av);
295 av = NULL;
296 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000297 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000299 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000300 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 return av;
302}
303
304void
305setpythonargv(argc, argv)
306 int argc;
307 char **argv;
308{
309 object *av = makeargvobject(argc, argv);
310 if (av == NULL)
311 fatal("no mem for sys.argv");
312 if (sysset("argv", av) != 0)
313 fatal("can't assign sys.argv");
314 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}