# HG changeset patch # User Rik # Date 1318022298 25200 # Node ID 1a6537dbce7b95b9217ccb83fd35e70648f48ce0 # Parent 497bb1cf7b153baf35cb5a817c589dbde625a637 Expand index,rindex functions to accept char array inputs * index.m, rindex.m: Allow char array inputs. Update documentation and tests. diff -r 497bb1cf7b15 -r 1a6537dbce7b scripts/strings/index.m --- a/scripts/strings/index.m Fri Oct 07 08:53:04 2011 -0700 +++ b/scripts/strings/index.m Fri Oct 07 14:18:18 2011 -0700 @@ -20,7 +20,10 @@ ## @deftypefn {Function File} {} index (@var{s}, @var{t}) ## @deftypefnx {Function File} {} index (@var{s}, @var{t}, @var{direction}) ## Return the position of the first occurrence of the string @var{t} in the -## string @var{s}, or 0 if no occurrence is found. For example: +## string @var{s}, or 0 if no occurrence is found. @var{s} may also be a +## string array or cell array of strings. +## +## For example: ## ## @example ## @group @@ -31,70 +34,83 @@ ## ## If @var{direction} is @samp{"first"}, return the first element found. ## If @var{direction} is @samp{"last"}, return the last element found. -## The @code{rindex} function is equivalent to @code{index} with -## @var{direction} set to @samp{"last"}. ## -## @strong{Caution:} This function does not work for arrays of -## character strings. ## @seealso{find, rindex} ## @end deftypefn ## Author: Kurt Hornik ## Adapted-By: jwe +## This is patterned after the AWK function of the same name. -function n = index (s, t, direction) - - ## This is patterned after the AWK function of the same name. +function n = index (s, t, direction = "first") if (nargin < 2 || nargin > 3) print_usage (); - elseif (nargin < 3) - direction = "first"; endif - direction = lower (direction); + + if (ischar (s)) + if (! isrow (s)) + s = cellstr (s); # Handle string arrays by conversion to cellstr + endif + elseif (! iscellstr (s)) + error ("index: S must be a string, string array, or cellstr"); + endif f = strfind (s, t); - if (iscell (f)) + if (isempty (f)) + f = 0; + elseif (iscell (f)) f(cellfun ("isempty", f)) = {0}; - elseif (isempty (f)) - f = 0; endif - if (strcmp (direction, "last")) + direction = tolower (direction); + + if (strcmp (direction, "first")) if (iscell (f)) n = cellfun ("min", f); else - n = f(end); + n = f(1); endif - elseif (strcmp (direction, "first")) + elseif (strcmp (direction, "last")) if (iscell (f)) n = cellfun ("max", f); else - n = f(1); + n = f(end); endif else - error ("index: DIRECTION must be either \"first\" or \"last\""); + error ('index: DIRECTION must be either "first" or "last"'); endif + endfunction -## Test the function out -%!assert(index("astringbstringcstring", "s"), 2) -%!assert(index("astringbstringcstring", "st"), 2) -%!assert(index("astringbstringcstring", "str"), 2) -%!assert(index("astringbstringcstring", "string"), 2) -%!assert(index("abc---", "abc+++"), 0) + +%!assert (index ("foobarbaz", "b") == 4 && index ("foobarbaz", "z") == 9); + +%!assert (index("astringbstringcstring", "s"), 2) +%!assert (index("astringbstringcstring", "st"), 2) +%!assert (index("astringbstringcstring", "str"), 2) +%!assert (index("astringbstringcstring", "string"), 2) +%!assert (index("abc---", "abc+++"), 0) ## test everything out in reverse -%!assert(index("astringbstringcstring", "s", "last"), 16) -%!assert(index("astringbstringcstring", "st", "last"), 16) -%!assert(index("astringbstringcstring", "str", "last"), 16) -%!assert(index("astringbstringcstring", "string", "last"), 16) -%!assert(index("abc---", "abc+++", "last"), 0) - +%!assert (index("astringbstringcstring", "s", "last"), 16) +%!assert (index("astringbstringcstring", "st", "last"), 16) +%!assert (index("astringbstringcstring", "str", "last"), 16) +%!assert (index("astringbstringcstring", "string", "last"), 16) +%!assert (index("abc---", "abc+++", "last"), 0) -%!assert(index ("foobarbaz", "b") == 4 && index ("foobarbaz", "z") == 9); +%!test +%! str = char ("Hello", "World", "Goodbye", "World"); +%! assert (index (str, "o"), [5; 2; 2; 2]); +%! assert (index (str, "o", "last"), [5; 2; 3; 2]); +%! str = cellstr (str); +%! assert (index (str, "o"), [5; 2; 2; 2]); +%! assert (index (str, "o", "last"), [5; 2; 3; 2]); -%!error index (); +%% Test input validation +%!error index () +%!error index ("a") +%!error index ("a", "b", "first", "d") +%!error index (1, "bar") +%!error index ("foo", "bar", 3) -%!error index ("foo", "bar", 3); - diff -r 497bb1cf7b15 -r 1a6537dbce7b scripts/strings/rindex.m --- a/scripts/strings/rindex.m Fri Oct 07 08:53:04 2011 -0700 +++ b/scripts/strings/rindex.m Fri Oct 07 14:18:18 2011 -0700 @@ -20,7 +20,9 @@ ## @deftypefn {Function File} {} rindex (@var{s}, @var{t}) ## Return the position of the last occurrence of the character string ## @var{t} in the character string @var{s}, or 0 if no occurrence is -## found. For example: +## found. @var{s} may also be a string array or cell array of strings. +## +## For example: ## ## @example ## @group @@ -29,18 +31,18 @@ ## @end group ## @end example ## -## @strong{Caution:} This function does not work for arrays of -## character strings. +## The @code{rindex} function is equivalent to @code{index} with +## @var{direction} set to @samp{"last"}. +## ## @seealso{find, index} ## @end deftypefn ## Author: Kurt Hornik ## Adapted-By: jwe +## This is patterned after the AWK function of the same name. function n = rindex (s, t) - ## This is patterned after the AWK function of the same name. - if (nargin != 2) print_usage (); endif @@ -49,9 +51,17 @@ endfunction + %!assert(rindex ("foobarbaz", "b") == 7 && rindex ("foobarbaz", "o") == 3); -%!error rindex (); +%!test +%! str = char ("Hello", "World", "Goodbye", "World"); +%! assert (rindex (str, "o"), [5; 2; 3; 2]); +%! str = cellstr (str); +%! assert (rindex (str, "o"), [5; 2; 3; 2]); -%!error rindex ("foo", "bar", 3); +%% Test input validation +%!error rindex () +%!error rindex ("foo") +%!error rindex ("foo", "bar", "last")