sysmodule.c revision 1ae940a5870df2f706fa884afd533847f6b0b1a8
1/***********************************************************
2Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
4
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
25/* System module */
26
27/*
28Various bits of information used by the interpreter are collected in
29module 'sys'.
30Function member:
31- exit(sts): call (C, POSIX) exit(sts)
32Data members:
33- stdin, stdout, stderr: standard file objects
34- modules: the table of modules (dictionary)
35- path: module search path (list of strings)
36- argv: script arguments (list of strings)
37- ps1, ps2: optional primary and secondary prompts (strings)
38*/
39
40#include "allobjects.h"
41
42#include "sysmodule.h"
43#include "import.h"
44#include "modsupport.h"
45#include "osdefs.h"
46
47object *sys_trace, *sys_profile;
48
49static object *sysdict;
50
51object *
52sysget(name)
53	char *name;
54{
55	return dictlookup(sysdict, name);
56}
57
58FILE *
59sysgetfile(name, def)
60	char *name;
61	FILE *def;
62{
63	FILE *fp = NULL;
64	object *v = sysget(name);
65	if (v != NULL && is_fileobject(v))
66		fp = getfilefile(v);
67	if (fp == NULL)
68		fp = def;
69	return fp;
70}
71
72int
73sysset(name, v)
74	char *name;
75	object *v;
76{
77	if (v == NULL) {
78		if (dictlookup(sysdict, name) == NULL)
79			return 0;
80		else
81			return dictremove(sysdict, name);
82	}
83	else
84		return dictinsert(sysdict, name, v);
85}
86
87static object *
88sys_exit(self, args)
89	object *self;
90	object *args;
91{
92	/* Raise SystemExit so callers may catch it or clean up. */
93	err_setval(SystemExit, args);
94	return NULL;
95}
96
97static object *
98sys_settrace(self, args)
99	object *self;
100	object *args;
101{
102	if (args == None)
103		args = NULL;
104	else
105		XINCREF(args);
106	XDECREF(sys_trace);
107	sys_trace = args;
108	INCREF(None);
109	return None;
110}
111
112static object *
113sys_setprofile(self, args)
114	object *self;
115	object *args;
116{
117	if (args == None)
118		args = NULL;
119	else
120		XINCREF(args);
121	XDECREF(sys_profile);
122	sys_profile = args;
123	INCREF(None);
124	return None;
125}
126
127#ifdef USE_MALLOPT
128/* Link with -lmalloc (or -lmpc) on an SGI */
129#include <malloc.h>
130
131static object *
132sys_mdebug(self, args)
133	object *self;
134	object *args;
135{
136	int flag;
137	if (!getargs(args, "i", &flag))
138		return NULL;
139	mallopt(M_DEBUG, flag);
140	INCREF(None);
141	return None;
142}
143#endif /* USE_MALLOPT */
144
145static struct methodlist sys_methods[] = {
146	{"exit",	sys_exit},
147#ifdef USE_MALLOPT
148	{"mdebug",	sys_mdebug},
149#endif
150	{"setprofile",	sys_setprofile},
151	{"settrace",	sys_settrace},
152	{NULL,		NULL}		/* sentinel */
153};
154
155static object *sysin, *sysout, *syserr;
156
157static object *
158list_builtin_module_names()
159{
160	object *list = newlistobject(0);
161	int i;
162	if (list == NULL)
163		return NULL;
164	for (i = 0; inittab[i].name != NULL; i++) {
165		object *name = newstringobject(inittab[i].name);
166		if (name == NULL)
167			break;
168		addlistitem(list, name);
169		DECREF(name);
170	}
171	if (sortlist(list) != 0) {
172		DECREF(list);
173		list = NULL;
174	}
175	return list;
176}
177
178void
179initsys()
180{
181	extern long getmaxint PROTO((void));
182	extern char *getversion PROTO((void));
183	extern char *getcopyright PROTO((void));
184	extern int fclose PROTO((FILE *));
185	object *m = initmodule("sys", sys_methods);
186	object *v;
187	sysdict = getmoduledict(m);
188	INCREF(sysdict);
189	/* NB keep an extra ref to the std files to avoid closing them
190	   when the user deletes them */
191	sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
192	sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
193	syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
194	if (err_occurred())
195		fatal("can't initialize sys.std{in,out,err}");
196	dictinsert(sysdict, "stdin", sysin);
197	dictinsert(sysdict, "stdout", sysout);
198	dictinsert(sysdict, "stderr", syserr);
199	dictinsert(sysdict, "version", v = newstringobject(getversion()));
200	XDECREF(v);
201	dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
202	XDECREF(v);
203	dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
204	XDECREF(v);
205	dictinsert(sysdict, "modules", get_modules());
206	dictinsert(sysdict, "builtin_module_names",
207		   v = list_builtin_module_names());
208	XDECREF(v);
209	if (err_occurred())
210		fatal("can't insert sys.* objects in sys dict");
211}
212
213static object *
214makepathobject(path, delim)
215	char *path;
216	int delim;
217{
218	int i, n;
219	char *p;
220	object *v, *w;
221
222	n = 1;
223	p = path;
224	while ((p = strchr(p, delim)) != NULL) {
225		n++;
226		p++;
227	}
228	v = newlistobject(n);
229	if (v == NULL)
230		return NULL;
231	for (i = 0; ; i++) {
232		p = strchr(path, delim);
233		if (p == NULL)
234			p = strchr(path, '\0'); /* End of string */
235		w = newsizedstringobject(path, (int) (p - path));
236		if (w == NULL) {
237			DECREF(v);
238			return NULL;
239		}
240		setlistitem(v, i, w);
241		if (*p == '\0')
242			break;
243		path = p+1;
244	}
245	return v;
246}
247
248void
249setpythonpath(path)
250	char *path;
251{
252	object *v;
253	if ((v = makepathobject(path, DELIM)) == NULL)
254		fatal("can't create sys.path");
255	if (sysset("path", v) != 0)
256		fatal("can't assign sys.path");
257	DECREF(v);
258}
259
260static object *
261makeargvobject(argc, argv)
262	int argc;
263	char **argv;
264{
265	object *av;
266	if (argc <= 0 || argv == NULL) {
267		/* Ensure at least one (empty) argument is seen */
268		static char *empty_argv[1] = {""};
269		argv = empty_argv;
270		argc = 1;
271	}
272	av = newlistobject(argc);
273	if (av != NULL) {
274		int i;
275		for (i = 0; i < argc; i++) {
276			object *v = newstringobject(argv[i]);
277			if (v == NULL) {
278				DECREF(av);
279				av = NULL;
280				break;
281			}
282			setlistitem(av, i, v);
283		}
284	}
285	return av;
286}
287
288void
289setpythonargv(argc, argv)
290	int argc;
291	char **argv;
292{
293	object *av = makeargvobject(argc, argv);
294	if (av == NULL)
295		fatal("no mem for sys.argv");
296	if (sysset("argv", av) != 0)
297		fatal("can't assign sys.argv");
298	DECREF(av);
299}
300