diff options
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r-- | Python/sysmodule.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c new file mode 100644 index 0000000..845ccfc --- /dev/null +++ b/Python/sysmodule.c @@ -0,0 +1,156 @@ +/* System module */ + +/* +Various bits of information used by the interpreter are collected in +module 'sys'. +Data members: +- stdin, stdout, stderr: standard file objects +- ps1, ps2: primary and secondary prompts (strings) +- path: module search path (list of strings) +- modules: the table of modules (dictionary) +Function members: +- exit(sts): call exit() +*/ + +#include <stdio.h> + +#include "PROTO.h" +#include "object.h" +#include "stringobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "fileobject.h" +#include "moduleobject.h" +#include "sysmodule.h" +#include "node.h" /* For context.h */ +#include "context.h" /* For import.h */ +#include "import.h" +#include "methodobject.h" +#include "modsupport.h" +#include "errors.h" + +static object *sysdict; + +object * +sysget(name) + char *name; +{ + return dictlookup(sysdict, name); +} + +FILE * +sysgetfile(name, def) + char *name; + FILE *def; +{ + FILE *fp = NULL; + object *v = sysget(name); + if (v != NULL) + fp = getfilefile(v); + if (fp == NULL) + fp = def; + return fp; +} + +int +sysset(name, v) + char *name; + object *v; +{ + if (v == NULL) + return dictremove(sysdict, name); + else + return dictinsert(sysdict, name, v); +} + +static object * +makeargv(argc, argv) + int argc; + char **argv; +{ + int i; + object *av, *v; + if (argc < 0 || argv == NULL) + argc = 0; + av = newlistobject(argc); + if (av != NULL) { + for (i = 0; i < argc; i++) { + v = newstringobject(argv[i]); + if (v == NULL) { + DECREF(av); + av = NULL; + break; + } + setlistitem(av, i, v); + } + } + if (av == NULL) + fatal("no mem for sys.argv"); + return av; +} + +/* sys.exit method */ + +static object * +sys_exit(self, args) + object *self; + object *args; +{ + int sts; + if (!getintarg(args, &sts)) + return NULL; + goaway(sts); + exit(sts); /* Just in case */ + /* NOTREACHED */ +} + +static object *sysin, *sysout, *syserr; + +void +initsys(argc, argv) + int argc; + char **argv; +{ + object *v; + object *exit; + if ((sysdict = newdictobject()) == NULL) + fatal("can't create sys dict"); + /* NB keep an extra ref to the std files to avoid closing them + when the user deletes them */ + sysin = newopenfileobject(stdin, "<stdin>", "r"); + sysout = newopenfileobject(stdout, "<stdout>", "w"); + syserr = newopenfileobject(stderr, "<stderr>", "w"); + v = makeargv(argc, argv); + exit = newmethodobject("exit", sys_exit, (object *)NULL); + if (err_occurred()) + fatal("can't create sys.* objects"); + dictinsert(sysdict, "stdin", sysin); + dictinsert(sysdict, "stdout", sysout); + dictinsert(sysdict, "stderr", syserr); + dictinsert(sysdict, "argv", v); + dictinsert(sysdict, "exit", exit); + if (err_occurred()) + fatal("can't insert sys.* objects in sys dict"); + DECREF(v); + /* The other symbols are added elsewhere */ + + /* Only now can we initialize the import stuff, after which + we can turn ourselves into a module */ + initimport(); + if ((v = new_module("sys")) == NULL) + fatal("can't create sys module"); + if (setmoduledict(v, sysdict) != 0) + fatal("can't assign sys dict to sys module"); +} + +void +closesys() +{ + object *mtab; + mtab = sysget("modules"); + if (mtab != NULL && is_dictobject(mtab)) + dictremove(mtab, "sys"); /* Get rid of recursion */ + else + fprintf(stderr, "[module sys not found]\n"); + DECREF(sysdict); +} |