Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
    }
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
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);
    }
}
Exemplo n.º 7
0
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);
    }
}