Mercurial > hg > octave-nkf
annotate scripts/strings/findstr.m @ 15063:36cbcc37fdb8
Refactor configure.ac to make it more understandable.
Use common syntax for messages in config.h
Correct typos, refer to libraries in all caps, use two spaces after period.
Follow Autoconf guidelines and place general tests before specific tests.
* configure.ac, m4/acinclude.m4: Use common syntax for messages in config.h
Correct typos, refer to libraries in all caps, use two spaces after period.
Follow Autoconf guidelines and place general tests before specific tests.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 31 Jul 2012 10:28:51 -0700 |
parents | f3d52523cde1 |
children | d63878346099 |
rev | line source |
---|---|
14138
72c96de7a403
maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents:
13177
diff
changeset
|
1 ## Copyright (C) 1996-2012 Kurt Hornik |
2325 | 2 ## |
2313 | 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 | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
2313 | 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 | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
2272 | 18 |
3361 | 19 ## -*- texinfo -*- |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
20 ## @deftypefn {Function File} {} findstr (@var{s}, @var{t}) |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
21 ## @deftypefnx {Function File} {} findstr (@var{s}, @var{t}, @var{overlap}) |
3361 | 22 ## Return the vector of all positions in the longer of the two strings |
23 ## @var{s} and @var{t} where an occurrence of the shorter of the two starts. | |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
24 ## If the optional argument @var{overlap} is true, the returned vector |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10549
diff
changeset
|
25 ## can include overlapping positions (this is the default). For example: |
3426 | 26 ## |
3361 | 27 ## @example |
8442
502e58a0d44f
Fix docstrings, add examples, references and tests to string functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7411
diff
changeset
|
28 ## @group |
3361 | 29 ## findstr ("ababab", "a") |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
30 ## @result{} [1, 3, 5]; |
3361 | 31 ## findstr ("abababa", "aba", 0) |
8442
502e58a0d44f
Fix docstrings, add examples, references and tests to string functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7411
diff
changeset
|
32 ## @result{} [1, 5] |
502e58a0d44f
Fix docstrings, add examples, references and tests to string functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7411
diff
changeset
|
33 ## @end group |
3361 | 34 ## @end example |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
35 ## |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
36 ## @strong{Caution:} @code{findstr} is scheduled for deprecation. Use |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
37 ## @code{strfind} in all new code. |
8442
502e58a0d44f
Fix docstrings, add examples, references and tests to string functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7411
diff
changeset
|
38 ## @seealso{strfind, strmatch, strcmp, strncmp, strcmpi, strncmpi, find} |
3361 | 39 ## @end deftypefn |
2272 | 40 |
3891 | 41 ## Note that this implementation swaps the strings if second one is longer |
42 ## than the first, so try to put the longer one first. | |
43 ## | |
5428 | 44 ## Author: Kurt Hornik <Kurt.Hornik@wu-wien.ac.at> |
2355 | 45 ## Adapted-By: jwe |
2314 | 46 |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
47 function v = findstr (s, t, overlap = true) |
2275 | 48 |
49 if (nargin < 2 || nargin > 3) | |
6046 | 50 print_usage (); |
2275 | 51 endif |
52 | |
5348 | 53 if (all (size (s) > 1) || all (size (t) > 1)) |
54 error ("findstr: arguments must have only one non-singleton dimension"); | |
3891 | 55 endif |
56 | |
57 ## Make S be the longer string. | |
58 if (length (s) < length (t)) | |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
59 [s, t] = deal (t, s); |
3891 | 60 endif |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
61 |
3891 | 62 l_s = length (s); |
63 l_t = length (t); | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
64 |
3891 | 65 if (l_t == 0) |
4321 | 66 ## zero length target: return empty set |
67 v = []; | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
68 |
3891 | 69 elseif (l_t == 1) |
70 ## length one target: simple find | |
71 v = find (s == t); | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
72 |
3891 | 73 elseif (l_t == 2) |
74 ## length two target: find first at i and second at i+1 | |
75 v = find (s(1:l_s-1) == t(1) & s(2:l_s) == t(2)); | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
76 |
3891 | 77 else |
78 ## length three or more: match the first three by find then go through | |
79 ## the much smaller list to determine which of them are real matches | |
80 limit = l_s - l_t + 1; | |
81 v = find (s(1:limit) == t(1) | |
10549 | 82 & s(2:limit+1) == t(2) |
83 & s (3:limit+2) == t(3)); | |
3891 | 84 endif |
3759 | 85 |
3891 | 86 ## Need to search the index vector if our find was too short |
87 ## (target length > 3), or if we don't allow overlaps. Note though | |
88 ## that there cannot be any overlaps if the first character in the | |
89 ## target is different from the remaining characters in the target, | |
90 ## so a single character, two different characters, or first character | |
91 ## different from the second two don't need to be searched. | |
92 if (l_t >= 3 || (! overlap && l_t > 1 && any (t(1) == t(2:l_t)))) | |
93 ## force strings to be both row vectors or both column vectors | |
94 if (all (size (s) != size (t))) | |
95 t = t.'; | |
96 endif | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
97 |
3891 | 98 ## determine which ones to keep |
99 keep = zeros (size (v)); | |
100 ind = 0:l_t-1; | |
101 if (overlap) | |
102 for idx = 1:length (v) | |
10549 | 103 keep(idx) = all (s(v(idx) + ind) == t); |
3891 | 104 endfor |
2272 | 105 else |
8506 | 106 ## First possible position for next non-overlapping match. |
107 next = 1; | |
3891 | 108 for idx = 1:length (v) |
10549 | 109 if (v(idx) >= next && s(v(idx) + ind) == t) |
110 keep(idx) = 1; | |
111 ## Skip to the next possible match position. | |
112 next = v(idx) + l_t; | |
113 else | |
114 keep(idx) = 0; | |
115 endif | |
3891 | 116 endfor |
2272 | 117 endif |
3891 | 118 if (! isempty (v)) |
119 v = v(find (keep)); | |
120 endif | |
121 endif | |
5400 | 122 |
123 if (isempty (v)) | |
124 v = []; | |
125 endif | |
126 | |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
127 ## Always return a row vector, because that's what the old one did. |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
128 if (iscolumn (v)) |
3891 | 129 v = v.'; |
2272 | 130 endif |
131 | |
132 endfunction | |
7411 | 133 |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
134 |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
135 %!assert (findstr ("abababa", "a"), [1, 3, 5, 7]) |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
136 %!assert (findstr ("abababa", "aba"), [1, 3, 5]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
137 %!assert (findstr ("aba", "abababa", 0), [1, 5]) |
7411 | 138 |
13177
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
139 %% Test input validation |
17b702fae303
findstr.m: Use more modern code practices in function.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
140 %!error findstr () |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
141 %!error findstr ("foo", "bar", 3, 4) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
142 %!error <must have only one non-singleton dimension> findstr (["AB" ; "CD"], "C") |
7411 | 143 |