PennMUSH 1.8.3p11
authorRick L Bird <nveid@yahoo.com>
Thu, 5 May 2011 23:47:46 +0000 (19:47 -0400)
committerRick L Bird <nveid@yahoo.com>
Thu, 5 May 2011 23:47:46 +0000 (19:47 -0400)
Author: captdeaf@gmail.com
<captdeaf@gmail.com@ba372814-4f39-11de-9ad6-1127a62b9fcd>
Date:   Mon Nov 23 23:25:48 2009 +0000

    Added a <step> argument to lnum()
Fixes #138

src/function.c
src/funlist.c

index cc168774cbb856948533390436fea4db559d9a54..21c38405610dce3a6f0cee5c82b3de79b1332e29 100644 (file)
@@ -502,7 +502,7 @@ FUNTAB flist[] = {
   {"LLOCKFLAGS", fun_lockflags, 0, 1, FN_REG},
   {"LLOCKS", fun_locks, 1, 1, FN_REG},
   {"LMATH", fun_lmath, 2, 3, FN_REG},
-  {"LNUM", fun_lnum, 1, 3, FN_REG},
+  {"LNUM", fun_lnum, 1, 4, FN_REG},
   {"LOC", fun_loc, 1, 1, FN_REG},
   {"LOCTREE", fun_loctree, 1, 1, FN_REG},
   {"LOCALIZE", fun_localize, 1, 1, FN_NOPARSE},
index 4d6668e276c6a06b8f00924c55c479af7b6b7040..907f871bd0d05b87276e7f3434a734a9705f0c57 100644 (file)
@@ -1279,12 +1279,14 @@ FUNCTION(fun_lnum)
   NVAL j;
   NVAL start;
   NVAL end;
-  int istart, iend, k;
+  NVAL step = 1.0;
+  int istart, iend, k, istep;
   char const *osep = " ";
   static NVAL cstart[CACHE_SIZE];
   static NVAL cend[CACHE_SIZE];
   static char csep[CACHE_SIZE][BUFFER_LEN];
   static char cresult[CACHE_SIZE][BUFFER_LEN];
+  static int  cstep[CACHE_SIZE];
   static int cpos;
   char *cp;
 
@@ -1298,6 +1300,9 @@ FUNCTION(fun_lnum)
       safe_str(T(e_num), buff, bp);
       return;
     }
+    if (nargs > 3 && is_number(args[3])) {
+      step = parse_number(args[3]);
+    }
     start = end;
     end = parse_number(args[1]);
     if ((start == 0) && (end == 0)) {
@@ -1322,7 +1327,8 @@ FUNCTION(fun_lnum)
     osep = args[2];
   }
   for (k = 0; k < CACHE_SIZE; k++) {
-    if (cstart[k] == start && cend[k] == end && !strcmp(csep[k], osep)) {
+    if (cstart[k] == start && cend[k] == end && !strcmp(csep[k], osep) &&
+        cstep[k] == step) {
       safe_str(cresult[k], buff, bp);
       return;
     }
@@ -1335,16 +1341,17 @@ FUNCTION(fun_lnum)
 
   istart = (int) start;
   iend = (int) end;
-  if (istart == start && iend == end) {
+  istep = (int) step;
+  if (istart == start && iend == end && istep == step) {
     safe_integer(istart, cresult[cpos], &cp);
     if (istart <= iend) {
-      for (k = istart + 1; k <= iend; k++) {
+      for (k = istart + istep; k <= iend; k += istep) {
         safe_str(osep, cresult[cpos], &cp);
         if (safe_integer(k, cresult[cpos], &cp))
           break;
       }
     } else {
-      for (k = istart - 1; k >= iend; k--) {
+      for (k = istart - istep; k >= iend; k -= istep) {
         safe_str(osep, cresult[cpos], &cp);
         if (safe_integer(k, cresult[cpos], &cp))
           break;
@@ -1353,13 +1360,13 @@ FUNCTION(fun_lnum)
   } else {
     safe_number(start, cresult[cpos], &cp);
     if (start <= end) {
-      for (j = start + 1; j <= end; j++) {
+      for (j = start + step; j <= end; j += step) {
         safe_str(osep, cresult[cpos], &cp);
         if (safe_number(j, cresult[cpos], &cp))
           break;
       }
     } else {
-      for (j = start - 1; j >= end; j--) {
+      for (j = start - step; j >= end; j -= step) {
         safe_str(osep, cresult[cpos], &cp);
         if (safe_number(j, cresult[cpos], &cp))
           break;