1 ## Copyright (C) 2008-2012 Jaroslav Hajek
3 ## This file is part of Octave.
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ## General Public License for more details.
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING. If not, see
17 ## <http://www.gnu.org/licenses/>.
20 ## @deftypefn {Function File} {@var{idx} =} strchr (@var{str}, @var{chars})
21 ## @deftypefnx {Function File} {@var{idx} =} strchr (@var{str}, @var{chars}, @var{n})
22 ## @deftypefnx {Function File} {@var{idx} =} strchr (@var{str}, @var{chars}, @var{n}, @var{direction})
23 ## @deftypefnx {Function File} {[@var{i}, @var{j}] =} strchr (@dots{})
24 ## Search for the string @var{str} for occurrences of characters from
25 ## the set @var{chars}. The return value(s), as well as the @var{n} and
26 ## @var{direction} arguments behave identically as in @code{find}.
28 ## This will be faster than using regexp in most cases.
33 function varargout = strchr (str, chars, varargin)
37 elseif (! ischar (str))
38 error ("strchr: STR argument must be a string or string array");
39 elseif (! ischar (chars))
40 error ("strchr: CHARS argument must be a string");
44 mask = false (size (str));
45 elseif (length (chars) <= 4)
46 ## With a few characters, it pays off to build the mask incrementally.
47 ## We do it via a for loop to save memory.
48 mask = str == chars(1);
49 for i = 2:length (chars)
50 mask |= str == chars(i);
53 ## Index the str into a mask of valid values.
54 ## This is slower than it could be because of the +1 issue.
56 f(uint8(chars)+1) = true;
57 ## Default goes via double -- unnecessarily long.
59 ## in-place is faster than str+1
61 mask = reshape (f(si), size (str));
64 varargout = cell (1, nargout);
66 [varargout{:}] = find (mask, varargin{:});
71 %!assert (strchr ("Octave is the best software", ""), zeros (1,0))
72 %!assert (strchr ("Octave is the best software", "best"), [3, 6, 9, 11, 13, 15, 16, 17, 18, 20, 23, 27])
73 %!assert (strchr ("Octave is the best software", "software"), [3, 4, 6, 9, 11, 13, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27])
75 %% Test input validation
78 %!error <STR argument must be a string> strchr (1, "aeiou")
79 %!error <CHARS argument must be a string> strchr ("aeiou", 1)