Short: New efun previous_program()
From: Daniel Sloan
Date: 990423
Type: Patch
State: Unclassified
diff -c -r ldmud-3.2.6/src/func_spec ldmud-dev/src/func_spec
*** ldmud-3.2.6/src/func_spec Sat Mar 27 14:27:43 1999
--- ldmud-dev/src/func_spec Sat Apr 24 00:59:52 1999
***************
*** 360,365 ****
--- 361,367 ----
string extract(string, int, int);
int extern_call();
object previous_object(int);
+ string previous_program(int default: F_CONST0);
int strstr(string, string, int default: F_CONST0);
int program_time(object default: F_THIS_OBJECT);
string program_name(object default: F_THIS_OBJECT);
diff -c -r ldmud-3.2.6/src/interpret.c ldmud-dev/src/interpret.c
*** ldmud-3.2.6/src/interpret.c Wed Mar 31 12:28:11 1999
--- ldmud-dev/src/interpret.c Sat Apr 24 00:59:47 1999
***************
*** 9478,9483 ****
--- 9545,9614 ----
put_object(prev_ob);
break;
}
+ #ifdef F_PREVIOUS_PROGRAM
+ XCASE(F_PREVIOUS_PROGRAM);
+ {
+ int i;
+ struct control_stack *p;
+ char *name;
+
+ if (sp->type != T_NUMBER) goto xbad_arg_1;
+
+ i = sp->u.number;
+ sp->u.number = 0;
+
+ if (i > MAX_TRACE)
+ {
+ break; /* returning 0 */
+ }
+ p = csp;
+ do {
+ do {
+ if (p == control_stack)
+ goto again; /* returning 0 */
+ } while ( !(--p)[1].extern_call );
+ } while (--i >= 0);
+
+ if (p[1].extern_call & 0x80)
+ {
+ if (p[1].pretend_to_be->flags & O_DESTRUCTED)
+ break; /* returning 0 */
+ else
+ {
+ if (O_PROG_SWAPPED(p[1].pretend_to_be))
+ {
+ if (load_ob_from_swap(p[1].pretend_to_be) < 0)
+ {
+ ERROR("Out of memory\n");
+ }
+ }
+ name = p[1].pretend_to_be->prog->name;
+ }
+ }
+ else
+ {
+ if (p[1].ob->flags & O_DESTRUCTED)
+ break; /* returning 0 */
+ name = p[1].prog->name;
+ }
+
+ if (!name)
+ {
+ break; /* returning 0 */
+ }
+
+ #ifdef COMPAT_MODE
+ name = string_copy(name);
+ #else
+ name = add_slash(name);
+ #endif
+ if (!name)
+ ERROR("Out of memory\n")
+ put_malloced_string(name, sp);
+
+ break;
+ }
+ #endif
XCASE(F_CALLER_STACK_DEPTH);
{
int i;