]> Creatis software - CreaPhase.git/blob - octave_packages/m/strings/strchr.m
update packages
[CreaPhase.git] / octave_packages / m / strings / strchr.m
1 ## Copyright (C) 2008-2012 Jaroslav Hajek
2 ##
3 ## This file is part of Octave.
4 ##
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.
9 ##
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.
14 ##
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/>.
18
19 ## -*- texinfo -*-
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}.
27 ##
28 ## This will be faster than using regexp in most cases.
29 ##
30 ## @seealso{find}
31 ## @end deftypefn
32
33 function varargout = strchr (str, chars, varargin)
34
35   if (nargin < 2)
36     print_usage ();
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");
41   endif
42
43   if (isempty (chars))
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);
51     endfor
52   else
53     ## Index the str into a mask of valid values.
54     ## This is slower than it could be because of the +1 issue.
55     f = false (256, 1);
56     f(uint8(chars)+1) = true;
57     ## Default goes via double -- unnecessarily long.
58     si = uint32 (str);
59     ## in-place is faster than str+1
60     ++si;
61     mask = reshape (f(si), size (str));
62   endif
63
64   varargout = cell (1, nargout);
65   varargout{1} = [];
66   [varargout{:}] = find (mask, varargin{:});
67
68 endfunction
69
70
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])
74
75 %% Test input validation
76 %!error strchr ()
77 %!error strchr (1)
78 %!error <STR argument must be a string> strchr (1, "aeiou")
79 %!error <CHARS argument must be a string> strchr ("aeiou", 1)
80