blob: 845ccfca56f3ff5202fa5e46e687153f7b48bced [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* System module */
2
3/*
4Various bits of information used by the interpreter are collected in
5module 'sys'.
6Data members:
7- stdin, stdout, stderr: standard file objects
8- ps1, ps2: primary and secondary prompts (strings)
9- path: module search path (list of strings)
10- modules: the table of modules (dictionary)
11Function members:
12- exit(sts): call exit()
13*/
14
15#include <stdio.h>
16
17#include "PROTO.h"
18#include "object.h"
19#include "stringobject.h"
20#include "listobject.h"
21#include "dictobject.h"
22#include "fileobject.h"
23#include "moduleobject.h"
24#include "sysmodule.h"
25#include "node.h" /* For context.h */
26#include "context.h" /* For import.h */
27#include "import.h"
28#include "methodobject.h"
29#include "modsupport.h"
30#include "errors.h"
31
32static object *sysdict;
33
34object *
35sysget(name)
36 char *name;
37{
38 return dictlookup(sysdict, name);
39}
40
41FILE *
42sysgetfile(name, def)
43 char *name;
44 FILE *def;
45{
46 FILE *fp = NULL;
47 object *v = sysget(name);
48 if (v != NULL)
49 fp = getfilefile(v);
50 if (fp == NULL)
51 fp = def;
52 return fp;
53}
54
55int
56sysset(name, v)
57 char *name;
58 object *v;
59{
60 if (v == NULL)
61 return dictremove(sysdict, name);
62 else
63 return dictinsert(sysdict, name, v);
64}
65
66static object *
67makeargv(argc, argv)
68 int argc;
69 char **argv;
70{
71 int i;
72 object *av, *v;
73 if (argc < 0 || argv == NULL)
74 argc = 0;
75 av = newlistobject(argc);
76 if (av != NULL) {
77 for (i = 0; i < argc; i++) {
78 v = newstringobject(argv[i]);
79 if (v == NULL) {
80 DECREF(av);
81 av = NULL;
82 break;
83 }
84 setlistitem(av, i, v);
85 }
86 }
87 if (av == NULL)
88 fatal("no mem for sys.argv");
89 return av;
90}
91
92/* sys.exit method */
93
94static object *
95sys_exit(self, args)
96 object *self;
97 object *args;
98{
99 int sts;
100 if (!getintarg(args, &sts))
101 return NULL;
102 goaway(sts);
103 exit(sts); /* Just in case */
104 /* NOTREACHED */
105}
106
107static object *sysin, *sysout, *syserr;
108
109void
110initsys(argc, argv)
111 int argc;
112 char **argv;
113{
114 object *v;
115 object *exit;
116 if ((sysdict = newdictobject()) == NULL)
117 fatal("can't create sys dict");
118 /* NB keep an extra ref to the std files to avoid closing them
119 when the user deletes them */
120 sysin = newopenfileobject(stdin, "<stdin>", "r");
121 sysout = newopenfileobject(stdout, "<stdout>", "w");
122 syserr = newopenfileobject(stderr, "<stderr>", "w");
123 v = makeargv(argc, argv);
124 exit = newmethodobject("exit", sys_exit, (object *)NULL);
125 if (err_occurred())
126 fatal("can't create sys.* objects");
127 dictinsert(sysdict, "stdin", sysin);
128 dictinsert(sysdict, "stdout", sysout);
129 dictinsert(sysdict, "stderr", syserr);
130 dictinsert(sysdict, "argv", v);
131 dictinsert(sysdict, "exit", exit);
132 if (err_occurred())
133 fatal("can't insert sys.* objects in sys dict");
134 DECREF(v);
135 /* The other symbols are added elsewhere */
136
137 /* Only now can we initialize the import stuff, after which
138 we can turn ourselves into a module */
139 initimport();
140 if ((v = new_module("sys")) == NULL)
141 fatal("can't create sys module");
142 if (setmoduledict(v, sysdict) != 0)
143 fatal("can't assign sys dict to sys module");
144}
145
146void
147closesys()
148{
149 object *mtab;
150 mtab = sysget("modules");
151 if (mtab != NULL && is_dictobject(mtab))
152 dictremove(mtab, "sys"); /* Get rid of recursion */
153 else
154 fprintf(stderr, "[module sys not found]\n");
155 DECREF(sysdict);
156}