extract()'s second and third arguments are now optional; default to 1
authorAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 22:11:17 +0000 (22:11 +0000)
committerAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 22:11:17 +0000 (22:11 +0000)
game/txt/hlp/cobra_func.hlp
src/function.c
src/funlist.c

index 4cea9434b9079a0a2d9b9b398fa72bfce10bd852..ac564dddee59c6903a3a6ca7ab56c0c431af810d 100644 (file)
  
   Returns e to the power of <number>.
 & EXTRACT()
-  extract(<list>,<first>,<length>[,<delimiter>])
+  extract(<list>[,<first>[,<length>[,<delimiter>]]])
 
   This function returns <length> elements of a list, counting
-  from the <first> element.
+  from the <first> element. If <length> is not specified, the
+  default is 1, so extract(list,3) acts like elements(list,3).
+  If <first> is not specified, the default is the 1, so
+  extract(list) acts like first(list).
 
   For example:
     think extract(This is a test string,3,2)
index c725706e62b8ade67e08f1c914782332514d86a3..baa03ef99db66b330759fac864c3dbe03747e434 100644 (file)
@@ -362,7 +362,7 @@ FUNTAB flist[] = {
   {"EVAL", fun_eval, 2, 2, FN_REG},
   {"ESCAPE", fun_escape, 1, -1, FN_REG},
   {"EXIT", fun_exit, 1, 1, FN_REG},
-  {"EXTRACT", fun_extract, 3, 4, FN_REG},
+  {"EXTRACT", fun_extract, 1, 4, FN_REG},
   {"FILTER", fun_filter, 2, 4, FN_REG},
   {"FILTERBOOL", fun_filter, 2, 4, FN_REG},
   {"FINDABLE", fun_findable, 2, 2, FN_REG},
index 9eab2a2a65fc0788f5317c5f349fb8d76f48ca0e..d653c77cb50d6b989717c3a4307d03a68806ece3 100644 (file)
@@ -1919,8 +1919,8 @@ FUNCTION(fun_wordpos)
 /* ARGSUSED */
 FUNCTION(fun_extract)
 {
-  char sep;
-  int start, len;
+  char sep = ' ';
+  int start = 1, len = 1;
   char *s, *r;
 
   if (!is_integer(args[1]) || !is_integer(args[2])) {
@@ -1928,9 +1928,22 @@ FUNCTION(fun_extract)
     return;
   }
   s = args[0];
-  start = parse_integer(args[1]);
-  len = parse_integer(args[2]);
-  if (!delim_check(buff, bp, nargs, args, 4, &sep))
+
+  if (nargs > 1) {
+    if (!is_integer(args[1])) {
+      safe_str(T(e_ints), buff, bp);
+      return;
+    }
+    start = parse_integer(args[1]);
+  }
+  if (nargs > 2) {
+    if (!is_integer(args[2])) {
+      safe_str(T(e_ints), buff, bp);
+      return;
+    }
+    len = parse_integer(args[2]);
+  }
+  if ((nargs > 3) && (!delim_check(buff, bp, nargs, args, 4, &sep)))
     return;
 
   if ((start < 1) || (len < 1))