new function restriction 'localize' causes q-registers to be saved and restored aroun...
authorAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 23:24:24 +0000 (23:24 +0000)
committerAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 23:24:24 +0000 (23:24 +0000)
game/txt/hlp/cobratop.hlp
hdrs/function.h
src/function.c
src/parse.c

index 4f095c157de91fb467a956b739309fc712544efd..82f767a2d49926c67aa842c100aa95cbff74366a 100644 (file)
@@ -1925,6 +1925,8 @@ player who runs it instead of a generic, unhelpful error message.
               to @command or @function.
    noparse    Function arguments are not evaluated. Only applies
               to @functions.
+   localize   %q-registers are saved/restored when evaluating, as if
+              the @function were wrapped in localize().
 
  Commands can also use the 'noplayer' restriction, which stops
  player objects from using the command, as well as any generic <flag>
index 6e91f23bfb43c7de672a153d4d1b51a95ddef169..7dd56d379877cf146d35ffb1afe154c089b6f97f 100644 (file)
@@ -33,8 +33,8 @@
 #define FN_LOGNAME 0x1000
 /* Log function name and args */
 #define FN_LOGARGS 0x2000
-/* Run Function Ulocal Style */
-#define FN_ULOCAL  0x4000
+/* Localize function registers */
+#define FN_LOCALIZE     0x4000
 #define FN_NORP 0x8000
 #define FN_ONEARG 0x10000
 
index bb51ae0cdbe9b858b152f51a665bebe78a705c23..8ed66b2bb0c8e6205452555272efac2e85e3fa56 100644 (file)
@@ -994,8 +994,10 @@ apply_restrictions(unsigned int result, const char *restriction)
       flag = FN_LOGNAME;
     } else if (!strcasecmp(restriction, "noparse")) {
       flag = FN_NOPARSE;
-    } else if(!strcasecmp(restriction, "ulocal")) {
-      flag = FN_ULOCAL;
+    } else if (!strcasecmp(restriction, "localize")) {
+      flag = FN_LOCALIZE;
+    } else if (!strcasecmp(restriction, "ulocal")) {
+      flag = FN_LOCALIZE;
     }
     if (clear)
       result &= ~flag;
@@ -1021,6 +1023,7 @@ apply_restrictions(unsigned int result, const char *restriction)
  *   god        can only be used by god
  *   noplayer   can't be used by players, just objects/rooms/exits
  *   nosidefx   can't be used to do side-effect thingies
+ *   localize   localize q-registers
  * \endverbatim
  * \param name name of function to restrict.
  * \param restriction name of restriction to apply to function.
@@ -1470,10 +1473,11 @@ do_function_report(dbref player, char *name)
       first = 0;
   }
 
-  if(fp->flags & FN_ULOCAL) {
-         safe_str("Ulocal", tbuf, &tp);
-         if(first)
-                 first = 0;
+  if (fp->flags & FN_LOCALIZE) {
+    if (first == 0)
+      safe_strl(", ", 2, tbuf, &tp);
+    safe_str("Localize", tbuf, &tp);
+    first = 0;
   }
 
   if (fp->flags & FN_LITERAL) {
index 30282fc0bd6a7282bea4dec62e51ef24884bad3e..0fab687a75996c0b44872d4b224a672d4f4228f9 100644 (file)
@@ -467,7 +467,6 @@ process_expression(char *buff, char **bp, char const **str,
   int e_len;
   int retval = 0;
   const char *e_msg;
-  dbref local_ooref;
 
   if (!buff || !bp || !str || !*str)
     return 0;
@@ -1271,24 +1270,18 @@ process_expression(char *buff, char **bp, char const **str,
                safe_str(userfn_tab[fp->where.offset].name, buff, bp);
                safe_chr(')', buff, bp);
              } else { 
-               /* Open temporary ooref change exception */
-               /* local ooref changing should be safe here. 
-                * Cause we're going to the global func scope, any
-                * previous calling ooref shouldn't effect security here
-                */
+               char *preserve[NUMQ];
+               dbref local_ooref;
+               if (fp->flags & FN_LOCALIZE)
+                 save_global_regs("@function.save", preserve);
+               /* Temporarily change ooref */
                local_ooref = ooref;
                ooref = attrib->creator;
-               if(fp->flags & FN_ULOCAL) {
-                 char *preserve[NUMQ];
-                 save_global_regs("globalufun.save", preserve);
-                 do_userfn(buff, bp, thing, attrib, nfargs, fargs,
-                     executor, caller, enactor, pe_info);
-                 restore_global_regs("globalufun.save", preserve);
-               } else {
-                 do_userfn(buff, bp, thing, attrib, nfargs, fargs, executor, caller, enactor, pe_info);
-               }
-               /* Go back to normal ooref  status */
+               do_userfn(buff, bp, thing, attrib, nfargs, fargs,
+                         executor, caller, enactor, pe_info);
                ooref = local_ooref;
+               if (fp->flags & FN_LOCALIZE)
+                 restore_global_regs("@function.save", preserve);
              }
            }
            pe_info->fun_depth--;