|
6
|
1 /* System module */
|
|
|
2
|
|
|
3 /*
|
|
|
4 Various bits of information used by the interpreter are collected in
|
|
|
5 module 'sys'.
|
|
|
6 Data 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)
|
|
|
11 Function 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
|
|
|
32 static object *sysdict;
|
|
|
33
|
|
|
34 object *
|
|
|
35 sysget(name)
|
|
|
36 char *name;
|
|
|
37 {
|
|
|
38 return dictlookup(sysdict, name);
|
|
|
39 }
|
|
|
40
|
|
|
41 FILE *
|
|
|
42 sysgetfile(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
|
|
|
55 int
|
|
|
56 sysset(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
|
|
|
66 static object *
|
|
|
67 makeargv(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
|
|
|
94 static object *
|
|
|
95 sys_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
|
|
|
107 static object *sysin, *sysout, *syserr;
|
|
|
108
|
|
|
109 void
|
|
|
110 initsys(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
|
|
|
146 void
|
|
|
147 closesys()
|
|
|
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 }
|