MudOSa4DGD/
MudOSa4DGD/bin/
MudOSa4DGD/data/
MudOSa4DGD/doc/
MudOSa4DGD/doc/driver/
MudOSa4DGD/doc/efun/bitstrings/
MudOSa4DGD/doc/efun/command/
MudOSa4DGD/doc/efun/communication/
MudOSa4DGD/doc/efun/heart_beat/
MudOSa4DGD/doc/efun/interactive/
MudOSa4DGD/doc/efun/inventory/
MudOSa4DGD/doc/efun/living/
MudOSa4DGD/doc/efun/mappings/
MudOSa4DGD/doc/efun/strings/
MudOSa4DGD/doc/efun/uid/
MudOSa4DGD/doc/funs/
MudOSa4DGD/doc/language/
MudOSa4DGD/mudlib/dgd/doc/
MudOSa4DGD/mudlib/dgd/lib/include/dgd/
MudOSa4DGD/mudlib/dgd/lib/std/
MudOSa4DGD/mudlib/dgd/lib/sys/
MudOSa4DGD/mudlib/dgd/log/
MudOSa4DGD/mudlib/log/
MudOSa4DGD/mudlib/std/include/
MudOSa4DGD/mudlib/std/obj/
/*
 * functions.c
 *
 * Div. function functions d:-D
 *
 * (C) Frank Schmidt, Jesus@NorseMUD
 *
 */


#ifdef MUDOS_FUNCTION_EXISTS

/* find filename of a given function in an object */
static varargs string function_exists(string func, object ob) {
  return ::function_object(func, ob ? ob : this_object());
}

#endif


/* Get the previous function for the current function-n
   using the call_trace() kfun in DGD */
static varargs string previous_function(int n) {
  int size;
  mixed *trace, *elem;
  trace = ::call_trace();
  size = ::sizeof(trace);
  if (size >= 3+n) {
    elem = trace[size-3-n];
    return elem[TRACE_FUNCTION];
  }
  return 0;
}


/* determine if current function-n was called locally */
static varargs int called_locally(int n) {
  int size;
  mixed *trace, *elem;
  trace = ::call_trace();
  size = ::sizeof(trace);
  if (size >= 2+n) {
    elem = trace[size-2-n];
    return !elem[TRACE_EXTERNAL];
  }
  return 0;
}


/* determine the objectfile that called us last-n (can be current file) */
static varargs string calling_file(int n) {
  int size;
  mixed *trace, *elem;
  trace = ::call_trace();
  size = ::sizeof(trace);
  if (size >= 3+n) {
    elem = trace[size-3-n];
    return elem[TRACE_OBJNAME];
  }
  return 0;
}


/* determine the object that called us last-n (can be this_object()) */
static varargs object calling_object(int n) {
  int size;
  mixed *trace, *elem;
  trace = ::call_trace();
  size = ::sizeof(trace);
  if (size >= 3+n) {
    elem = trace[size-3-n];
    return find_object(elem[TRACE_OBJNAME]);
  }
  return 0;
}