# HG changeset patch # User jwe # Date 1116949085 0 # Node ID b4485a3ce01b7942689d99dd507a02f9b211a52e # Parent 30b2b6ef8597b28c43261db0910a05cd8bca7d7a [project @ 2005-05-24 15:36:45 by jwe] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,5 +1,8 @@ 2005-05-24 John W. Eaton + * strings/strncmp.m: New file, from Tom Holroyd + . + * strings/strcmp.m: Return logical values in all cases. 2005-05-23 John W. Eaton diff --git a/scripts/strings/strcmp.m b/scripts/strings/strcmp.m --- a/scripts/strings/strcmp.m +++ b/scripts/strings/strcmp.m @@ -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 diff --git a/scripts/strings/strncmp.m b/scripts/strings/strncmp.m new file mode 100644 --- /dev/null +++ b/scripts/strings/strncmp.m @@ -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 + +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