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