Mercurial > hg > octave-lyh
annotate src/strfns.cc @ 12897:503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
author | Jordi Gutiérrez Hermoso <jordigh@gmail.com> |
---|---|
date | Wed, 27 Jul 2011 18:47:13 -0500 |
parents | 7a5aacf65f81 |
children | 00f5292aefeb |
rev | line source |
---|---|
807 | 1 /* |
2 | |
11523 | 3 Copyright (C) 1994-2011 John W. Eaton |
807 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
807 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
807 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
1192 | 24 #include <config.h> |
807 | 25 #endif |
26 | |
1355 | 27 #include <cctype> |
7528
26d8a92644de
try to avoid ctype macro problems
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
28 |
8463
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
29 #include <queue> |
5765 | 30 #include <sstream> |
807 | 31 |
32 #include "dMatrix.h" | |
33 | |
5416 | 34 #include "Cell.h" |
1355 | 35 #include "defun.h" |
807 | 36 #include "error.h" |
37 #include "gripes.h" | |
2366 | 38 #include "ov.h" |
1355 | 39 #include "oct-obj.h" |
4457 | 40 #include "unwind-prot.h" |
807 | 41 #include "utils.h" |
42 | |
4358 | 43 DEFUN (char, args, , |
44 "-*- texinfo -*-\n\ | |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
45 @deftypefn {Built-in Function} {} char (@var{x})\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
46 @deftypefnx {Built-in Function} {} char (@var{x}, @dots{})\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
47 @deftypefnx {Built-in Function} {} char (@var{s1}, @var{s2}, @dots{})\n\ |
4358 | 48 @deftypefnx {Built-in Function} {} char (@var{cell_array})\n\ |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
49 Create a string array from one or more numeric matrices, character\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
50 matrices, or cell arrays. Arguments are concatenated vertically.\n\ |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
51 The returned values are padded with blanks as needed to make each row\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
52 of the string array have the same length. Empty input strings are\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
53 significant and will concatenated in the output.\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
54 \n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
55 For numerical input, each element is converted\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
56 to the corresponding ASCII character. A range error results if an input\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
57 is outside the ASCII range (0-255).\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
58 \n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
59 For cell arrays, each element is concatenated separately. Cell arrays\n\ |
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
60 converted through\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
61 @code{char} can mostly be converted back with @code{cellstr}.\n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
62 For example:\n\ |
4358 | 63 \n\ |
64 @example\n\ | |
65 @group\n\ | |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
66 char ([97, 98, 99], \"\", @{\"98\", \"99\", 100@}, \"str1\", [\"ha\", \"lf\"])\n\ |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
67 @result{} [\"abc \"\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
68 \" \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
69 \"98 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
70 \"99 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
71 \"d \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
72 \"str1 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
73 \"half \"]\n\ |
4358 | 74 @end group\n\ |
75 @end example\n\ | |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
76 @seealso{strvcat, cellstr}\n\ |
4358 | 77 @end deftypefn") |
78 { | |
79 octave_value retval; | |
80 | |
81 int nargin = args.length (); | |
82 | |
83 if (nargin == 1) | |
5281 | 84 retval = args(0).convert_to_str (true, true, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
85 args(0).is_dq_string () ? '"' : '\''); |
4358 | 86 else if (nargin > 1) |
87 { | |
88 int n_elts = 0; | |
89 | |
90 int max_len = 0; | |
91 | |
8463
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
92 std::queue<string_vector> args_as_strings; |
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
93 |
4358 | 94 for (int i = 0; i < nargin; i++) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
95 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
96 string_vector s = args(i).all_strings (); |
4358 | 97 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
98 if (error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
99 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
100 error ("char: unable to convert some args to strings"); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
101 return retval; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
102 } |
4358 | 103 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
104 if (s.length () > 0) |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
105 n_elts += s.length (); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
106 else |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
107 n_elts += 1; |
4358 | 108 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
109 int s_max_len = s.max_length (); |
4358 | 110 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
111 if (s_max_len > max_len) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
112 max_len = s_max_len; |
8463
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
113 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
114 args_as_strings.push (s); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
115 } |
4358 | 116 |
117 string_vector result (n_elts); | |
118 | |
119 int k = 0; | |
120 | |
121 for (int i = 0; i < nargin; i++) | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
122 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
123 string_vector s = args_as_strings.front (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
124 args_as_strings.pop (); |
4358 | 125 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
126 int n = s.length (); |
4358 | 127 |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
128 if (n > 0) |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
129 { |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
130 for (int j = 0; j < n; j++) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
131 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
132 std::string t = s[j]; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
133 int t_len = t.length (); |
4358 | 134 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
135 if (max_len > t_len) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
136 t += std::string (max_len - t_len, ' '); |
4358 | 137 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
138 result[k++] = t; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
139 } |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
140 } |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
141 else |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
142 result[k++] = std::string (max_len, ' '); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
143 } |
4358 | 144 |
5280 | 145 retval = octave_value (result, '\''); |
4358 | 146 } |
147 else | |
5823 | 148 print_usage (); |
4358 | 149 |
150 return retval; | |
151 } | |
152 | |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
153 /* |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
154 %!error <Invalid call to char> char() |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
155 %!assert (char (100) == "d"); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
156 %!assert (all(char (100,100) == ["d";"d"])); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
157 %!assert (all(char ({100,100}) == ["d";"d"])); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
158 %!assert (all(char ([100,100]) == ["dd"])); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
159 %!assert (all(char ({100,{100}}) == ["d";"d"])); |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
160 %!assert (all(char (100, [], 100) == ["d";" ";"d"])) |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
161 %!assert (all(char ({100, [], 100}) == ["d";" ";"d"])) |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
162 %!assert (all(char ({100,{100, {""}}}) == ["d";"d";" "])) |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
163 %!assert (all(char (["a";"be"], {"c", 100}) == ["a";"be";"c";"d"])) |
8372
8dff9cba15fe
move str2mat to deprecated and make it a simple wrapper around char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8353
diff
changeset
|
164 %!assert(strcmp (char ("a", "bb", "ccc"), ["a "; "bb "; "ccc"])); |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
165 */ |
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
166 |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
167 DEFUN (strvcat, args, , |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
168 "-*- texinfo -*-\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
169 @deftypefn {Built-in Function} {} strvcat (@var{x})\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
170 @deftypefnx {Built-in Function} {} strvcat (@var{x}, @dots{})\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
171 @deftypefnx {Built-in Function} {} strvcat (@var{s1}, @var{s2}, @dots{})\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
172 @deftypefnx {Built-in Function} {} strvcat (@var{cell_array})\n\ |
12897
503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
12483
diff
changeset
|
173 @deftypefnx {Built-in Function} {} strvcat ()\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
174 Create a character array from one or more numeric matrices, character\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
175 matrices, or cell arrays. Arguments are concatenated vertically.\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
176 The returned values are padded with blanks as needed to make each row\n\ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
177 of the string array have the same length. Unlike @code{char}, empty\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
178 strings are removed and will not appear in the output.\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
179 \n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
180 For numerical input, each element is converted\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
181 to the corresponding ASCII character. A range error results if an input\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
182 is outside the ASCII range (0-255).\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
183 \n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
184 For cell arrays, each element is concatenated separately. Cell arrays\n\ |
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
185 converted through\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
186 @code{strvcat} can mostly be converted back with @code{cellstr}.\n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
187 For example:\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
188 \n\ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
189 @example\n\ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
190 @group\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
191 strvcat ([97, 98, 99], \"\", @{\"98\", \"99\", 100@}, \"str1\", [\"ha\", \"lf\"])\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
192 @result{} [\"abc \"\n\ |
9307
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
193 \"98 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
194 \"99 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
195 \"d \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
196 \"str1 \"\n\ |
c2923c27c877
Various documentation improvements
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
197 \"half \"]\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
198 @end group\n\ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
199 @end example\n\ |
12897
503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
12483
diff
changeset
|
200 \n\ |
503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
12483
diff
changeset
|
201 For compatibility with @sc{Matlab}, calling @code{strvcat} without arguments\n\ |
503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
12483
diff
changeset
|
202 returns the empty string.\n\ |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
203 @seealso{char, strcat, cstrcat}\n\ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
204 @end deftypefn") |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
205 { |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
206 octave_value retval; |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
207 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
208 int nargin = args.length (); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
209 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
210 if (nargin > 0) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
211 { |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
212 int n_elts = 0; |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
213 |
8809
732cb0236488
strfns.cc: use size_t or octave_idx_type instead of int as needed
John W. Eaton <jwe@octave.org>
parents:
8524
diff
changeset
|
214 size_t max_len = 0; |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
215 |
8463
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
216 std::queue<string_vector> args_as_strings; |
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
217 |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
218 for (int i = 0; i < nargin; i++) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
219 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
220 string_vector s = args(i).all_strings (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
221 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
222 if (error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
223 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
224 error ("strvcat: unable to convert some args to strings"); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
225 return retval; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
226 } |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
227 |
8809
732cb0236488
strfns.cc: use size_t or octave_idx_type instead of int as needed
John W. Eaton <jwe@octave.org>
parents:
8524
diff
changeset
|
228 size_t n = s.length (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
229 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
230 // do not count empty strings in calculation of number of elements |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
231 if (n > 0) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
232 { |
8809
732cb0236488
strfns.cc: use size_t or octave_idx_type instead of int as needed
John W. Eaton <jwe@octave.org>
parents:
8524
diff
changeset
|
233 for (size_t j = 0; j < n; j++) |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
234 { |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
235 if (s[j].length () > 0) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
236 n_elts++; |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
237 } |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
238 } |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
239 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
240 size_t s_max_len = s.max_length (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
241 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
242 if (s_max_len > max_len) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
243 max_len = s_max_len; |
8463
a74871446af7
Fchar, Fstrvcat: use queue to avoid duplicate calls to all_strings
John W. Eaton <jwe@octave.org>
parents:
8462
diff
changeset
|
244 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
245 args_as_strings.push (s); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
246 } |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
247 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
248 string_vector result (n_elts); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
249 |
8809
732cb0236488
strfns.cc: use size_t or octave_idx_type instead of int as needed
John W. Eaton <jwe@octave.org>
parents:
8524
diff
changeset
|
250 octave_idx_type k = 0; |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
251 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
252 for (int i = 0; i < nargin; i++) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
253 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
254 string_vector s = args_as_strings.front (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
255 args_as_strings.pop (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
256 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
257 size_t n = s.length (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
258 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
259 if (n > 0) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
260 { |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
261 for (size_t j = 0; j < n; j++) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
262 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
263 std::string t = s[j]; |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
264 if (t.length () > 0) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
265 { |
8809
732cb0236488
strfns.cc: use size_t or octave_idx_type instead of int as needed
John W. Eaton <jwe@octave.org>
parents:
8524
diff
changeset
|
266 size_t t_len = t.length (); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
267 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
268 if (max_len > t_len) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
269 t += std::string (max_len - t_len, ' '); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
270 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
271 result[k++] = t; |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
272 } |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
273 } |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
274 } |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
275 } |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
276 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
277 retval = octave_value (result, '\''); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
278 } |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
279 else |
12897
503865c2e542
strfns.cc: Return empty string in strvcat if called sans arguments (bug #33533)
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
12483
diff
changeset
|
280 retval = octave_value (""); |
8462
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
281 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
282 return retval; |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
283 } |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
284 |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
285 /* |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
286 %!error <Invalid call to strvcat> strvcat() |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
287 %!assert (strvcat (""), ""); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
288 %!assert (strvcat (100) == "d"); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
289 %!assert (all(strvcat (100,100) == ["d";"d"])); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
290 %!assert (all(strvcat ({100,100}) == ["d";"d"])); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
291 %!assert (all(strvcat ([100,100]) == ["dd"])); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
292 %!assert (all(strvcat ({100,{100}}) == ["d";"d"])); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
293 %!assert (all(strvcat (100, [], 100) == ["d";"d"])) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
294 %!assert (all(strvcat ({100, [], 100}) == ["d";"d"])) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
295 %!assert (all(strvcat ({100,{100, {""}}}) == ["d";"d"])) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
296 %!assert (all(strvcat (["a";"be"], {"c", 100}) == ["a";"be";"c";"d"])) |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
297 %!assert(strcmp (strvcat ("a", "bb", "ccc"), ["a "; "bb "; "ccc"])); |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
298 */ |
ebdf1e058d85
Make strvcat an internal function
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8461
diff
changeset
|
299 |
8353
349a555729a9
keep empty strings in char
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
7528
diff
changeset
|
300 |
4535 | 301 DEFUN (ischar, args, , |
3361 | 302 "-*- texinfo -*-\n\ |
11431
0d9640d755b1
Improve docstrings for all isXXX functions.
Rik <octave@nomad.inbox5.com>
parents:
10846
diff
changeset
|
303 @deftypefn {Built-in Function} {} ischar (@var{x})\n\ |
0d9640d755b1
Improve docstrings for all isXXX functions.
Rik <octave@nomad.inbox5.com>
parents:
10846
diff
changeset
|
304 Return true if @var{x} is a character array.\n\ |
0d9640d755b1
Improve docstrings for all isXXX functions.
Rik <octave@nomad.inbox5.com>
parents:
10846
diff
changeset
|
305 @seealso{isfloat, isinteger, islogical, isnumeric, iscellstr, isa}\n\ |
3361 | 306 @end deftypefn") |
807 | 307 { |
4233 | 308 octave_value retval; |
807 | 309 |
310 int nargin = args.length (); | |
311 | |
312 if (nargin == 1 && args(0).is_defined ()) | |
4233 | 313 retval = args(0).is_string (); |
807 | 314 else |
5823 | 315 print_usage (); |
807 | 316 |
317 return retval; | |
318 } | |
319 | |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
320 /* |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
321 |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
322 %!assert (ischar ("a"), logical (1)); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
323 %!assert (ischar (["ab";"cd"]), logical (1)); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
324 %!assert (ischar ({"ab"}), logical (0)); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
325 %!assert (ischar (1), logical (0)); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
326 %!error <Invalid call to ischar.*> ischar (); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
327 |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
328 */ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
329 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
330 static octave_value |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
331 do_strcmp_fun (const octave_value& arg0, const octave_value& arg1, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
332 octave_idx_type n, const char *fcn_name, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
333 bool (*array_op) (const charNDArray&, const charNDArray&, octave_idx_type), |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
334 bool (*str_op) (const std::string&, const std::string&, octave_idx_type)) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
335 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
336 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
337 octave_value retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
338 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
339 bool s1_string = arg0.is_string (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
340 bool s1_cell = arg0.is_cell (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
341 bool s2_string = arg1.is_string (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
342 bool s2_cell = arg1.is_cell (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
343 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
344 if (s1_string && s2_string) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
345 retval = array_op (arg0.char_array_value (), arg1.char_array_value (), n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
346 else if ((s1_string && s2_cell) || (s1_cell && s2_string)) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
347 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
348 octave_value str_val, cell_val; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
349 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
350 if (s1_string) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
351 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
352 str_val = arg0; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
353 cell_val = arg1; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
354 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
355 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
356 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
357 str_val = arg1; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
358 cell_val = arg0; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
359 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
360 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
361 const Cell cell = cell_val.cell_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
362 const string_vector str = str_val.all_strings (); |
10350
12884915a8e4
merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents:
10318
diff
changeset
|
363 octave_idx_type r = str.length (); |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
364 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
365 if (r == 0 || r == 1) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
366 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
367 // Broadcast the string. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
368 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
369 boolNDArray output (cell_val.dims (), false); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
370 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
371 std::string s = r == 0 ? std::string () : str[0]; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
372 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
373 if (cell_val.is_cellstr ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
374 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
375 const Array<std::string> cellstr = cell_val.cellstr_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
376 for (octave_idx_type i = 0; i < cellstr.length (); i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
377 output(i) = str_op (cellstr(i), s, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
378 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
379 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
380 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
381 // FIXME: should we warn here? |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
382 for (octave_idx_type i = 0; i < cell.length (); i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
383 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
384 if (cell(i).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
385 output(i) = str_op (cell(i).string_value (), s, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
386 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
387 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
388 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
389 retval = output; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
390 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
391 else if (r > 1) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
392 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
393 if (cell.length () == 1) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
394 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
395 // Broadcast the cell. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
396 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
397 const dim_vector dv (r, 1); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
398 boolNDArray output (dv, false); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
399 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
400 if (cell(0).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
401 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
402 const std::string str2 = cell(0).string_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
403 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
404 for (octave_idx_type i = 0; i < r; i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
405 output(i) = str_op (str[i], str2, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
406 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
407 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
408 retval = output; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
409 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
410 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
411 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
412 // Must match in all dimensions. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
413 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
414 boolNDArray output (cell.dims (), false); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
415 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
416 if (cell.length () == r) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
417 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
418 if (cell_val.is_cellstr ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
419 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
420 const Array<std::string> cellstr = cell_val.cellstr_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
421 for (octave_idx_type i = 0; i < cellstr.length (); i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
422 output(i) = str_op (str[i], cellstr(i), n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
423 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
424 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
425 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
426 // FIXME: should we warn here? |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
427 for (octave_idx_type i = 0; i < r; i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
428 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
429 if (cell(i).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
430 output(i) = str_op (str[i], cell(i).string_value (), n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
431 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
432 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
433 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
434 retval = output; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
435 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
436 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
437 retval = false; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
438 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
439 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
440 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
441 else if (s1_cell && s2_cell) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
442 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
443 octave_value cell1_val, cell2_val; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
444 octave_idx_type r1 = arg0.numel (), r2; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
445 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
446 if (r1 == 1) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
447 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
448 // Make the singleton cell2. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
449 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
450 cell1_val = arg1; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
451 cell2_val = arg0; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
452 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
453 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
454 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
455 cell1_val = arg0; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
456 cell2_val = arg1; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
457 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
458 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
459 const Cell cell1 = cell1_val.cell_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
460 const Cell cell2 = cell2_val.cell_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
461 r1 = cell1.numel (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
462 r2 = cell2.numel (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
463 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
464 const dim_vector size1 = cell1.dims (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
465 const dim_vector size2 = cell2.dims (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
466 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
467 boolNDArray output (size1, false); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
468 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
469 if (r2 == 1) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
470 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
471 // Broadcast cell2. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
472 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
473 if (cell2(0).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
474 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
475 const std::string str2 = cell2(0).string_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
476 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
477 if (cell1_val.is_cellstr ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
478 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
479 const Array<std::string> cellstr = cell1_val.cellstr_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
480 for (octave_idx_type i = 0; i < cellstr.length (); i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
481 output(i) = str_op (cellstr(i), str2, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
482 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
483 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
484 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
485 // FIXME: should we warn here? |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
486 for (octave_idx_type i = 0; i < r1; i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
487 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
488 if (cell1(i).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
489 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
490 const std::string str1 = cell1(i).string_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
491 output(i) = str_op (str1, str2, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
492 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
493 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
494 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
495 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
496 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
497 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
498 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
499 if (size1 != size2) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
500 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
501 error ("%s: nonconformant cell arrays", fcn_name); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
502 return retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
503 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
504 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
505 if (cell1.is_cellstr () && cell2.is_cellstr ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
506 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
507 const Array<std::string> cellstr1 = cell1_val.cellstr_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
508 const Array<std::string> cellstr2 = cell2_val.cellstr_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
509 for (octave_idx_type i = 0; i < r1; i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
510 output (i) = str_op (cellstr1(i), cellstr2(i), n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
511 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
512 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
513 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
514 // FIXME: should we warn here? |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
515 for (octave_idx_type i = 0; i < r1; i++) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
516 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
517 if (cell1(i).is_string () && cell2(i).is_string ()) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
518 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
519 const std::string str1 = cell1(i).string_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
520 const std::string str2 = cell2(i).string_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
521 output(i) = str_op (str1, str2, n); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
522 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
523 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
524 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
525 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
526 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
527 retval = output; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
528 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
529 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
530 retval = false; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
531 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
532 return retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
533 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
534 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
535 // If both args are arrays, dimensions may be significant. |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
536 static bool |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
537 strcmp_array_op (const charNDArray& s1, const charNDArray& s2, octave_idx_type) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
538 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
539 return (s1.dims () == s2.dims () |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
540 && std::equal (s1.data (), s1.data () + s1.numel (), s2.data ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
541 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
542 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
543 // Otherwise, just use strings. |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
544 static bool |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
545 strcmp_str_op (const std::string& s1, const std::string& s2, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
546 octave_idx_type) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
547 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
548 return s1 == s2; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
549 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
550 |
5415 | 551 DEFUN (strcmp, args, , |
552 "-*- texinfo -*-\n\ | |
6678 | 553 @deftypefn {Built-in Function} {} strcmp (@var{s1}, @var{s2})\n\ |
5415 | 554 Return 1 if the character strings @var{s1} and @var{s2} are the same,\n\ |
555 and 0 otherwise.\n\ | |
5674 | 556 \n\ |
557 If either @var{s1} or @var{s2} is a cell array of strings, then an array\n\ | |
558 of the same size is returned, containing the values described above for\n\ | |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
559 every member of the cell array. The other argument may also be a cell\n\ |
5674 | 560 array of strings (of the same size or with only one element), char matrix\n\ |
561 or character string.\n\ | |
562 \n\ | |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
9036
diff
changeset
|
563 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strcmp\n\ |
5674 | 564 function returns 1 if the character strings are equal, and 0 otherwise.\n\ |
565 This is just the opposite of the corresponding C library function.\n\ | |
566 @seealso{strcmpi, strncmp, strncmpi}\n\ | |
5415 | 567 @end deftypefn") |
568 { | |
5531 | 569 octave_value retval; |
5415 | 570 |
5416 | 571 if (args.length () == 2) |
572 { | |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
573 retval = do_strcmp_fun (args (0), args (1), 0, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
574 "strcmp", strcmp_array_op, strcmp_str_op); |
5415 | 575 } |
5416 | 576 else |
5823 | 577 print_usage (); |
5415 | 578 |
579 return retval; | |
580 } | |
581 | |
5862 | 582 /* |
583 %!shared x | |
584 %! x = char (zeros (0, 2)); | |
585 %!assert (strcmp ('', x) == false); | |
586 %!assert (strcmp (x, '') == false); | |
587 %!assert (strcmp (x, x) == true); | |
5911 | 588 ## %!assert (strcmp ({''}, x) == false); |
589 ## %!assert (strcmp ({x}, '') == false); | |
590 ## %!assert (strcmp ({x}, x) == true); | |
591 ## %!assert (strcmp ('', {x}) == false); | |
592 ## %!assert (strcmp (x, {''}) == false); | |
593 ## %!assert (strcmp (x, {x}) == true); | |
594 ## %!assert (all (strcmp ({x; x}, '') == [false; false])); | |
595 ## %!assert (all (strcmp ({x; x}, {''}) == [false; false])); | |
596 ## %!assert (all (strcmp ('', {x; x}) == [false; false])); | |
597 ## %!assert (all (strcmp ({''}, {x; x}) == [false; false])); | |
5862 | 598 %!assert (strcmp ({'foo'}, x) == false); |
599 %!assert (strcmp ({'foo'}, 'foo') == true); | |
600 %!assert (strcmp ({'foo'}, x) == false); | |
601 %!assert (strcmp (x, {'foo'}) == false); | |
602 %!assert (strcmp ('foo', {'foo'}) == true); | |
603 %!assert (strcmp (x, {'foo'}) == false); | |
604 %!shared y | |
605 %! y = char (zeros (2, 0)); | |
606 %!assert (strcmp ('', y) == false); | |
607 %!assert (strcmp (y, '') == false); | |
608 %!assert (strcmp (y, y) == true); | |
609 %!assert (all (strcmp ({''}, y) == [true; true])); | |
610 %!assert (strcmp ({y}, '') == true); | |
611 %!assert (all (strcmp ({y}, y) == [true; true])); | |
612 %!assert (all (strcmp ('', {y}) == [true; true])); | |
613 %!assert (all (strcmp (y, {''}) == [true; true])); | |
614 %!assert (all (strcmp (y, {y}) == [true; true])); | |
5911 | 615 ## %!assert (all (strcmp ({y; y}, '') == [false; false])); |
616 ## %!assert (all (strcmp ({y; y}, {''}) == [false; false])); | |
617 ## %!assert (all (strcmp ('', {y; y}) == [false; false])); | |
618 ## %!assert (all (strcmp ({''}, {y; y}) == [false; false])); | |
5862 | 619 %!assert (all (strcmp ({'foo'}, y) == [false; false])); |
620 %!assert (all (strcmp ({'foo'}, y) == [false; false])); | |
621 %!assert (all (strcmp (y, {'foo'}) == [false; false])); | |
622 %!assert (all (strcmp (y, {'foo'}) == [false; false])); | |
623 */ | |
624 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
625 // Apparently, Matlab ignores the dims with strncmp. It also |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
626 static bool |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
627 strncmp_array_op (const charNDArray& s1, const charNDArray& s2, octave_idx_type n) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
628 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
629 octave_idx_type l1 = s1.numel (), l2 = s2.numel (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
630 return (n > 0 && n <= l1 && n <= l2 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
631 && std::equal (s1.data (), s1.data () + n, s2.data ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
632 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
633 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
634 // Otherwise, just use strings. Note that we neither extract substrings (which |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
635 // would mean a copy, at least in GCC), nor use string::compare (which is a |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
636 // 3-way compare). |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
637 static bool |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
638 strncmp_str_op (const std::string& s1, const std::string& s2, octave_idx_type n) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
639 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
640 octave_idx_type l1 = s1.length (), l2 = s2.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
641 return (n > 0 && n <= l1 && n <= l2 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
642 && std::equal (s1.data (), s1.data () + n, s2.data ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
643 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
644 |
6250 | 645 DEFUN (strncmp, args, , |
646 "-*- texinfo -*-\n\ | |
6678 | 647 @deftypefn {Built-in Function} {} strncmp (@var{s1}, @var{s2}, @var{n})\n\ |
10840 | 648 Return 1 if the first @var{n} characters of strings @var{s1} and @var{s2} are\n\ |
649 the same, and 0 otherwise.\n\ | |
6250 | 650 \n\ |
651 @example\n\ | |
652 @group\n\ | |
653 strncmp (\"abce\", \"abcd\", 3)\n\ | |
654 @result{} 1\n\ | |
655 @end group\n\ | |
656 @end example\n\ | |
657 \n\ | |
658 If either @var{s1} or @var{s2} is a cell array of strings, then an array\n\ | |
659 of the same size is returned, containing the values described above for\n\ | |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
660 every member of the cell array. The other argument may also be a cell\n\ |
6250 | 661 array of strings (of the same size or with only one element), char matrix\n\ |
662 or character string.\n\ | |
663 \n\ | |
664 @example\n\ | |
665 @group\n\ | |
6256 | 666 strncmp (\"abce\", @{\"abcd\", \"bca\", \"abc\"@}, 3)\n\ |
6250 | 667 @result{} [1, 0, 1]\n\ |
668 @end group\n\ | |
669 @end example\n\ | |
670 \n\ | |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
9036
diff
changeset
|
671 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strncmp\n\ |
6250 | 672 function returns 1 if the character strings are equal, and 0 otherwise.\n\ |
673 This is just the opposite of the corresponding C library function.\n\ | |
674 @seealso{strncmpi, strcmp, strcmpi}\n\ | |
675 @end deftypefn") | |
676 { | |
677 octave_value retval; | |
678 | |
679 if (args.length () == 3) | |
680 { | |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
681 octave_idx_type n = args(2).idx_type_value (); |
6250 | 682 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
683 if (! error_state) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
684 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
685 if (n > 0) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
686 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
687 retval = do_strcmp_fun (args(0), args(1), n, "strncmp", |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
688 strncmp_array_op, strncmp_str_op); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
689 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
690 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
691 error ("strncmp: N must be greater than 0"); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
692 } |
6250 | 693 } |
694 else | |
695 print_usage (); | |
696 | |
697 return retval; | |
698 } | |
699 | |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
700 /* |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
701 %!error <Invalid call to strncmp.*> strncmp (); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
702 %!error <Invalid call to strncmp.*> strncmp ("abc", "def"); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
703 %!assert (strncmp ("abce", "abc", 3) == 1) |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
704 %!assert (strncmp (100, 100, 1) == 0) |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
705 %!assert (all (strncmp ("abce", {"abcd", "bca", "abc"}, 3) == [1, 0, 1])) |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
706 %!assert (all (strncmp ("abc", {"abcd", "bca", "abc"}, 4) == [0, 0, 0])) |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
707 %!assert (all (strncmp ({"abcd", "bca", "abc"},"abce", 3) == [1, 0, 1])) |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
708 %!assert (all (strncmp ({"abcd", "bca", "abc"},{"abcd", "bca", "abe"}, 3) == [1, 1, 0])) |
8472
5451f7460ea6
strfns.cc (Fstrcmp, Fstrncmp): initialize all elements of output with constructor arg
John W. Eaton <jwe@octave.org>
parents:
8464
diff
changeset
|
709 %!assert (all (strncmp("abc", {"abcd", 10}, 2) == [1, 0])) |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
710 */ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
711 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
712 // case-insensitive character equality functor |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
713 struct icmp_char_eq : public std::binary_function<char, char, bool> |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
714 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
715 bool operator () (char x, char y) const |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
716 { return std::toupper (x) == std::toupper (y); } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
717 }; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
718 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
719 // strcmpi is equivalent to strcmp in that it checks all dims. |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
720 static bool |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
721 strcmpi_array_op (const charNDArray& s1, const charNDArray& s2, octave_idx_type) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
722 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
723 return (s1.dims () == s2.dims () |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
724 && std::equal (s1.data (), s1.data () + s1.numel (), s2.data (), |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
725 icmp_char_eq ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
726 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
727 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
728 // Ditto for string. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
729 static bool |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
730 strcmpi_str_op (const std::string& s1, const std::string& s2, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
731 octave_idx_type) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
732 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
733 return (s1.size () == s2.size () |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
734 && std::equal (s1.data (), s1.data () + s1.size (), s2.data (), |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
735 icmp_char_eq ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
736 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
737 |
10316
9966f1f71c32
use DEFUNX instead of DEFUN for strcmpi and strncmpi
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
738 DEFUNX ("strcmpi", Fstrcmpi, args, , |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
739 "-*- texinfo -*-\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
740 @deftypefn {Built-in Function} {} strcmpi (@var{s1}, @var{s2})\n\ |
11572
7d6d8c1e471f
Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
741 Return 1 if the character strings @var{s1} and @var{s2} are the same,\n\ |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
742 disregarding case of alphabetic characters, and 0 otherwise.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
743 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
744 If either @var{s1} or @var{s2} is a cell array of strings, then an array\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
745 of the same size is returned, containing the values described above for\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
746 every member of the cell array. The other argument may also be a cell\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
747 array of strings (of the same size or with only one element), char matrix\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
748 or character string.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
749 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
750 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strcmp\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
751 function returns 1 if the character strings are equal, and 0 otherwise.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
752 This is just the opposite of the corresponding C library function.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
753 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
754 @strong{Caution:} National alphabets are not supported.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
755 @seealso{strcmp, strncmp, strncmpi}\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
756 @end deftypefn") |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
757 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
758 octave_value retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
759 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
760 if (args.length () == 2) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
761 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
762 retval = do_strcmp_fun (args (0), args (1), 0, |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
763 "strcmpi", strcmpi_array_op, strcmpi_str_op); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
764 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
765 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
766 print_usage (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
767 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
768 return retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
769 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
770 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
771 /* |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
772 %!assert (strcmpi("abc123", "ABC123"), logical(1)); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
773 */ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
774 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
775 // Like strncmp. |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
776 static bool |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
777 strncmpi_array_op (const charNDArray& s1, const charNDArray& s2, octave_idx_type n) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
778 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
779 octave_idx_type l1 = s1.numel (), l2 = s2.numel (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
780 return (n > 0 && n <= l1 && n <= l2 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
781 && std::equal (s1.data (), s1.data () + n, s2.data (), |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
782 icmp_char_eq ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
783 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
784 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
785 // Ditto. |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
786 static bool |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
787 strncmpi_str_op (const std::string& s1, const std::string& s2, octave_idx_type n) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
788 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
789 octave_idx_type l1 = s1.length (), l2 = s2.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
790 return (n > 0 && n <= l1 && n <= l2 |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
791 && std::equal (s1.data (), s1.data () + n, s2.data (), |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
792 icmp_char_eq ())); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
793 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
794 |
10318
f0ac2fa91733
fix incorrect strncmpi change
John W. Eaton <jwe@octave.org>
parents:
10316
diff
changeset
|
795 DEFUNX ("strncmpi", Fstrncmpi, args, , |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
796 "-*- texinfo -*-\n\ |
10234
c4c2bda71f82
fix typo in strncmpi docstring
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
797 @deftypefn {Built-in Function} {} strncmpi (@var{s1}, @var{s2}, @var{n})\n\ |
11572
7d6d8c1e471f
Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
798 Return 1 if the first @var{n} character of @var{s1} and @var{s2} are the\n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
799 same, disregarding case of alphabetic characters, and 0 otherwise.\n\ |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
800 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
801 If either @var{s1} or @var{s2} is a cell array of strings, then an array\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
802 of the same size is returned, containing the values described above for\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
803 every member of the cell array. The other argument may also be a cell\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
804 array of strings (of the same size or with only one element), char matrix\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
805 or character string.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
806 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
807 @strong{Caution:} For compatibility with @sc{matlab}, Octave's strncmpi\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
808 function returns 1 if the character strings are equal, and 0 otherwise.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
809 This is just the opposite of the corresponding C library function.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
810 \n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
811 @strong{Caution:} National alphabets are not supported.\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
812 @seealso{strncmp, strcmp, strcmpi}\n\ |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
813 @end deftypefn") |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
814 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
815 octave_value retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
816 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
817 if (args.length () == 3) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
818 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
819 octave_idx_type n = args(2).idx_type_value (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
820 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
821 if (! error_state) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
822 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
823 if (n > 0) |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
824 { |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
825 retval = do_strcmp_fun (args(0), args(1), n, "strncmpi", |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
826 strncmpi_array_op, strncmpi_str_op); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
827 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
828 else |
10316
9966f1f71c32
use DEFUNX instead of DEFUN for strcmpi and strncmpi
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
829 error ("strncmpi: N must be greater than 0"); |
10108
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
830 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
831 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
832 else |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
833 print_usage (); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
834 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
835 return retval; |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
836 } |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
837 |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
838 /* |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
839 %!assert (strncmpi("abc123", "ABC456", 3), logical(1)); |
06e11df4592d
implement built-in strcmpi/strncmpi, reduce some code duplication
Jaroslav Hajek <highegg@gmail.com>
parents:
9307
diff
changeset
|
840 */ |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
841 |
5690 | 842 DEFUN (list_in_columns, args, , |
843 "-*- texinfo -*-\n\ | |
844 @deftypefn {Built-in Function} {} list_in_columns (@var{arg}, @var{width})\n\ | |
845 Return a string containing the elements of @var{arg} listed in\n\ | |
846 columns with an overall maximum width of @var{width}. The argument\n\ | |
847 @var{arg} must be a cell array of character strings or a character array.\n\ | |
848 If @var{width} is not specified, the width of the terminal screen is used.\n\ | |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
849 Newline characters are used to break the lines in the output string.\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
850 For example:\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
851 \n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
852 @example\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
853 @group\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
854 list_in_columns (@{\"abc\", \"def\", \"ghijkl\", \"mnop\", \"qrs\", \"tuv\"@}, 20)\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
855 @result{} ans = abc mnop\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
856 def qrs\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
857 ghijkl tuv\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
858 \n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
859 whos ans\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
860 @result{}\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
861 Variables in the current scope:\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
862 \n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
863 Attr Name Size Bytes Class\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
864 ==== ==== ==== ===== =====\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
865 ans 1x37 37 char\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
866 \n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
867 Total is 37 elements using 37 bytes\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
868 @end group\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
869 @end example\n\ |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
870 \n\ |
5690 | 871 @seealso{terminal_size}\n\ |
872 @end deftypefn") | |
873 { | |
874 octave_value retval; | |
875 | |
876 int nargin = args.length (); | |
877 | |
878 if (nargin == 1 || nargin == 2) | |
879 { | |
880 string_vector s = args(0).all_strings (); | |
881 | |
882 if (! error_state) | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
883 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
884 std::ostringstream buf; |
5690 | 885 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
886 if (nargin == 1) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
887 // Let list_in_columns query terminal width. |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
888 s.list_in_columns (buf); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
889 else |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
890 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
891 int width = args(1).int_value (); |
5690 | 892 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
893 if (! error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
894 s.list_in_columns (buf, width); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
895 else |
12483
7a5aacf65f81
Rewrite error strings in src/ to use variables named in documentation.
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
896 error ("list_in_columns: WIDTH must be an integer"); |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
897 } |
5690 | 898 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
899 retval = buf.str (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
900 } |
5690 | 901 else |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10234
diff
changeset
|
902 error ("list_in_columns: expecting cellstr or char array"); |
5690 | 903 } |
904 else | |
5823 | 905 print_usage (); |
5690 | 906 |
907 return retval; | |
908 } | |
909 | |
807 | 910 /* |
8461
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
911 %!error <Invalid call to list_in_columns.*> list_in_columns (); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
912 %!error <Invalid call to list_in_columns.*> list_in_columns (["abc", "def"], 20, 2); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
913 %!error <invalid conversion from string to real scalar.*> list_in_columns (["abc", "def"], "a"); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
914 %!test |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
915 %! input = {"abc", "def", "ghijkl", "mnop", "qrs", "tuv"}; |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
916 %! result = "abc mnop\ndef qrs\nghijkl tuv\n"; |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
917 %! assert (list_in_columns (input, 20) == result); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
918 %!test |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
919 %! input = ["abc"; "def"; "ghijkl"; "mnop"; "qrs"; "tuv"]; |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
920 %! result = "abc mnop \ndef qrs \nghijkl tuv \n"; |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
921 %! assert (list_in_columns (input, 20) == result); |
9d456730b7a8
strfns.cc: improve documentation strings, add examples and tests
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8372
diff
changeset
|
922 */ |