diff scripts/control/system/listidx.m @ 3431:99ab64f4a09d

[project @ 2000-01-14 03:53:03 by jwe]
author jwe
date Fri, 14 Jan 2000 04:12:41 +0000
parents
children a892190f4977
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/control/system/listidx.m	Fri Jan 14 04:12:41 2000 +0000
@@ -0,0 +1,100 @@
+## Copyright (C) 2000 Auburn University.  All rights reserved.
+##
+## This file is part of Octave.
+##
+## Octave 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, or (at your option) any
+## later version.
+##
+## Octave 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 Octave; see the file COPYING.  If not, write to the Free
+## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+## [idxvec, errmsg] = listidx(listvar, strlist)
+## return indices of string entries in listvar that match strings in strlist
+## Inputs:
+##   listvar: list of strings to be searched
+##   strlist: list of strings to be located in listvar.
+## Note: listvar, strlist may be passed as strings or string matrices;
+##    in this case, each entry is processed by deblank() prior to searching
+##    for the entries of strlist in listvar.
+## Outputs:
+## idxvec
+##    vector of indices in listvar;
+##    listvar(idxvec(k)) == strlist(kk).
+## errmsg
+##    if strlist contains a string not in listvar, then
+##    an error message is returned in errmsg.  If only one output
+##    argument is requested, e.g., idxvec = listidx(listvar, strlist),
+##    then listidx prints errmsg to the screen and exits with
+##    an error.
+##
+
+function [idxvec,errmsg]  = listidx(listvar,strlist)
+
+if(nargin != 2)
+  usage("idxvec = listidx(listvar,strlist)");
+endif
+
+if(isstr(strlist))
+  tmp = strlist;
+  strlist = list();
+  for kk=1:rows(tmp)
+    strlist(kk) = deblank(tmp(kk,:));
+  endfor
+endif
+
+if(isstr(listvar))
+  tmp = listvar;
+  listvar = list();
+  for kk=1:rows(tmp)
+    listvar(kk) = deblank(tmp(kk,:));
+  endfor
+endif
+
+## initialize size of idxvec (for premature return)
+idxvec = zeros(length(strlist),1);
+
+errmsg = "";
+if(!is_signal_list(listvar))
+  errmsg = "listvar must be a list of strings";
+elseif(!is_signal_list(strlist))
+  errmsg = "strlist must be a list of strings";
+endif
+
+if(length(errmsg))
+  if(nargout < 2) error(errmsg);
+  else return;
+  endif
+endif
+
+nsigs = length(listvar);
+for idx = 1:length(strlist)
+  signame = nth(strlist,idx);
+  for jdx = 1:nsigs
+    if( strcmp(signame,nth(listvar,jdx)) )
+      if(idxvec(idx) != 0)
+        warning("Duplicate signal name %s (%d,%d)\n", ...
+          nth(listvar,jdx),jdx,idxvec(idx));
+      else
+        idxvec(idx) = jdx;
+      endif
+    endif
+  endfor
+  if(idxvec(idx) == 0)
+    errmsg = sprintf("Did not find %s",signame);
+    if(nargout == 1)
+      error(errmsg);
+    else
+      break
+    end
+  endif
+endfor
+
+endfunction