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/
/* 
 * origin.c 
 * 
 * Determine origin of last call
 * 
 * (C) Frank Schmidt, Jesus@NorseMUD 
 * 
 */ 


/* determine origin of last call to current func */
static int origin() {
  int size, n;
  mixed *trace, *elem;
  string prev_ob, prev_func, prev_prog, t;

  /* get function trace-data */
  trace = ::call_trace();
  size = ::sizeof(trace);

  /* skip special DriverLib bridge functions */
  while (size >= 2+n && 
	 member_array(trace[size-2-n][TRACE_FUNCTION],
		      ({
			"__call_local",
			"__call_other",
			"call_other",
		      })) >= 0) {
    ++n;
  }

  if (size >= 3+n) {
    /* simul_efun (auto-file) call? */
    if ((prev_prog=(elem=trace[size-3-n])[TRACE_PROGNAME]) == AUTO)
      return 8;
  }

  /* local call? (not call_other) */
  if (!trace[size-2-n][TRACE_EXTERNAL])
    return 2;

  /* can't go any further */
  if (!elem)
    return 0;

  /* fetch previous object (filename) and function */
  prev_ob = elem[TRACE_OBJNAME];
  prev_func = elem[TRACE_FUNCTION];

  if (prev_prog == GLOBAL) {
    /* from GLOBAL object: */
    if (prev_func == "do_heart_beat")
      /* heart beat call */
      return 1;
    else if (prev_func == "do_call_out")
      /* call out */
      return 16;
  }

  /* simul_efun (outside auto-ob) call? */
  if (prev_prog == SIMUL_EFUN)
    return 8;

  /* ordinary call other? */
  return 4;
}