diff scripts/strings/strmatch.m @ 5178:6758c11b5b99

[project @ 2005-03-03 05:18:04 by jwe]
author jwe
date Thu, 03 Mar 2005 05:18:04 +0000
parents
children 41cd70503c72
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/strings/strmatch.m
@@ -0,0 +1,80 @@
+## Copyright (C) 2003 Alois Schloegl
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+##
+## Copyright (C) 2000 Paul Kienzle
+
+## usage: strmatch(s, A [, 'exact'])
+## Determines which entries of A match string s. A can be a string matrix
+## or a cell array of strings. If 'exact' is not given, then s only needs 
+## to match A up to the length of s. Null characters match blanks.
+## Results are returned as a column vector.
+function idx = strmatch(s,A,exact)
+  if (nargin < 2 || nargin > 3)
+    usage("strmatch(s,A,'exact')");
+  endif
+
+  try istno = implicit_str_to_num_ok;
+  catch istno = 0;
+  end
+  try wstno = warn_str_to_num;
+  catch wstno = 0;
+  end
+  try dfi = do_fortran_indexing;
+  catch dfi = 0;
+  end
+  try wfi = warn_fortran_indexing;
+  catch wfi = 0;
+  end
+  unwind_protect
+    implicit_str_to_num_ok = 1;
+    warn_str_to_num = 0;
+    do_fortran_indexing = 1;
+    warn_fortran_indexing = 0;
+
+    [nr, nc] = size (A);
+    if iscell(A)
+      match = zeros(prod(size(A)),1);
+      if nargin>2,
+        for k = 1:prod(size(A)),
+          match(k) = strcmp(s,A{k}); 
+        end 
+      else
+        for k = 1:prod(size(A)),
+          match(k) = strncmp(s,A{k},length(s));
+        end
+      end
+      idx = find(match);
+    elseif (length (s) > nc)
+      idx = [];
+    else
+      if (nargin == 3 && length(s) < nc) s(1,nc) = ' '; endif
+      s (s==0) = ' ';
+      A (A==0) = ' ';
+      match = s(ones(size(A,1),1),:) == A(:,1:length(s));
+      if (length(s) == 1)
+	idx = find(match);
+      else
+      	idx = find(all(match')');
+      endif
+    endif
+    
+  unwind_protect_cleanup
+    implicit_str_to_num_ok = istno;
+    warn_str_to_num = wstno;
+    do_fortran_indexing = dfi;
+    warn_fortran_indexing = wfi;
+  end_unwind_protect
+endfunction