Mercurial > octave
view scripts/miscellaneous/fullfile.m @ 21580:ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
* splineimages.m, Cell.cc, bsxfun.cc, cellfun.cc, conv2.cc, data.cc,
debug.cc, file-io.cc, gcd.cc, getrusage.cc, graphics.cc, kron.cc, mappers.cc,
oct-map.cc, ordschur.cc, psi.cc, rand.cc, variables.cc, __osmesa_print__.cc,
amd.cc, audiodevinfo.cc, dmperm.cc, qr.cc, ov-bool-mat.cc, ov-class.cc,
ov-fcn-handle.cc, ov-java.cc, oct-parse.in.yy, bicubic.m, delaunay3.m,
accumarray.m, flip.m, fliplr.m, flipud.m, gradient.m, inputParser.m, interp1.m,
narginchk.m, rot90.m, validateattributes.m, delaunay.m, delaunayn.m,
griddata3.m, inpolygon.m, waitbar.m, gray2ind.m, hsv2rgb.m, im2double.m,
image.m, imformats.m, imread.m, imshow.m, imwrite.m, ntsc2rgb.m, rgb2hsv.m,
rgb2ntsc.m, isbanded.m, onenormest.m, edit.m, fullfile.m, license.m, ode23.m,
ode45.m, glpk.m, annotation.m, legend.m, orient.m, text.m, area.m, barh.m,
contour.m, line.m, plot.m, plot3.m, plotyy.m, quiver.m, stem.m, clf.m,
copyobj.m, findobj.m, subplot.m, ppval.m, splinefit.m, ismember.m, freqz.m,
unwrap.m, eigs.m, ichol.m, pcg.m, spdiags.m, svds.m, magic.m, lscov.m,
median.m, ols.m, dec2base.m, strsplit.m, strtok.m, test.m, bug-31371.tst,
bug-36025.tst, bug-44940.tst, build-sparse-tests.sh, class-concat.tst,
classdef.tst, classes.tst, colormaps.tst, command.tst, ctor-vs-method.tst,
error.tst, fcn-handle-derived-resolution.tst, for.tst, index.tst, io.tst,
jit.tst, null-assign.tst, parser.tst, struct.tst, system.tst:
Add semicolons to terminate code in %! blocks.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 01 Apr 2016 16:03:29 -0700 |
parents | 516bb87ea72e |
children | bac0d6f07a3e |
line wrap: on
line source
## Copyright (C) 2014-2015 Carnë Draug ## ## 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 ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- ## @deftypefn {} {@var{filename} =} fullfile (@var{dir1}, @var{dir2}, @dots{}, @var{file}) ## @deftypefnx {} {@var{filenames} =} fullfile (@dots{}, @var{files}) ## Build complete filename from separate parts. ## ## Joins any number of path components intelligently. The return value is ## the concatenation of each component with exactly one file separator ## between each non empty part and at most one leading and/or trailing file ## separator. ## ## If the last component part is a cell array, returns a cell array of ## filepaths, one for each element in the last component, e.g.: ## ## @example ## @group ## fullfile ("/home/username", "data", @{"f1.csv", "f2.csv", "f3.csv"@}) ## @result{} /home/username/data/f1.csv ## /home/username/data/f2.csv ## /home/username/data/f3.csv ## @end group ## @end example ## ## On Windows systems, while forward slash file separators do work, they are ## replaced by backslashes; in addition drive letters are stripped of leading ## file separators to obtain a valid file path. ## ## Note: @code{fullfile} does not perform any validation of the resulting full ## filename. ## @seealso{fileparts, filesep} ## @end deftypefn ## Author: Carnë Draug <carandraug@octave.org> function filename = fullfile (varargin) if (nargin && iscell (varargin{end})) filename = cellfun (@(x) fullfile (varargin{1:end-1}, x), varargin{end}, "UniformOutput", false); else non_empty = cellfun ("isempty", varargin); unc = 0; if (ispc && ! isempty (varargin)) varargin = strrep (varargin, '/', filesep); unc = strncmp (varargin{1}, '\\', 2); varargin(1) = regexprep (varargin{1}, '[\\/]*([a-zA-Z]:[\\/]*)', "$1"); endif filename = strjoin (varargin(! non_empty), filesep); filename(unc + strfind (filename(1+unc : end), [filesep filesep])) = ""; endif endfunction %!shared fs, fsx, xfs, fsxfs, xfsy, xfsyfs %! fs = filesep (); %! fsx = [fs "x"]; %! xfs = ["x" fs]; %! fsxfs = [fs "x" fs]; %! xfsy = ["x" fs "y"]; %! xfsyfs = ["x" fs "y" fs]; %!assert (fullfile (""), "") %!assert (fullfile (fs), fs) %!assert (fullfile ("", fs), fs) %!assert (fullfile (fs, ""), fs) %!assert (fullfile ("", fs), fs) %!assert (fullfile ("x"), "x") %!assert (fullfile ("", "x"), "x") %!assert (fullfile ("x", ""), "x") %!assert (fullfile ("", "x", ""), "x") %!assert (fullfile ("x", "y"), xfsy) %!assert (fullfile ("x", "", "y"), xfsy) %!assert (fullfile ("x", "", "y", ""), xfsy) %!assert (fullfile ("", "x", "", "y", ""), xfsy) %!assert (fullfile (fs), fs) %!assert (fullfile (fs, "x"), fsx) %!assert (fullfile (fs, xfs), fsxfs) %!assert (fullfile (fsx, fs), fsxfs) %!assert (fullfile (fs, "x", fs), fsxfs) %!assert (fullfile ("x/", "/", "/", "y", "/", "/"), xfsyfs) %!assert (fullfile ("/", "x/", "/", "/", "y", "/", "/"), [fs xfsyfs]) %!assert (fullfile ("/x/", "/", "/", "y", "/", "/"), [fs xfsyfs]) ## different on purpose so that "fullfile (c{:})" works for empty c %!assert (fullfile (), "") %!assert (fullfile ("x", "y", {"c", "d"}), {[xfsyfs "c"], [xfsyfs "d"]}) ## Windows specific - drive letters and file sep type %!test %! if (ispc) %! assert (fullfile ('\/\/\//A:/\/\', "x/", "/", "/", "y", "/", "/"), ... %! ['A:\' xfsyfs]); %! endif ## *nix specific - double backslash %!test %! if (isunix || ismac) %! assert (fullfile (fs, fs), fs); %! endif ## Windows specific - drive letters and file sep type, cell array %!test %! if (ispc) %! tmp = fullfile ({"\\\/B:\//", "A://c", "\\\C:/g/h/i/j\/"}); %! assert (tmp{1}, 'B:\'); %! assert (tmp{2}, 'A:\c'); %! assert (tmp{3}, 'C:\g\h\i\j\'); %! endif