/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#include "db.h"

datum flag_set(datum x, datum flag)
{
    struct object *o;

    return ((o = object(x)) != 0 && (o->flags & flag) != 0);
}

datum controls(datum x, datum thing)
{
    struct object *o;
    struct object *t;

    if(x == thing) {
	return 1;
    } else if((t = object(thing)) == 0
	      || oflag_set(t, F_ADMIN)
	      || (o = object(x)) == 0) {
	return 0;
    } else {
	return (oflag_set(o, F_WIZARD)
		|| (o->owner == t->owner && !oflag_set(t, F_WIZARD)));
    }
}
    
/*
datum can_read(datum x, datum thing)
{
    return flag_set(thing, F_PUBLIC) || controls(x, thing);
}
*/

/* returns 1 if a is an ancestor of x */
datum is_ancestor(datum x, datum a)
{
    for(;;) {
	if(x == a) return 1;
	if(x == NOTHING) return 0;
	x = safe_get(x, parent);
    }
}