default() can take multiple attributes to try in order
authorAri Johnson <ari@theari.com>
Thu, 7 Jun 2007 23:16:33 +0000 (23:16 +0000)
committerAri Johnson <ari@theari.com>
Thu, 7 Jun 2007 23:16:33 +0000 (23:16 +0000)
game/txt/changes/0.73
game/txt/hlp/cobra_func.hlp
src/function.c
src/fundb.c

index e050cabc3684e305012ff159d43a0bac6608f434..96e9c5c3b3fda64a50bdda35ba77589a2fdefbf4 100644 (file)
@@ -198,4 +198,5 @@ CobraMUSH Version 0.73
    * crecall() [AEJ]
    * @poll with no argument now displays the current poll; use
      @poll/clear to clear it [AEJ]
+   * default() can take multiple attributes to try in order [AEJ]
 
index 6aafe9c7f070f9d72a959f59cf78476f3798db68..542d08e598ea59fbcbe6873f3c6715aa8930484c 100644 (file)
   the string and the same password.
 
 & DEFAULT()
-  Function:  default([<obj>/]<attr>,<default case>)
-  This function returns the value of <obj>/<attr>, as if retrieved via
-  the get() function, if the attribute exists and is readable by you.
-  Otherwise, it evaluates the default case, and returns that.
-  Note that the default case is only evaluated if the attribute does
-  not exist or cannot be read. Note further than an empty attribute
-  counts as an existing attribute.
+  Function:  default([<obj>/]<attr>,[[<obj>]/<attr>,...]<default case>)
  
+  This function returns the value of the first possible <obj>/<attr>,
+  as if retrieved via the get() function, if the attribute exists and
+  is readable by you.  Otherwise, it evaluates the default case, and
+  returns that.  Note that the default case is only evaluated if the
+  attribute does not exist or cannot be read.  Note further that an
+  empty attribute counts as an existing attribute.
+
   This is useful for code that needs to return the value of an attribute,
   or an error message or default case, if that attribute does not exist.
  
index 328b40cd1a2a775517a3ae7cdcdb275935a4d7ff..aab3fd689ade9fb69b804a52a6fff5933004885a 100644 (file)
@@ -347,7 +347,7 @@ FUNTAB flist[] = {
   {"DEC", fun_dec, 1, 1, FN_REG},
   {"DECOMPOSE", fun_decompose, 1, -1, FN_REG},
   {"DECRYPT", fun_decrypt, 2, 2, FN_REG},
-  {"DEFAULT", fun_default, 2, 2, FN_NOPARSE},
+  {"DEFAULT", fun_default, 2, INT_MAX, FN_NOPARSE},
   {"DELETE", fun_delete, 3, 3, FN_REG},
   {"DIE", fun_die, 2, 3, FN_REG},
   {"DIG", fun_dig, 1, 3, FN_REG},
index 6212e3e284e3fbe8e667fe7941264ac9fa0c6db9..e416168db577d04699c9b7db48dc4a93603b5bd9 100644 (file)
@@ -221,22 +221,26 @@ FUNCTION(fun_default)
   char *dp;
   const char *sp;
   char mstr[BUFFER_LEN];
+  int i;
   /* find our object and attribute */
-  dp = mstr;
-  sp = args[0];
-  process_expression(mstr, &dp, &sp, executor, caller, enactor,
-                    PE_DEFAULT, PT_DEFAULT, pe_info);
-  *dp = '\0';
-  parse_attrib(executor, mstr, &thing, &attrib);
-  if (GoodObject(thing) && attrib && Can_Read_Attr(executor, thing, attrib)) {
-    /* Ok, we've got it */
-    dp = safe_atr_value(attrib);
-    safe_str(dp, buff, bp);
-    free(dp);
-    return;
+  for (i = 1; i < nargs; i++) {
+    mstr[0] = '\0';
+    dp = mstr;
+    sp = args[i - 1];
+    process_expression(mstr, &dp, &sp, executor, caller, enactor, PE_DEFAULT,
+                      PT_DEFAULT, pe_info);
+    *dp = '\0';
+    parse_attrib(executor, mstr, &thing, &attrib);
+    if (GoodObject(thing) && attrib && Can_Read_Attr(executor, thing, attrib)) {
+      /* Ok, we've got it */
+      dp = safe_atr_value(attrib);
+      safe_str(dp, buff, bp);
+      free(dp);
+      return;
+    }
   }
-  /* We couldn't get it. Evaluate args[1] and return it */
-  sp = args[1];
+  /* We couldn't get it. Evaluate the last arg and return it */
+  sp = args[nargs - 1];
   process_expression(buff, bp, &sp, executor, caller, enactor,
                     PE_DEFAULT, PT_DEFAULT, pe_info);
   return;