Mercurial > hg > octave-nkf
annotate scripts/general/genvarname.m @ 15107:03381a36f70d
generate convenience libraries for new parse-tree and interpfcn subdirectories
* src/Makefile.am (liboctinterp_la_SOURCES): Include octave.cc in the
list, not $(DIST_SRC).
(liboctinterp_la_LIBADD): Include octave-value/liboctave-value.la,
parse-tree/libparse-tree.la, interp-core/libinterp-core.la,
interpfcn/libinterpfcn.la, and corefcn/libcorefcn.la in the list.
* src/interp-core/module.mk (noinst_LTLIBRARIES): Add
interp-core/libinterp-core.la to the list.
(interp_core_libinterp_core_la_SOURCES): New variable.
* src/interpfcn/module.mk (noinst_LTLIBRARIES): Add
interpfcn/libinterpfcn.la to the list.
(interpfcn_libinterpfcn_la_SOURCES): New variable.
* src/parse-tree/module.mk (noinst_LTLIBRARIES): Add
parse-tree/libparse-tree.la to the list.
(parse_tree_libparse_tree_la_SOURCES): New variable.
* src/octave-value/module.mk (noinst_LTLIBRARIES): Add
octave-value/liboctave-value.la to the list.
(octave_value_liboctave_value_la_SOURCES): New variable.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sun, 05 Aug 2012 09:04:30 -0400 |
parents | 5d3a684236b0 |
children | 333243133364 |
rev | line source |
---|---|
14138
72c96de7a403
maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
1 ## Copyright (C) 2008-2012 Bill Denney, Robert Platt |
7657 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
16 ## along with Octave; see the file COPYING. If not, see | |
17 ## <http://www.gnu.org/licenses/>. | |
18 | |
19 ## -*- texinfo -*- | |
10793
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
9037
diff
changeset
|
20 ## @deftypefn {Function File} {@var{varname} =} genvarname (@var{str}) |
7975
ed4ec7875f98
trival doc fix for genvarname
David Bateman <dbateman@free.fr>
parents:
7657
diff
changeset
|
21 ## @deftypefnx {Function File} {@var{varname} =} genvarname (@var{str}, @var{exclusions}) |
7657 | 22 ## Create unique variable(s) from @var{str}. If @var{exclusions} is |
23 ## given, then the variable(s) will be unique to each other and to | |
24 ## @var{exclusions} (@var{exclusions} may be either a string or a cellstr). | |
25 ## | |
26 ## If @var{str} is a cellstr, then a unique variable is created for each | |
27 ## cell in @var{str}. | |
28 ## | |
29 ## @example | |
30 ## @group | |
31 ## x = 3.141; | |
32 ## genvarname ("x", who ()) | |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
33 ## @result{} x1 |
7657 | 34 ## @end group |
35 ## @end example | |
36 ## | |
37 ## If @var{wanted} is a cell array, genvarname will make sure the returned | |
38 ## strings are distinct: | |
39 ## | |
40 ## @example | |
41 ## @group | |
42 ## genvarname (@{"foo", "foo"@}) | |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
43 ## @result{} |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
44 ## @{ |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
45 ## [1,1] = foo |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
46 ## [1,2] = foo1 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
47 ## @} |
7657 | 48 ## @end group |
49 ## @end example | |
50 ## | |
51 ## Note that the result is a char array/cell array of strings, not the | |
9037
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
52 ## variables themselves. To define a variable, @code{eval()} can be |
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
53 ## used. The following trivial example sets @code{x} to @code{42}. |
7657 | 54 ## |
55 ## @example | |
56 ## @group | |
57 ## name = genvarname ("x"); | |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
58 ## eval ([name " = 42"]); |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
59 ## @result{} x = 42 |
7657 | 60 ## @end group |
61 ## @end example | |
62 ## | |
63 ## Also, this can be useful for creating unique struct field names. | |
64 ## | |
65 ## @example | |
66 ## @group | |
67 ## x = struct (); | |
68 ## for i = 1:3 | |
69 ## x.(genvarname ("a", fieldnames (x))) = i; | |
70 ## endfor | |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
71 ## @result{} x = |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
72 ## @{ |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
73 ## a = 1 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
74 ## a1 = 2 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
75 ## a2 = 3 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
76 ## @} |
7657 | 77 ## @end group |
78 ## @end example | |
79 ## | |
80 ## Since variable names may only contain letters, digits and underscores, | |
81 ## genvarname replaces any sequence of disallowed characters with | |
9037
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
82 ## an underscore. Also, variables may not begin with a digit; in this |
7657 | 83 ## case an underscore is added before the variable name. |
84 ## | |
85 ## Variable names beginning and ending with two underscores "__" are valid but | |
86 ## they are used internally by octave and should generally be avoided, therefore | |
87 ## genvarname will not generate such names. | |
88 ## | |
89 ## genvarname will also make sure that returned names do not clash with | |
9037
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
90 ## keywords such as "for" and "if". A number will be appended if necessary. |
7657 | 91 ## Note, however, that this does @strong{not} include function names, |
9037
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
92 ## such as "sin". Such names should be included in @var{avoid} if necessary. |
7657 | 93 ## @seealso{isvarname, exist, tmpnam, eval} |
94 ## @end deftypefn | |
95 | |
96 ## Authors: Rob Platt <robert.platt@postgrad.manchester.ac.uk> | |
97 ## Bill Denney <bill@denney.ws> | |
98 | |
99 function varname = genvarname (str, exclusions) | |
100 | |
101 strinput = ischar (str); | |
102 ## Process the inputs | |
103 if (nargin < 2) | |
104 exclusions = {}; | |
105 elseif (ischar (exclusions)) | |
106 if (rows (exclusions) != 1) | |
8664 | 107 error ("genvarname: if more than one exclusion is given, it must be a cellstr"); |
7657 | 108 endif |
109 exclusions = {exclusions}; | |
110 elseif (! iscellstr (exclusions)) | |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
111 error ("genvarname: EXCLUSIONS must be a string or a cellstr"); |
7657 | 112 endif |
113 if (ischar (str)) | |
114 if (rows (str) != 1) | |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
115 error ("genvarname: if more than one STR is given, it must be a cellstr"); |
7657 | 116 endif |
117 str = {str}; | |
118 elseif (! iscellstr (str)) | |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
119 error ("genvarname: STR must be a string or a cellstr"); |
7657 | 120 endif |
121 | |
122 validchars = cstrcat ("A":"Z", "a":"z", "0":"9", "_"); | |
123 | |
124 varname = cell (size (str)); | |
125 for i = 1:numel (str) | |
126 ## Perform any modifications to the varname to make sure that it is | |
127 ## a valid variable name. | |
128 | |
129 ## remove invalid characters | |
130 str{i}(! ismember (str{i}, validchars)) = "_"; | |
131 ## do not use keywords | |
132 if (iskeyword (str{i})) | |
133 str{i} = cstrcat ("_", str{i}); | |
134 endif | |
135 ## double underscores at the beginning and end are reserved variables | |
136 underscores = (str{i} == "_"); | |
137 if (any (underscores)) | |
138 firstnon = find (!underscores, 1); | |
139 lastnon = find (!underscores, 1, "last"); | |
140 str{i}([1:firstnon-2, lastnon+2:end]) = []; | |
141 endif | |
142 ## The variable cannot be empty | |
143 if (isempty (str{i})) | |
144 str{i} = "x"; | |
145 endif | |
146 ## it cannot start with a number | |
147 if (ismember (str{i}(1), "0":"9")) | |
148 str{i} = cstrcat ("_", str{i}); | |
149 endif | |
150 | |
151 ## make sure that the variable is unique relative to other variables | |
152 ## and the exclusions list | |
153 excluded = any (strcmp (str{i}, exclusions)); | |
154 if (excluded && ismember (str{i}(end), "0":"9")) | |
155 ## if it is not unique and ends with a digit, add an underscore to | |
156 ## make the variable name more readable ("x1_1" instead of "x11") | |
157 str{i}(end+1) = "_"; | |
158 endif | |
159 varname(i) = str(i); | |
160 idx = 0; | |
14552
86854d032a37
maint: miscellaneous style fixes for .m files
John W. Eaton <jwe@octave.org>
parents:
14363
diff
changeset
|
161 while (excluded) |
7657 | 162 idx++; |
14868
5d3a684236b0
maint: Use Octave coding conventions for cuddling parentheses in scripts directory
Rik <octave@nomad.inbox5.com>
parents:
14552
diff
changeset
|
163 varname{i} = sprintf ("%s%d", str{i}, idx); |
7657 | 164 excluded = any (strcmp (varname{i}, exclusions)); |
165 endwhile | |
166 exclusions(end+1) = varname(i); | |
167 endfor | |
168 | |
14552
86854d032a37
maint: miscellaneous style fixes for .m files
John W. Eaton <jwe@octave.org>
parents:
14363
diff
changeset
|
169 if (strinput) |
7657 | 170 varname = varname{1}; |
171 endif | |
172 | |
173 endfunction | |
174 | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
175 |
7657 | 176 ## a single argument |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
177 %!assert (genvarname ("a"), "a") |
7657 | 178 ## a single argument with a non-conflicting exception |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
179 %!assert (genvarname ("a", "b"), "a") |
7657 | 180 ## a single argument with a conflicting exception |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
181 %!assert (genvarname ("a", "a"), "a1") |
7657 | 182 ## a single argument as a cell |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
183 %!assert (genvarname ({"a"}), {"a"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
184 %!assert (genvarname ({"a"}, "b"), {"a"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
185 %!assert (genvarname ({"a"}, {"b"}), {"a"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
186 %!assert (genvarname ({"a"}, "a"), {"a1"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
187 %!assert (genvarname ({"a"}, {"a"}), {"a1"}) |
7657 | 188 ## Test different arguments |
189 ## orientation | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
190 %!assert (genvarname ({"a" "b"}), {"a" "b"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
191 %!assert (genvarname ({"a";"b"}), {"a";"b"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
192 %!assert (genvarname ({"a" "a"}), {"a" "a1"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
193 %!assert (genvarname ({"a" "b";"c" "d"}), {"a" "b";"c" "d"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
194 %!assert (genvarname ({"a" "a" "a";"a" "a" "a"}), {"a" "a2" "a4";"a1" "a3" "a5"}) |
7657 | 195 ## more than one repetition |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
196 %!assert (genvarname ({"a" "a" "a"}), {"a" "a1" "a2"}) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
197 %!assert (genvarname ({"a" "a" "a"}, {"a" "a1" "a2"}), {"a3" "a4" "a5"}) |
7657 | 198 ## more than one repetition not in order |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
199 %!assert (genvarname ({"a" "b" "a" "b" "a"}), {"a" "b" "a1" "b1" "a2"}) |
7657 | 200 ## Variable name munging |
201 %!assert (genvarname ("__x__"), "_x_") | |
202 %!assert (genvarname ("123456789"), "_123456789") | |
203 %!assert (genvarname ("_$1__"), "_1_") | |
204 %!assert (genvarname ("__foo__", "_foo_"), "_foo_1") | |
205 %!assert (genvarname ("1million_and1", "_1million_and1"), "_1million_and1_1") | |
206 %!assert (genvarname ({"", "", ""}), {"x", "x1", "x2"}) | |
207 %!assert (genvarname ("if"), "_if") | |
208 %!assert (genvarname ({"if", "if", "if"}), {"_if", "_if1", "_if2"}) | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
209 |