static package bf_delete_verb(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, verb-desc) */ Objid oid = arglist.v.list[1].v.obj; Var desc = arglist.v.list[2]; db_verb_handle h; enum error e; if ((e = validate_verb_descriptor(desc)) != E_NONE); /* Do nothing; e is already set. */ else if (!valid(oid)) e = E_INVARG; else if (!db_object_allows(oid, progr, FLAG_WRITE)) e = E_PERM; else { h = find_described_verb(oid, desc); if (h.ptr) db_delete_verb(h); else e = E_VERBNF; } free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static package bf_has_callable_verb(Var arglist, Byte next, void *vdata, Objid progr) { /* (object) */ Objid oid = arglist.v.list[1].v.obj; if (!valid(oid)) { free_var(arglist); return make_error_pack(E_INVARG); } else if (!db_object_allows(oid, progr, FLAG_READ)) { free_var(arglist); return make_error_pack(E_PERM); } else { db_verb_handle vh; Var result; vh = db_find_callable_verb(oid, arglist.v.list[2].v.str); if (vh.ptr) { result = new_list(1); result.v.list[1].type = TYPE_OBJ; result.v.list[1].v.obj = db_verb_definer(vh); } else { result = new_list(0); } free_var(arglist); return make_var_pack(result); } }
static package bf_add_verb(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, info, args) */ Objid oid = arglist.v.list[1].v.obj; Var info = arglist.v.list[2]; Var args = arglist.v.list[3]; Objid owner; unsigned flags; const char *names; db_arg_spec dobj, iobj; db_prep_spec prep; enum error e; if ((e = validate_verb_info(info, &owner, &flags, &names)) != E_NONE); /* Already failed */ else if ((e = validate_verb_args(args, &dobj, &prep, &iobj)) != E_NONE) free_str(names); else if (!valid(oid)) { free_str(names); e = E_INVARG; } else if (!db_object_allows(oid, progr, FLAG_WRITE) || (progr != owner && !is_wizard(progr))) { free_str(names); e = E_PERM; } else db_add_verb(oid, names, owner, flags, dobj, prep, iobj); free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static package bf_add_prop(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, prop-name, initial-value, initial-info) */ Objid oid = arglist.v.list[1].v.obj; const char *pname = arglist.v.list[2].v.str; Var value = arglist.v.list[3]; Var info = arglist.v.list[4]; Objid owner; unsigned flags; const char *new_name; enum error e; if ((e = validate_prop_info(info, &owner, &flags, &new_name)) != E_NONE); /* Already failed */ else if (new_name) e = E_TYPE; else if (!valid(oid)) e = E_INVARG; else if (!db_object_allows(oid, progr, FLAG_WRITE) || (progr != owner && !is_wizard(progr))) e = E_PERM; else if (!db_add_propdef(oid, pname, value, owner, flags)) e = E_INVARG; free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static package bf_delete_prop(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, prop-name) */ Objid oid = arglist.v.list[1].v.obj; const char *pname = arglist.v.list[2].v.str; enum error e = E_NONE; if (!valid(oid)) e = E_INVARG; else if (!db_object_allows(oid, progr, FLAG_WRITE)) e = E_PERM; else if (!db_delete_propdef(oid, pname)) e = E_PROPNF; free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static package bf_verbs(Var arglist, Byte next, void *vdata, Objid progr) { /* (object) */ Objid oid = arglist.v.list[1].v.obj; free_var(arglist); if (!valid(oid)) return make_error_pack(E_INVARG); else if (!db_object_allows(oid, progr, FLAG_READ)) return make_error_pack(E_PERM); else { struct verb_data d; d.r = new_list(db_count_verbs(oid)); d.i = 0; db_for_all_verbs(oid, add_to_list, &d); return make_var_pack(d.r); } }
static package bf_has_property(Var arglist, Byte next, void *vdata, Objid progr) { /* (object) */ Objid oid = arglist.v.list[1].v.obj; if (!valid(oid)) { free_var(arglist); return make_error_pack(E_INVARG); } else if (!db_object_allows(oid, progr, FLAG_READ)) { free_var(arglist); return make_error_pack(E_PERM); } else { Var result; result.type = TYPE_INT; if (db_find_property(oid, arglist.v.list[2].v.str, 0).ptr) { result.v.num = 1; } else { result.v.num = 0; } free_var(arglist); return make_var_pack(result); } }