]> Creatis software - CreaPhase.git/blobdiff - octave_packages/m/miscellaneous/private/__xzip__.m
update packages
[CreaPhase.git] / octave_packages / m / miscellaneous / private / __xzip__.m
diff --git a/octave_packages/m/miscellaneous/private/__xzip__.m b/octave_packages/m/miscellaneous/private/__xzip__.m
new file mode 100644 (file)
index 0000000..c2e1fc6
--- /dev/null
@@ -0,0 +1,138 @@
+## Copyright (C) 2008-2012 Thorsten Meyer
+## based on the original gzip function by David Bateman
+##
+## 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 {Function File} {@var{entries} =} __xzip__ (@var{commandname}, @var{extension}, @var{commandtemplate}, @var{files}, @var{outdir})
+## Undocumented internal function.
+## @end deftypefn
+
+## Compress the list of files and/or directories specified in @var{files}
+## with the external compression command @var{commandname}. The template
+## @var{commandtemplate} is used to actually start the command. Each file
+## is compressed separately and a new file with the extension @var{extension}
+## is created and placed into the directory @var{outdir}. The original files
+## are not touched. Existing compressed files are silently overwritten.
+## This is an internal function. Do not use directly.
+
+function entries = __xzip__ (commandname, extension,
+                             commandtemplate, files, outdir)
+
+  if (nargin != 4 && nargin != 5)
+    print_usage ();
+  endif
+
+  if (! ischar (extension) || length (extension) == 0)
+    error ("__xzip__: EXTENSION must be a string with finite length");
+  endif
+
+  if (nargin == 5 && ! exist (outdir, "dir"))
+    error ("__xzip__: OUTDIR output directory does not exist");
+  endif
+
+  if (ischar (files))
+    files = cellstr (files);
+  endif
+  if (! iscellstr (files))
+    error ("__xzip__: FILES must be a character array or cellstr");
+  endif
+
+  if (nargin == 4)
+    outdir = tmpnam ();
+    mkdir (outdir);
+  endif
+
+  cwd = pwd ();
+  unwind_protect
+    files = glob (files);
+
+    ## Ignore any file with the compress extension
+    files(cellfun (@(x) length(x) > length(extension)
+      && strcmp (x((end - length(extension) + 1):end), extension),
+      files)) = [];
+
+    copyfile (files, outdir);
+
+    [d, f] = myfileparts(files);
+
+    cd (outdir);
+
+    cmd = sprintf (commandtemplate, sprintf (" %s", f{:}));
+
+    [status, output] = system (cmd);
+    if (status)
+      error ("__xzip__: %s command failed with exit status = %d",
+             commandname, status);
+    endif
+
+    if (nargin == 5)
+      if (nargout > 0)
+        entries = cellfun(
+            @(x) fullfile (outdir, sprintf ("%s.%s", x, extension)),
+            f, "uniformoutput", false);
+      endif
+    else
+      movefile (cellfun(@(x) sprintf ("%s.%s", x, extension), f,
+                        "uniformoutput", false), cwd);
+      if (nargout > 0)
+        ## FIXME this does not work when you try to compress directories
+        entries  = cellfun(@(x) sprintf ("%s.%s", x, extension),
+                           files, "uniformoutput", false);
+      endif
+    endif
+
+  unwind_protect_cleanup
+    cd (cwd);
+    if (nargin == 4)
+      confirm_recursive_rmdir (false, "local");
+      rmdir (outdir, "s");
+    endif
+  end_unwind_protect
+
+endfunction
+
+function [d, f] = myfileparts (files)
+  [d, f, ext] = cellfun ("fileparts", files, "uniformoutput", false);
+  f = cellfun (@(x, y) sprintf ("%s%s", x, y), f, ext,
+               "uniformoutput", false);
+  idx = cellfun ("isdir", files);
+  d(idx) = "";
+  f(idx) = files(idx);
+endfunction
+
+## FIXME -- reinstate these tests if we invent a way to test private
+## functions directly.
+##
+## %!error <extension has to be a string with finite length>
+## %!  __xzip__("gzip", "", "gzip -r %s", "bla");
+## %!error <no files to move>
+## %!  __xzip__("gzip", ".gz", "gzip -r %s", tmpnam);
+## %!error <command failed with exit status>
+## %!  # test __xzip__ with invalid compression command
+## %!  unwind_protect
+## %!    filename = tmpnam;
+## %!    dummy    = 1;
+## %!    save(filename, "dummy");
+## %!    dirname  = tmpnam;
+## %!    mkdir(dirname);
+## %!    entry = __xzip__("gzip", ".gz", "xxxzipxxx -r %s 2>/dev/null",
+## %!                     filename, dirname);
+## %!  unwind_protect_cleanup
+## %!    delete(filename);
+## %!    rmdir(dirname);
+## %!  end_unwind_protect