/* Module support implementation */ #include #include "PROTO.h" #include "object.h" #include "intobject.h" #include "stringobject.h" #include "tupleobject.h" #include "listobject.h" #include "methodobject.h" #include "moduleobject.h" #include "modsupport.h" #include "import.h" #include "errors.h" /* Find a method in a module's method table. Usually called from a module's getattr method. */ object * findmethod(ml, op, name) struct methodlist *ml; object *op; char *name; { for (; ml->ml_name != NULL; ml++) { if (strcmp(name, ml->ml_name) == 0) return newmethodobject(ml->ml_name, ml->ml_meth, op); } err_setstr(NameError, name); return NULL; } object * initmodule(name, methods) char *name; struct methodlist *methods; { object *m, *d, *v; struct methodlist *ml; if ((m = new_module(name)) == NULL) { fprintf(stderr, "initializing module: %s\n", name); fatal("can't create a module"); } d = getmoduledict(m); for (ml = methods; ml->ml_name != NULL; ml++) { v = newmethodobject(ml->ml_name, ml->ml_meth, (object *)NULL); if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) { fprintf(stderr, "initializing module: %s\n", name); fatal("can't initialize module"); } DECREF(v); } DECREF(m); return m; /* Yes, it still exists, in sys.modules... */ } /* Argument list handling tools. All return 1 for success, or call err_set*() and return 0 for failure */ int getnoarg(v) object *v; { if (v != NULL) { return err_badarg(); } return 1; } int getintarg(v, a) object *v; int *a; { if (v == NULL || !is_intobject(v)) { return err_badarg(); } *a = getintvalue(v); return 1; } int getintintarg(v, a, b) object *v; int *a; int *b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getintarg(gettupleitem(v, 0), a) && getintarg(gettupleitem(v, 1), b); } int getlongarg(v, a) object *v; long *a; { if (v == NULL || !is_intobject(v)) { return err_badarg(); } *a = getintvalue(v); return 1; } int getlonglongargs(v, a, b) object *v; long *a, *b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getlongarg(gettupleitem(v, 0), a) && getlongarg(gettupleitem(v, 1), b); } int getlonglongobjectargs(v, a, b, c) object *v; long *a, *b; object **c; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) { return err_badarg(); } if (getlongarg(gettupleitem(v, 0), a) && getlongarg(gettupleitem(v, 1), b)) { *c = gettupleitem(v, 2); return 1; } else { return err_badarg(); } } int getstrarg(v, a) object *v; object **a; { if (v == NULL || !is_stringobject(v)) { return err_badarg(); } *a = v; return 1; } int getstrstrarg(v, a, b) object *v; object **a; object **b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b); } int getstrstrintarg(v, a, b, c) object *v; object **a; object **b; int *c; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b) && getintarg(gettupleitem(v, 2), c); } int getstrintarg(v, a, b) object *v; object **a; int *b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getintarg(gettupleitem(v, 1), b); } int getintstrarg(v, a, b) object *v; int *a; object **b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getintarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b); } int getpointarg(v, a) object *v; int *a; /* [2] */ { return getintintarg(v, a, a+1); } int get3pointarg(v, a) object *v; int *a; /* [6] */ { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) { return err_badarg(); } return getpointarg(gettupleitem(v, 0), a) && getpointarg(gettupleitem(v, 1), a+2) && getpointarg(gettupleitem(v, 2), a+4); } int getrectarg(v, a) object *v; int *a; /* [2+2] */ { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getpointarg(gettupleitem(v, 0), a) && getpointarg(gettupleitem(v, 1), a+2); } int getrectintarg(v, a) object *v; int *a; /* [4+1] */ { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getrectarg(gettupleitem(v, 0), a) && getintarg(gettupleitem(v, 1), a+4); } int getpointintarg(v, a) object *v; int *a; /* [2+1] */ { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getpointarg(gettupleitem(v, 0), a) && getintarg(gettupleitem(v, 1), a+2); } int getpointstrarg(v, a, b) object *v; int *a; /* [2] */ object **b; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getpointarg(gettupleitem(v, 0), a) && getstrarg(gettupleitem(v, 1), b); } int getstrintintarg(v, a, b, c) object *v; object *a; int *b, *c; { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3) { return err_badarg(); } return getstrarg(gettupleitem(v, 0), a) && getintarg(gettupleitem(v, 1), b) && getintarg(gettupleitem(v, 2), c); } int getrectpointarg(v, a) object *v; int *a; /* [4+2] */ { if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) { return err_badarg(); } return getrectarg(gettupleitem(v, 0), a) && getpointarg(gettupleitem(v, 1), a+4); } int getlongtuplearg(args, a, n) object *args; long *a; /* [n] */ int n; { int i; if (!is_tupleobject(args) || gettuplesize(args) != n) { return err_badarg(); } for (i = 0; i < n; i++) { object *v = gettupleitem(args, i); if (!is_intobject(v)) { return err_badarg(); } a[i] = getintvalue(v); } return 1; } int getshorttuplearg(args, a, n) object *args; short *a; /* [n] */ int n; { int i; if (!is_tupleobject(args) || gettuplesize(args) != n) { return err_badarg(); } for (i = 0; i < n; i++) { object *v = gettupleitem(args, i); if (!is_intobject(v)) { return err_badarg(); } a[i] = getintvalue(v); } return 1; } int getlonglistarg(args, a, n) object *args; long *a; /* [n] */ int n; { int i; if (!is_listobject(args) || getlistsize(args) != n) { return err_badarg(); } for (i = 0; i < n; i++) { object *v = getlistitem(args, i); if (!is_intobject(v)) { return err_badarg(); } a[i] = getintvalue(v); } return 1; } int getshortlistarg(args, a, n) object *args; short *a; /* [n] */ int n; { int i; if (!is_listobject(args) || getlistsize(args) != n) { return err_badarg(); } for (i = 0; i < n; i++) { object *v = getlistitem(args, i); if (!is_intobject(v)) { return err_badarg(); } a[i] = getintvalue(v); } return 1; }