delete() can use a negative argument a la MUX
authorAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 03:02:33 +0000 (03:02 +0000)
committerAri Johnson <ari@cobramush.org>
Fri, 23 Feb 2007 03:02:33 +0000 (03:02 +0000)
game/txt/hlp/cobra_func.hlp
src/funstr.c

index 03a3a22cea3f575aa0a1a2d9cd6c0501c7fcbd7b..c2738991fbbe93c424d0dd670e60de73923bb5ee 100644 (file)
   Return a modified <string>, with <len> characters starting after the
   character at position <first> deleted. In other words, it copies <first>
   characters, skips <len> characters>, and then copies the remainder of
-  the string.
-  Example:
-    > say [delete(abcdefgh, 3, 2)]
+  the string. If <len> is negative, deletes characters leftwards from <first>.
+  Characters are numbered starting at 0.
+
+  Examples:
+    > say delete(abcdefgh, 3, 2)
     You say, "abcfgh"
+    > say delete(abcdefgh, 3, -2)
+    You say, "abefgh"
+
 & DIE()
   die(<number of times to roll die>, <number of sides on die>[, <show>])
  
@@ -2332,7 +2335,17 @@ for an object named "Test", preferring a thing over other types.
 
   Mid returns a segment of the string, the <length> characters to the
   right of the <first> character.  Note that the first character in a
-  string is numbered zero, and not one.
+  string is numbered zero, and not one. If <length> is negative, it
+  returns characters to the left of the <first> character. The <first>
+  character is always part of the <length> characters.
+
+  Examples:
+    > say mid(foobar, 2, 2)
+    You say, "ob"
+    > say mid(foobar, 2, -2)
+    You say, "oo"
+
+  See also: LEFT(), RIGHT()
 & MIN()
   min(<num1>, <num2>, ..., ...)
 
index f938cc45905143ba103fc1ac54bcdaddfa7faa83..f58f459d3afd2f831830bc4cc865322eaaad4c1d 100644 (file)
@@ -301,12 +301,19 @@ FUNCTION(fun_mid)
   pos = parse_integer(args[1]);
   len = parse_integer(args[2]);
 
-  if ((pos < 0) || (len < 0)) {
+  if (pos < 0) {
     safe_str(T(e_range), buff, bp);
     free_ansi_string(as);
     return;
   }
 
+  if (len < 0) {
+    pos = pos + len + 1;
+    if (pos < 0)
+      pos = 0;
+    len = -len;
+  }
+
   safe_ansi_string(as, pos, len, buff, bp);
   free_ansi_string(as);
 }
@@ -397,8 +404,7 @@ FUNCTION(fun_strinsert)
 FUNCTION(fun_delete)
 {
   ansi_string *as;
-  int pos, num;
-
+  int pos, pos2, num;
 
   if (!is_integer(args[1]) || !is_integer(args[2])) {
     safe_str(T(e_ints), buff, bp);
@@ -415,14 +421,22 @@ FUNCTION(fun_delete)
 
   as = parse_ansi_string(args[0]);
 
-  if ((size_t) pos > as->len || num <= 0) {
+  if ((size_t) pos > as->len || num == 0) {
     safe_strl(args[0], arglens[0], buff, bp);
     free_ansi_string(as);
     return;
   }
 
+  if (num < 0) {
+    pos2 = pos + 1;
+    pos = pos2 + num;
+    if (pos < 0)
+      pos = 0;
+  } else
+    pos2 = pos + num;
+
   safe_ansi_string(as, 0, pos, buff, bp);
-  safe_ansi_string(as, pos + num, as->len, buff, bp);
+  safe_ansi_string(as, pos2, as->len, buff, bp);
   free_ansi_string(as);
 }