static int write_db_file(const char *reason) { Objid oid; Objid max_oid = db_last_used_objid(); Verbdef *v; Var user_list; int i; volatile int nprogs = 0; volatile int success = 1; for (oid = 0; oid <= max_oid; oid++) { if (valid(oid)) for (v = dbpriv_find_object(oid)->verbdefs; v; v = v->next) if (v->program) nprogs++; } user_list = db_all_users(); TRY { dbio_printf(header_format_string, current_db_version); dbio_printf("%d\n%d\n%d\n%d\n", max_oid + 1, nprogs, 0, user_list.v.list[0].v.num); for (i = 1; i <= user_list.v.list[0].v.num; i++) dbio_write_objid(user_list.v.list[i].v.obj); oklog("%s: Writing %d objects...\n", reason, max_oid + 1); for (oid = 0; oid <= max_oid; oid++) { write_object(oid); if (oid == max_oid || log_report_progress()) oklog("%s: Done writing %d objects...\n", reason, oid + 1); } oklog("%s: Writing %d MOO verb programs...\n", reason, nprogs); for (i = 0, oid = 0; oid <= max_oid; oid++) if (valid(oid)) { int vcount = 0; for (v = dbpriv_find_object(oid)->verbdefs; v; v = v->next) { if (v->program) { dbio_printf("#%d:%d\n", oid, vcount); dbio_write_program(v->program); if (++i == nprogs || log_report_progress()) oklog("%s: Done writing %d verb programs...\n", reason, i); } vcount++; } } oklog("%s: Writing forked and suspended tasks...\n", reason); write_task_queue(); oklog("%s: Writing list of formerly active connections...\n", reason); write_active_connections(); } EXCEPT(dbpriv_dbio_failed) success = 0; ENDTRY; return success; }
static void write_object(Objid oid) { Object *o; Verbdef *v; int i; int nverbdefs, nprops; if (!valid(oid)) { dbio_printf("#%d recycled\n", oid); return; } o = dbpriv_find_object(oid); dbio_printf("#%d\n", oid); dbio_write_string(o->name); dbio_write_string(""); /* placeholder for old handles string */ dbio_write_num(o->flags); dbio_write_objid(o->owner); dbio_write_objid(o->location); dbio_write_objid(o->contents); dbio_write_objid(o->next); dbio_write_objid(o->parent); dbio_write_objid(o->child); dbio_write_objid(o->sibling); for (v = o->verbdefs, nverbdefs = 0; v; v = v->next) nverbdefs++; dbio_write_num(nverbdefs); for (v = o->verbdefs; v; v = v->next) write_verbdef(v); dbio_write_num(o->propdefs.cur_length); for (i = 0; i < o->propdefs.cur_length; i++) write_propdef(&o->propdefs.l[i]); nprops = dbpriv_count_properties(oid); dbio_write_num(nprops); for (i = 0; i < nprops; i++) write_propval(o->propval + i); }
void dbio_write_float(double d) { static const char *fmt = 0; static char buffer[10]; if (!fmt) { sprintf(buffer, "%%.%dg\n", DBL_DIG + 4); fmt = buffer; } dbio_printf(fmt, d); }
void write_vm(vm the_vm) { unsigned i; dbio_printf("%u %d %u %u\n", the_vm->top_activ_stack, the_vm->root_activ_vector, the_vm->func_id, the_vm->max_stack_size); for (i = 0; i <= the_vm->top_activ_stack; i++) write_activ(the_vm->activ_stack[i]); }
void dbio_write_forked_program(Program * program, int f_index) { unparse_program(program, receiver, 0, 1, 0, f_index); dbio_printf(".\n"); }
void dbio_write_program(Program * program) { unparse_program(program, receiver, 0, 1, 0, MAIN_VECTOR); dbio_printf(".\n"); }
static void receiver(void *data, const char *line) { dbio_printf("%s\n", line); }
void dbio_write_string(const char *s) { dbio_printf("%s\n", s ? s : ""); }
void dbio_write_num(int n) { dbio_printf("%d\n", n); }