static void read_propval(Pval * p) { p->var = dbio_read_var(); p->owner = dbio_read_objid(); p->perms = dbio_read_num(); }
Var dbio_read_var(void) { Var r; int i, l = dbio_read_num(); if (l == (int) TYPE_ANY && dbio_input_version == DBV_Prehistory) l = TYPE_NONE; /* Old encoding for VM's empty temp register * and any as-yet unassigned variables. */ r.type = (var_type) l; switch (l) { case TYPE_CLEAR: case TYPE_NONE: break; case _TYPE_STR: r.v.str = dbio_read_string_intern(); r.type |= TYPE_COMPLEX_FLAG; break; case TYPE_OBJ: case TYPE_ERR: case TYPE_INT: case TYPE_CATCH: case TYPE_FINALLY: r.v.num = dbio_read_num(); break; case _TYPE_FLOAT: r = new_float(dbio_read_float()); break; case _TYPE_LIST: l = dbio_read_num(); r = new_list(l); for (i = 0; i < l; i++) r.v.list[i + 1] = dbio_read_var(); break; default: errlog("DBIO_READ_VAR: Unknown type (%d) at DB file pos. %ld\n", l, ftell(input)); r = zero; break; } return r; }
vm read_vm(int task_id) { unsigned i, top, func_id, max; int vector; char c; vm the_vm; Var local; if (dbio_input_version >= DBV_TaskLocal) local = dbio_read_var(); else local = new_map(); if (dbio_scanf("%u %d %u%c", &top, &vector, &func_id, &c) != 4 || (c == ' ' ? dbio_scanf("%u%c", &max, &c) != 2 || c != '\n' : (max = DEFAULT_MAX_STACK_DEPTH, c != '\n'))) { free_var(local); errlog("READ_VM: Bad vm header\n"); return 0; } the_vm = new_vm(task_id, local, top + 1); the_vm->max_stack_size = max; the_vm->top_activ_stack = top; the_vm->root_activ_vector = vector; the_vm->func_id = func_id; for (i = 0; i <= top; i++) if (!read_activ(&the_vm->activ_stack[i], i == 0 ? vector : MAIN_VECTOR)) { errlog("READ_VM: Bad activ number %d\n", i); return 0; } return the_vm; }