/* 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);
  }
}