Mercurial > octave
view scripts/legacy/genvarname.m @ 28789:28de41192f3c
Eliminate unneeded verification of nargin, nargout in m-files.
* FIRfilter.m, FIRfilter_aggregation.m, get.m, polynomial.m,
polynomial_superiorto.m, polynomial2.m, makeUniqueStrings.m, base64decode.m,
base64encode.m, cd.m, lin2mu.m, record.m, sound.m, soundsc.m, accumarray.m,
accumdim.m, bitcmp.m, bitset.m, cart2pol.m, celldisp.m, circshift.m,
cplxpair.m, cumtrapz.m, flip.m, idivide.m, interpft.m, logspace.m, pol2cart.m,
polyarea.m, postpad.m, prepad.m, rat.m, rot90.m, rotdim.m, shift.m, shiftdim.m,
sortrows.m, trapz.m, dsearch.m, dsearchn.m, getappdata.m, getpixelposition.m,
guidata.m, guihandles.m, isappdata.m, listfonts.m, uigetdir.m,
waitforbuttonpress.m, __makeinfo__.m, doc.m, get_first_help_sentence.m,
autumn.m, bone.m, brighten.m, cmpermute.m, cmunique.m, colorcube.m, contrast.m,
cool.m, copper.m, cubehelix.m, flag.m, gray.m, gray2ind.m, hot.m, hsv.m,
im2double.m, im2frame.m, imformats.m, jet.m, lines.m, ocean.m, pink.m, prism.m,
rainbow.m, rgbplot.m, spinmap.m, spring.m, summer.m, viridis.m, white.m,
winter.m, beep.m, importdata.m, is_valid_file_id.m, javachk.m, javaclasspath.m,
findstr.m, genvarname.m, strmatch.m, bandwidth.m, commutation_matrix.m, cond.m,
cross.m, isdefinite.m, ishermitian.m, issymmetric.m, krylov.m, linsolve.m,
logm.m, lscov.m, null.m, ordeig.m, orth.m, rank.m, rref.m, vecnorm.m,
bunzip2.m, citation.m, computer.m, copyfile.m, dir.m, dos.m, fileattrib.m,
gunzip.m, inputParser.m, inputname.m, ismac.m, ispc.m, isunix.m, license.m,
list_primes.m, methods.m, mkdir.m, movefile.m, nargchk.m, news.m,
orderfields.m, recycle.m, tar.m, unix.m, unpack.m, untar.m, unzip.m, ver.m,
version.m, what.m, zip.m, decic.m, fminbnd.m, fminunc.m, fsolve.m, fzero.m,
glpk.m, humps.m, lsqnonneg.m, optimget.m, pqpnonneg.m, sqp.m, pathdef.m,
camlookat.m, hidden.m, specular.m, plotmatrix.m, smooth3.m, sombrero.m,
stemleaf.m, __gnuplot_drawnow__.m, __opengl_info__.m, ancestor.m, cla.m,
close.m, closereq.m, copyobj.m, gca.m, gcf.m, ginput.m, graphics_toolkit.m,
groot.m, hgload.m, hgsave.m, isgraphics.m, ishold.m, linkaxes.m, meshgrid.m,
newplot.m, refresh.m, refreshdata.m, rotate.m, saveas.m, struct2hdl.m, conv.m,
mkpp.m, mpoles.m, padecoef.m, pchip.m, polyder.m, polyfit.m, polygcd.m,
polyint.m, polyout.m, polyval.m, ppder.m, ppint.m, getpref.m, ispref.m,
rmpref.m, profexport.m, profshow.m, powerset.m, arch_fit.m, arma_rnd.m,
blackman.m, detrend.m, diffpara.m, fftconv.m, fftfilt.m, filter2.m, freqz.m,
freqz_plot.m, hamming.m, hanning.m, sinetone.m, sinewave.m, spectral_adf.m,
spectral_xdf.m, stft.m, unwrap.m, gplot.m, ichol.m, ilu.m, spdiags.m, sprand.m,
sprandn.m, spstats.m, svds.m, treelayout.m, treeplot.m, betainc.m,
betaincinv.m, ellipke.m, gammainc.m, gammaincinv.m, legendre.m, pow2.m,
hankel.m, pascal.m, rosser.m, toeplitz.m, bounds.m, corr.m, cov.m, histc.m,
kendall.m, kurtosis.m, mad.m, mode.m, moment.m, prctile.m, quantile.m, range.m,
ranks.m, run_count.m, skewness.m, spearman.m, std.m, var.m, zscore.m,
dec2base.m, dec2bin.m, dec2hex.m, index.m, mat2str.m, native2unicode.m,
ostrsplit.m, strjoin.m, strjust.m, strtok.m, substr.m, unicode2native.m,
untabify.m, __debug_octave__.m, demo.m, example.m, fail.m, oruntests.m,
dump_demos.m, speed.m, test.m, date.m, datenum.m, datestr.m, datevec.m,
is_leap_year.m, now.m, weekday.m:
Eliminate unneeded verification of nargin, nargout in m-files now that
the interpreter checks these values.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 24 Sep 2020 14:44:58 -0700 |
parents | ef8cf8dda0ba |
children | d8318c12d903 |
line wrap: on
line source
######################################################################## ## ## Copyright (C) 2008-2020 The Octave Project Developers ## ## See the file COPYRIGHT.md in the top-level directory of this ## distribution or <https://octave.org/copyright/>. ## ## This file is part of Octave. ## ## Octave is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## Octave is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, see ## <https://www.gnu.org/licenses/>. ## ######################################################################## ## -*- texinfo -*- ## @deftypefn {} {@var{varname} =} genvarname (@var{str}) ## @deftypefnx {} {@var{varname} =} genvarname (@var{str}, @var{exclusions}) ## ## This function is obsolete. Use @code{matlab.lang.makeValidName} or ## @code{matlab.lang.makeUniqueStrings} instead. ## ## Create valid unique variable name(s) from @var{str}. ## ## If @var{str} is a cellstr, then a unique variable is created for each cell ## in @var{str}. ## ## @example ## @group ## genvarname (@{"foo", "foo"@}) ## @result{} ## @{ ## [1,1] = foo ## [1,2] = foo1 ## @} ## @end group ## @end example ## ## If @var{exclusions} is given, then the variable(s) will be unique to each ## other and to @var{exclusions} (@var{exclusions} may be either a string or a ## cellstr). ## ## @example ## @group ## x = 3.141; ## genvarname ("x", who ()) ## @result{} x1 ## @end group ## @end example ## ## Note that the result is a char array or cell array of strings, not the ## variables themselves. To define a variable, @code{eval()} can be used. ## The following trivial example sets @code{x} to 42. ## ## @example ## @group ## name = genvarname ("x"); ## eval ([name " = 42"]); ## @result{} x = 42 ## @end group ## @end example ## ## This can be useful for creating unique struct field names. ## ## @example ## @group ## x = struct (); ## for i = 1:3 ## x.(genvarname ("a", fieldnames (x))) = i; ## endfor ## @result{} x = ## @{ ## a = 1 ## a1 = 2 ## a2 = 3 ## @} ## @end group ## @end example ## ## Since variable names may only contain letters, digits, and underscores, ## @code{genvarname} will replace any sequence of disallowed characters with ## an underscore. Also, variables may not begin with a digit; in this case ## an @samp{x} is added before the variable name. ## ## Variable names beginning and ending with two underscores @qcode{"__"} are ## valid, but they are used internally by Octave and should generally be ## avoided; therefore, @code{genvarname} will not generate such names. ## ## @code{genvarname} will also ensure that returned names do not clash with ## keywords such as @qcode{"for"} and @qcode{"if"}. A number will be ## appended if necessary. Note, however, that this does @strong{not} include ## function names such as @qcode{"sin"}. Such names should be included in ## @var{exclusions} if necessary. ## @seealso{matlab.lang.makeValidName, matlab.lang.makeUniqueStrings, ## namelengthmax, isvarname, iskeyword, exist, who, tempname, eval} ## @end deftypefn function varname = genvarname (str, exclusions = {}) persistent warned = false; if (! warned) warned = true; warning ("Octave:legacy-function", "genvarname is obsolete; use matlab.lang.makeValidName or matlab.lang.makeUniqueStrings instead\n"); endif if (nargin < 1) print_usage (); endif strinput = ischar (str); ## Process the inputs if (strinput) if (rows (str) != 1) error ("genvarname: if more than one STR is given, it must be a cellstr"); endif str = {str}; elseif (! iscellstr (str)) error ("genvarname: STR must be a string or cellstr"); endif if (ischar (exclusions)) if (rows (exclusions) != 1) error ("genvarname: if more than one exclusion is given, it must be a cellstr"); endif exclusions = {exclusions}; elseif (! iscellstr (exclusions)) error ("genvarname: EXCLUSIONS must be a string or cellstr"); else exclusions = exclusions(:); endif varname = cell (size (str)); for i = 1:numel (str) ## Perform any modifications to the varname to make sure that it is ## a valid variable name. ## remove invalid characters str{i}(! (isalnum (str{i}) | str{i} == "_")) = "_"; ## do not use keywords if (iskeyword (str{i})) firstcharacter = toupper (str{i}(1)); str{i} = ["x", firstcharacter, str{i}(2:end)]; endif ## The variable cannot be empty if (isempty (str{i})) str{i} = "x"; endif ## Leading underscores are not Matlab compatible if (str{i}(1) == "_") str{i} = ["x", str{i}]; endif ## it cannot start with a number if (isdigit (str{i}(1))) str{i} = ["x", str{i}]; endif ## make sure that the variable is unique relative to other variables ## and the exclusions list excluded = any (strcmp (str{i}, exclusions)); if (excluded && isdigit (str{i}(end))) ## if it is not unique and ends with a digit, add an underscore to ## make the variable name more readable ("x1_1" instead of "x11") str{i} = [str{i}, "_"]; endif varname(i) = str(i); idx = 0; while (excluded) idx += 1; varname{i} = sprintf ("%s%d", str{i}, idx); excluded = any (strcmp (varname{i}, exclusions)); endwhile exclusions(end+1) = varname(i); endfor if (strinput) varname = varname{1}; endif endfunction ## a single argument %!assert (genvarname ("a"), "a") ## a single argument with a non-conflicting exception %!assert (genvarname ("a", "b"), "a") ## a single argument with a conflicting exception %!assert (genvarname ("a", "a"), "a1") ## a single argument as a cell %!assert (genvarname ({"a"}), {"a"}) %!assert (genvarname ({"a"}, "b"), {"a"}) %!assert (genvarname ({"a"}, {"b"}), {"a"}) %!assert (genvarname ({"a"}, "a"), {"a1"}) %!assert (genvarname ({"a"}, {"a"}), {"a1"}) ## Test different arguments ## orientation %!assert (genvarname ({"a" "b"}), {"a" "b"}) %!assert (genvarname ({"a";"b"}), {"a";"b"}) %!assert (genvarname ({"a" "a"}), {"a" "a1"}) %!assert (genvarname ({"a" "b";"c" "d"}), {"a" "b";"c" "d"}) %!assert (genvarname ({"a" "a" "a";"a" "a" "a"}), {"a" "a2" "a4";"a1" "a3" "a5"}) ## more than one repetition %!assert (genvarname ({"a" "a" "a"}), {"a" "a1" "a2"}) %!assert (genvarname ({"a" "a" "a"}, {"a" "a1" "a2"}), {"a3" "a4" "a5"}) ## more than one repetition not in order %!assert (genvarname ({"a" "b" "a" "b" "a"}), {"a" "b" "a1" "b1" "a2"}) ## Variable name munging %!assert (genvarname ("__x__"), "x__x__") %!assert (genvarname ("123456789"), "x123456789") %!assert (genvarname ("_$1__"), "x__1__") %!assert (genvarname ("__foo__", "x__foo__"), "x__foo__1") %!assert (genvarname ("1million_and1", "x1million_and1"), "x1million_and1_1") %!assert (genvarname ({"", "", ""}), {"x", "x1", "x2"}) %!assert (genvarname ("if"), "xIf") %!assert (genvarname ({"if", "if", "if"}), {"xIf", "xIf1", "xIf2"}) ## Exclusions in odd format %!assert (genvarname ("x", {"a", "b"; "x", "d"}), "x1") ## Test input validation %!error genvarname () %!error genvarname (1,2,3) %!error <more than one STR is given, it must be a cellstr> genvarname (char ("a", "b", "c")) %!error <STR must be a string or cellstr> genvarname (1) %!error <more than one exclusion is given, it must be a cellstr> genvarname ("x", char ("a", "b", "c")) %!error <EXCLUSIONS must be a string or cellstr> genvarname ("x", 1)