static object * amigalibs_addr(object *self, object *arg) { if(arg) { if(PyInt_Check(arg)) return newintobject((long) &((PyIntObject*)arg)->ob_ival); else if(PyFloat_Check(arg)) return newintobject((long) &((PyFloatObject*)arg)->ob_fval); else if(PyString_Check(arg)) return newintobject((long) &((PyStringObject*)arg)->ob_sval); else if(arg==Py_None) return newintobject(0); } return (object*)PyErr_BadArgument(); }
void init_all(int argc, char **argv) { // process command line arguments char *filename = NULL; FILE *fp = stdin; EmObject *ob; if (argc > 1) filename = argv[1]; if (filename != NULL) { if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "Cannot open file %s\n", filename); exit(1); } source.type = SOURCE_TYPE_FILE; } else { source.type = SOURCE_TYPE_PROMPT; } source.filename = filename; source.fp = fp; // Constant hash table literalTable = newhashobject(); // Add commonly used literals ob = newintobject(1); hashobject_insert_by_string(literalTable, "1", ob); DECREF(ob); ob = newintobject(-1); hashobject_insert_by_string(literalTable, "-1", ob); DECREF(ob); ob = newintobject(0); hashobject_insert_by_string(literalTable, "0", ob); DECREF(ob); ob = newstringobject("*"); hashobject_insert_by_string(literalTable, "*", ob); DECREF(ob); hashobject_insert_by_string(literalTable, "null", &nulobj); // initialize the lexer lexer_init(); // initialize the VM vm_init(); }
static object * lib_getattr(amigalibobject *ao, char *name) { if (strcmp(name, "base") == 0) return newintobject((long)ao->libbase); if (strcmp(name, "version") == 0) return mkvalue("(ii)", ao->libbase->lib_Version, ao->libbase->lib_Revision); return findmethod(lib_methods, (object *)ao, name); }
static object * amigalibs_obj2reg(object *self, object *arg) { ULONG res; if(!arg) return (object*) PyErr_BadArgument(); if(obj2reg(arg, &res)) return newintobject(res); else { err_setstr(TypeError, "can't convert type to register ULONG"); return NULL; } }
/* ** CALL - perform library call */ static object * lib_call(amigalibobject *self, object *args) // call { object *dic; int LVO_value; ULONG regspec, orig_regspec; int pos=0; object *key, *value; /* the registers: */ ULONG reg[16]; if (!newgetargs(args, "(ii)O", &LVO_value, ®spec, &dic)) return NULL; if(!PyDict_Check(dic)) { err_setstr(TypeError, "2nd arg must be dictionary"); return NULL; } if(LVO_value>-30 || LVO_value%2) { err_setstr(ValueError, "illegal LVO value"); return NULL; } if(regspec<0 || regspec >0xFFFF) { err_setstr(ValueError, "illegal regspec"); return NULL; } orig_regspec=regspec; while(PyDict_Next(dic,&pos,&key,&value)) { int regnr = PyInt_AsLong(key); if(!PyInt_Check(key) || regnr<0 || regnr>15) { err_setstr(ValueError, "illegal key/regnr."); return NULL; } else { ULONG regval; if(!obj2reg(value,®val)) { err_setstr(ValueError, "illegal register value"); return NULL; } /* OK: the register `regnr' must get the value `regval' */ /* Check if register regnr indeed must get a value */ if(regspec & (1<<regnr)) { /* Yes, put value in register & clear register bit */ reg[regnr]=regval; regspec &= ~(1<<regnr); } else { err_setstr(ValueError, "registers not consistent with LVO spec"); return NULL; } } } /* Are there still registers to assign a value to? */ if(regspec) { err_setstr(ValueError, "too few arguments provided"); return NULL; } /* XXXX TODO: SHOULD PASS ARGUMENTS ALSO */ return newintobject( amigalibs_calllib(self->libbase, LVO_value,orig_regspec,reg)); }