/*
* origin.c
*
* Determine origin of last call
*
* (C) Frank Schmidt, Jesus@NorseMUD
*
*/
#include <dgd/trace.h>
/* 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;
}