blob: 18ded1f6bd43bcc27603520e72ac44c20195de16 [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 Rossum3caa6e31991-06-04 19:40:59 +0000197 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000198 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000199 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200 sysdict = getmoduledict(m);
201 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 /* NB keep an extra ref to the std files to avoid closing them
203 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000204 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
205 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
206 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000208 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 dictinsert(sysdict, "stdin", sysin);
210 dictinsert(sysdict, "stdout", sysout);
211 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000212 dictinsert(sysdict, "version", v = newstringobject(getversion()));
213 XDECREF(v);
214 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
215 XDECREF(v);
216 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
217 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000219 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000220 v = list_builtin_module_names());
221 XDECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 if (err_occurred())
223 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000224}
225
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226static object *
227makepathobject(path, delim)
228 char *path;
229 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000230{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231 int i, n;
232 char *p;
233 object *v, *w;
234
235 n = 1;
236 p = path;
237 while ((p = strchr(p, delim)) != NULL) {
238 n++;
239 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000240 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 v = newlistobject(n);
242 if (v == NULL)
243 return NULL;
244 for (i = 0; ; i++) {
245 p = strchr(path, delim);
246 if (p == NULL)
247 p = strchr(path, '\0'); /* End of string */
248 w = newsizedstringobject(path, (int) (p - path));
249 if (w == NULL) {
250 DECREF(v);
251 return NULL;
252 }
253 setlistitem(v, i, w);
254 if (*p == '\0')
255 break;
256 path = p+1;
257 }
258 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259}
260
261void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000262setpythonpath(path)
263 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265 object *v;
266 if ((v = makepathobject(path, DELIM)) == NULL)
267 fatal("can't create sys.path");
268 if (sysset("path", v) != 0)
269 fatal("can't assign sys.path");
270 DECREF(v);
271}
272
273static object *
274makeargvobject(argc, argv)
275 int argc;
276 char **argv;
277{
278 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000279 if (argc <= 0 || argv == NULL) {
280 /* Ensure at least one (empty) argument is seen */
281 static char *empty_argv[1] = {""};
282 argv = empty_argv;
283 argc = 1;
284 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 av = newlistobject(argc);
286 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000287 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 for (i = 0; i < argc; i++) {
289 object *v = newstringobject(argv[i]);
290 if (v == NULL) {
291 DECREF(av);
292 av = NULL;
293 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000294 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000295 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000296 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000297 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 return av;
299}
300
301void
302setpythonargv(argc, argv)
303 int argc;
304 char **argv;
305{
306 object *av = makeargvobject(argc, argv);
307 if (av == NULL)
308 fatal("no mem for sys.argv");
309 if (sysset("argv", av) != 0)
310 fatal("can't assign sys.argv");
311 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312}