diff scripts/strings/rindex.m @ 3911:8389e78e67d4

[project @ 2002-04-28 02:15:38 by jwe]
author jwe
date Sun, 28 Apr 2002 02:15:39 +0000
parents f8dde1807dee
children 48a39e2b2ab7
line wrap: on
line diff
--- a/scripts/strings/rindex.m	Thu Apr 25 05:36:53 2002 +0000
+++ b/scripts/strings/rindex.m	Sun Apr 28 02:15:39 2002 +0000
@@ -41,25 +41,60 @@
     usage ("rindex (s, t)");
   endif
 
-  n = 0;
-
-  if (isstr (s) && isstr (t))
-
-    l_s = length (s);
-    l_t = length (t);
-
-    if (l_t <= l_s)
-      tmp = l_s - l_t + 1;
-      for idx = tmp : -1 : 1
-        if (strcmp (substr (s, idx, l_t), t))
-          n = idx;
-          return;
-        endif
-      endfor
-    endif
-
-  else
+  if (!isstr (s) || !isstr (t) || all (size (s) > 1) || all (size (t) > 1) )
     error ("rindex: expecting string arguments");
   endif
 
+  l_s = length (s);
+  l_t = length (t);
+
+  if ( l_s == 0 || l_s < l_t )
+    ## zero length source, or target longer than source
+    v = [];
+    
+  elseif ( l_t == 0 )
+    ## zero length target: return last
+    v = l_s;
+    
+  elseif ( l_t == 1 )
+    ## length one target: simple find
+    v = find (s==t);
+    
+  elseif ( l_t == 2 )
+    ## length two target: find first at i and second at i+1
+    v = find (s (1 : l_s-1) == t (1) & s (2 : l_s) == t (2));
+    
+  else
+    ## length three or more: match the first three by find then go through
+    ## the much smaller list to determine which of them are real matches
+    limit = l_s - l_t + 1;
+    v = find (s (1 : limit) == t(1) & s (2 : limit+1) == t (2)
+	      & s (3 : limit+2) == t(3) );
+  endif
+
+  if (l_t > 3)
+    
+    ## force strings to be both row vectors or both column vectors
+    if (all (size (s) != size (t)))
+      t = t.';
+    endif
+    
+    ## search index vector for a match
+    ind = 0 : l_t - 1;
+    n = 0; # return 0 if loop terminates without finding any match
+    for idx = length(v):-1:1
+      if (s (v(idx) + ind) == t)
+	n = v(idx);
+	break;
+      endif
+    endfor
+
+  elseif (length(v) > 0)
+    n = v(length(v));
+
+  else
+    n = 0;
+
+  endif
+
 endfunction