changeset 5372:b4485a3ce01b

[project @ 2005-05-24 15:36:45 by jwe]
author jwe
date Tue, 24 May 2005 15:38:05 +0000
parents 30b2b6ef8597
children eabc8e96c006
files scripts/ChangeLog scripts/strings/strcmp.m scripts/strings/strncmp.m
diffstat 3 files changed, 154 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Tue May 24 15:24:37 2005 +0000
+++ b/scripts/ChangeLog	Tue May 24 15:38:05 2005 +0000
@@ -1,5 +1,8 @@
 2005-05-24  John W. Eaton  <jwe@octave.org>
 
+	* strings/strncmp.m: New file, from Tom Holroyd
+	<tomh@kurage.nimh.nih.gov>.
+
 	* strings/strcmp.m: Return logical values in all cases.
 
 2005-05-23  John W. Eaton  <jwe@octave.org>
--- a/scripts/strings/strcmp.m	Tue May 24 15:24:37 2005 +0000
+++ b/scripts/strings/strcmp.m	Tue May 24 15:38:05 2005 +0000
@@ -19,12 +19,13 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} strcmp (@var{s1}, @var{s2})
-## Compares two strings, returning true if they are the same, and false
-## otherwise.
+## Compares two character strings, returning true if they are the same,
+## and false otherwise.
 ##
 ## @strong{Caution:}  For compatibility with @sc{Matlab}, Octave's strcmp
-## function returns true if the strings are equal, and false otherwise.
-## This is just the opposite of the corresponding C library function.
+## function returns true if the character strings are equal, and false
+## otherwise.  This is just the opposite of the corresponding C library
+## function.
 ## @end deftypefn
 
 ## Author: jwe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/strings/strncmp.m	Tue May 24 15:38:05 2005 +0000
@@ -0,0 +1,146 @@
+## Copyright (C) 1996, 1997 John W. Eaton
+##
+## 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, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} strncmp (@var{s1}, @var{s2}, @var{n})
+## Compares the first @var{n} characters (columns) of two character
+## strings, returning true if they are the same, and false otherwise.
+##
+## @strong{Caution:} For compatibility with @sc{Matlab}, Octave's strncmp
+## function returns true if the character strings are equal, and false
+## otherwise.  This is just the opposite of the corresponding C library
+## function.
+## @end deftypefn
+
+## Author: jwe
+## Adapted from strcmp.m by Tom Holroyd <tomh@kurage.nimh.nih.gov>
+
+function retval = strncmp (s1, s2, n)
+
+  if (nargin != 3)
+    usage ("strncmp (s, t, n)");
+  endif
+
+  retval = false;
+
+  if (isstr (s1))
+    [r1, c1] = size (s1);
+    if (isstr (s2))
+      [r2, c2] = size (s2);
+      if (r1 == r2 && c1 == c2)
+	if (c1 == 0)
+	  retval = true;
+	else
+	  if (c1 > n)
+	    t1 = s1(:, 1:n);
+	    t2 = s2(:, 1:n);
+	    retval = all (all (t1 == t2));
+	  else
+	    retval = all (all (s1 == s2));
+	  endif
+	endif
+      elseif (r1 == r2)
+	if (r1 == 0)
+	  retval = true;
+	else
+	  l1 = min(n, c1);
+	  l2 = min(n, c2);
+	  if (l1 == l2)
+	    t1 = s1(:, 1:l1);
+	    t2 = s2(:, 1:l2);
+	    retval = all (all (t1 == t2));
+	  endif
+	endif
+      endif
+    elseif (iscellstr (s2))
+      [r2, c2] = size (s2);
+      if (r1 == 1)
+	t2 = s2(:);
+	m = length (t2);
+	retval = zeros (m, 1, "logical");
+	for i = 1:m
+	  retval(i) = strncmp (s1, t2{i}, n);
+	endfor
+	retval = reshape (retval, r2, c2);
+      elseif (r1 > 1)
+	if (r2 == 1 && c2 == 1)
+	  t2 = s2{1};
+	  retval = zeros (r1, 1, "logical");
+	  for i = 1:r1
+	    retval(i) = strncmp (deblank (s1(i,:)), t2, n);
+	  endfor
+	else
+	  t2 = s2(:);
+	  m = length (t2);
+	  if (m == r1)
+	    retval = zeros (m, 1, "logical");
+	    for i = 1:m
+	      retval(i) = strncmp (deblank (s1(i,:)), t2{i}, n);
+	    endfor
+	    retval = reshape (retval, r2, c2);
+	  else
+	    error ("strncmp: nonconformant arrays");
+	  endif
+	endif
+      endif
+    endif
+  elseif (iscellstr (s1))
+    [r1, c1] = size (s1);
+    if (isstr (s2))
+      retval = strncmp (s2, s1, n, "logical");
+    elseif (iscellstr (s2))
+      [r2, c2] = size (s2);
+      if (r1 == 1 && c1 == 1)
+	t1 = s1{:};
+	t2 = s2(:);
+	m = length (t2);
+	retval = zeros (m, 1);
+	for i = 1:m
+	  retval(i) = strncmp (t1, t2{i}, n);
+	endfor
+	retval = reshape (retval, r2, c2);
+      elseif (r2 == 1 && c2 == 1)
+	## retval = strncmp (s2, s1, n);
+	t1 = s1(:);
+	t2 = s2{:};
+	m = length (t1);
+	retval = zeros (m, 1, "logical");
+	for i = 1:m
+	  retval(i) = strncmp (t1{i}, t2, n);
+	endfor
+	retval = reshape (retval, r1, c1);
+      elseif (r1 == r2 && c1 == c2)
+	t1 = s1(:);
+	t2 = s2(:);
+	m = length (t1);
+	for i = 1:m
+	  retval(i) = strncmp (t1{i}, t2{i}, n);
+	endfor
+	retval = reshape (retval, r1, c1);
+      else
+	error ("strncmp: nonconformant cell arrays");
+      endif
+    endif
+  endif
+
+  if (n < 1)
+    retval = zeros (size (retval), "logical");
+  endif
+
+endfunction