annotate scripts/+matlab/+lang/makeValidName.m @ 26376:00f796120a6d stable

maint: Update copyright dates in all source files.
author John W. Eaton <jwe@octave.org>
date Wed, 02 Jan 2019 16:32:43 -0500
parents 368dc1142072
children b442ec6dda5c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26376
00f796120a6d maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents: 26202
diff changeset
1 ## Copyright (C) 2017-2019 Guillaume Flandin
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
2 ##
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
3 ## This file is part of Octave.
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
4 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
5 ## Octave is free software: you can redistribute it and/or modify it
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
7 ## the Free Software Foundation, either version 3 of the License, or
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
8 ## (at your option) any later version.
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
9 ##
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
13 ## GNU General Public License for more details.
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
14 ##
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
17 ## <https://www.gnu.org/licenses/>.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
18
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
19 ## -*- texinfo -*-
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
20 ## @deftypefn {} {@var{varname} =} matlab.lang.makeValidName (@var{str})
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
21 ## @deftypefnx {} {@var{varname} =} matlab.lang.makeValidName (@dots{}, @qcode{"ReplacementStyle"}, @var{rs})
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
22 ## @deftypefnx {} {@var{varname} =} matlab.lang.makeValidName (@dots{}, @qcode{"Prefix"}, @var{pfx})
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
23 ## @deftypefnx {} {[@var{varname}, @var{ismodified}] =} matlab.lang.makeValidName (@dots{})
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
24 ##
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
25 ## Create valid variable name @var{varname} from @var{str}.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
26 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
27 ## The input @var{str} must be a string or a cell array of strings.
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
28 ## The output @var{varname} will be of the same type.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
29 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
30 ## A valid variable name is a sequence of letters, digits, and underscores that
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
31 ## does not begin with a digit.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
32 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
33 ## The @qcode{"ReplacementStyle"} option specifies how invalid characters
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
34 ## are handled. Acceptable values are
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
35 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
36 ## @table @asis
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
37 ## @item @qcode{"underscore"} (default)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
38 ## Replace all invalid characters with an underscore (@qcode{"_"}).
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
39 ##
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
40 ## @item @qcode{"delete"}
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
41 ## Remove any invalid character.
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
42 ##
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
43 ## @item @qcode{"hex"}
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
44 ## Replace all invalid characters with their hexadecimal representation.
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
45 ## @end table
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
46 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
47 ## Whitespace characters are always removed @strong{prior} to the application
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
48 ## of the @qcode{"ReplacementStyle"}. Lowercase letters following a whitespace
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
49 ## will be changed to uppercase.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
50 ##
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
51 ## The @qcode{"Prefix"} option specifies the string @var{pfx} to add as a
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
52 ## prefix to the input if it begins with a digit. @var{pfx} must be a valid
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
53 ## variable name itself. The default prefix is @qcode{"x"}.
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
54 ##
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
55 ## The optional output @var{ismodified} is a logical array indicating whether
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
56 ## the respective element in @var{str} was a valid name or not.
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
57 ##
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
58 ## @seealso{iskeyword, isvarname, matlab.lang.makeUniqueStrings}
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
59 ## @end deftypefn
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
60
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
61 function [varname, ismodified] = makeValidName (str, varargin)
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
62
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
63 if (nargin == 0 || nargout > 2)
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
64 print_usage ();
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
65 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
66
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
67 if (! ischar (str) && ! iscellstr (str))
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
68 error ("makeValidName: STR must be a string or cellstr");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
69 endif
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
70
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
71 if (mod (nargin - 1, 2) != 0)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
72 error ("makeValidName: property/value options must occur in pairs");
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
73 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
74
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
75 varname = cellstr (str);
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
76 ismodified = false (size (varname));
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
77 convert2char = ischar (str);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
78 opts = struct ("replacementstyle", "underscore", "prefix", "x");
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
79
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
80 for i = 1:2:numel (varargin)
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
81 if (! ischar (varargin{i}))
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
82 error ("makeValidName: option argument must be a string");
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
83 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
84 parameter = tolower (varargin{i});
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
85 value = varargin{i+1};
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
86 switch (parameter)
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
87 case "replacementstyle"
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
88 if (! ischar (value))
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
89 error ('makeValidName: "ReplacementStyle" value must be a string');
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
90 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
91 value = tolower (value);
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
92 if (! any (strcmp (value, {"underscore", "delete", "hex"})))
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
93 error ('makeValidName: invalid "ReplacementStyle" value "%s"', value);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
94 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
95 opts.replacementstyle = value;
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
96
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
97 case "prefix"
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
98 if (! isvarname (value))
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
99 error ('makeValidName: invalid "Prefix" value "%s"', value);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
100 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
101 opts.prefix = value;
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
102
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
103 otherwise
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
104 error ('makeValidName: unknown property "%s"', parameter);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
105 endswitch
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
106 endfor
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
107
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
108 for i = 1:numel (varname)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
109 if (! isvarname (varname{i}))
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
110 ismodified(i) = true;
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
111
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
112 ## Remove leading and trailing whitespace
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
113 varname{i} = strtrim (varname{i});
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
114 if (isempty (varname{i}))
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
115 varname{i} = opts.prefix;
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
116 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
117
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
118 ## Add prefix if input is a reserved keyword
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
119 if (iskeyword (varname{i}))
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
120 varname{i} = [opts.prefix, toupper(varname{i}(1)), varname{i}(2:end)];
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
121 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
122
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
123 ## Change whitespace followed by lowercase letter to uppercase
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
124 idx = regexp (varname{i}, '\s[a-z]');
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
125 varname{i}(idx+1) = toupper (varname{i}(idx+1));
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
126
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
127 ## Remove any whitespace character
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
128 varname{i}(isspace (varname{i})) = "";
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
129
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
130 ## Add prefix if first character is not a letter or underscore
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
131 char1 = varname{i}(1);
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
132 if (! isalpha (char1) && char1 != "_")
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
133 varname{i} = [opts.prefix varname{i}];
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
134 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
135
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
136 ## Replace non alphanumerics or underscores
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
137 idx = regexp (varname{i}, '[^0-9a-zA-Z_]');
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
138 switch (opts.replacementstyle)
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
139 case "underscore"
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
140 varname{i}(idx) = "_";
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
141
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
142 case "delete"
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
143 varname{i}(idx) = "";
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
144
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
145 case "hex"
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
146 for j = numel (idx):-1:1
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
147 varname{i} = strrep (varname{i}, varname{i}(idx(j)),
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
148 sprintf ("0x%02X",varname{i}(idx(j))));
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
149 endfor
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
150 endswitch
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
151 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
152 endfor
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
153
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
154 if (convert2char)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
155 varname = char (varname);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
156 endif
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
157
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
158 endfunction
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
159
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
160
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
161 ## Test char vector input
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
162 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
163 %! varname = matlab.lang.makeValidName ("octave");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
164 %! assert (varname, "octave");
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
165
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
166 ## Test cellstr input
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
167 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
168 %! varname = matlab.lang.makeValidName ({"gnu", "octave"});
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
169 %! assert (varname, {"gnu", "octave"});
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
170
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
171 ## Test default flags
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
172 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
173 %! str = {"Octave", "3d plot", "GNU/Octave", "laplace_*"};
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
174 %! varname = matlab.lang.makeValidName (str);
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
175 %! assert (varname, {"Octave", "x3dPlot", "GNU_Octave", "laplace__"});
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
176
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
177 ## Test ReplacementStyle flag
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
178 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
179 %! str = {"Octave", "3d plot", "GNU/Octave", "laplace_*"};
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
180 %! varname = matlab.lang.makeValidName (str, "ReplacementStyle", "underscore");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
181 %! assert (varname, {"Octave", "x3dPlot", "GNU_Octave", "laplace__"});
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
182 %! varname = matlab.lang.makeValidName (str, "ReplacementStyle", "hex");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
183 %! assert (varname, {"Octave", "x3dPlot", "GNU0x2FOctave", "laplace_0x2A"});
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
184 %! varname = matlab.lang.makeValidName (str, "ReplacementStyle", "delete");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
185 %! assert (varname, {"Octave", "x3dPlot", "GNUOctave", "laplace_"});
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
186
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
187 ## Test Prefix flag
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
188 %!test
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
189 %! assert (matlab.lang.makeValidName ({"", " "}), {"x", "x"});
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
190 %! str = {"Octave", "3d plot", "GNU/Octave", "laplace_*"};
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
191 %! varname = matlab.lang.makeValidName (str, "prefix", "oct_");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
192 %! assert (varname, {"Octave", "oct_3dPlot", "GNU_Octave", "laplace__"});
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
193
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
194 ## Test second output
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
195 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
196 %! str = {"Octave", "3d plot", "GNU/Octave", "laplace_*"};
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
197 %! [varname, modified] = matlab.lang.makeValidName (str);
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
198 %! assert (modified, [false, true, true, true]);
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
199
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
200 ## Test whitespace followed by a lowercase letter
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
201 %!test
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
202 %! varname = matlab.lang.makeValidName ("gnu octave");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
203 %! assert (varname, "gnuOctave");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
204 %! varname = matlab.lang.makeValidName (" octave ");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
205 %! assert (varname, "octave");
26201
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
206
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
207 ## Check for keywords
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
208 %!test
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
209 %! assert (matlab.lang.makeValidName ("for"), "xFor")
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
210 %! assert (matlab.lang.makeValidName ("For"), "For")
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
211 %!error matlab.lang.makeValidName ("for", "Prefix", "for")
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
212
750a6f9957ea New functions makeUniqueStrings and makeValidName (bug #52596).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
213 ## Test input validation
26202
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
214 %!error matlab.lang.makeValidName ()
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
215 %!error <STR must be a string or cellstr> matlab.lang.makeValidName (42)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
216 %!error <options must occur in pairs> matlab.lang.makeValidName ("a", "opt1")
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
217 %!error <option argument must be a string>
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
218 %! matlab.lang.makeValidName ("a", 1, 2)
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
219 %!error <"ReplacementStyle" value must be a string>
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
220 %! matlab.lang.makeValidName ("a", "ReplacementStyle", 1);
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
221 %!error <invalid "ReplacementStyle" value "foobar">
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
222 %! matlab.lang.makeValidName ("a", "ReplacementStyle", "foobar");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
223 %!error <invalid "Prefix" value "1_">
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
224 %! matlab.lang.makeValidName ("a", "Prefix", "1_");
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
225 %!error <unknown property "foobar">
368dc1142072 makeValidName.m, makeUniqueStrings.m: Clean up functions to use Octave conventions.
Rik <rik@octave.org>
parents: 26201
diff changeset
226 %! matlab.lang.makeValidName ("a", "foobar", 1);