changeset 17394:b6867a09d7cf

Return correct status code for copyfile, movefile. * scripts/miscellaneous/copyfile.m, scripts/miscellaneous/movefile.m: Return correct status (inversion of system function). Put input validation first. Use single quotes to simplify expressions. Redo docstrings.
author Rik <rik@octave.org>
date Sun, 08 Sep 2013 21:11:45 -0700
parents 6437a6815bc6
children ed149e891876
files scripts/miscellaneous/copyfile.m scripts/miscellaneous/movefile.m
diffstat 2 files changed, 150 insertions(+), 138 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/miscellaneous/copyfile.m	Sun Sep 08 21:08:37 2013 -0700
+++ b/scripts/miscellaneous/copyfile.m	Sun Sep 08 21:11:45 2013 -0700
@@ -19,27 +19,33 @@
 ## -*- texinfo -*-
 ## @deftypefn  {Function File} {[@var{status}, @var{msg}, @var{msgid}] =} copyfile (@var{f1}, @var{f2})
 ## @deftypefnx {Function File} {[@var{status}, @var{msg}, @var{msgid}] =} copyfile (@var{f1}, @var{f2}, 'f')
-## Copy the file @var{f1} to the new name @var{f2}.  The name @var{f1}
-## may contain globbing patterns.  If @var{f1} expands to multiple file
-## names, @var{f2} must be a directory.  If the force flag @qcode{'f'} is
-## given then existing destination files will be overwritten without
-## prompting.
+## Copy the file @var{f1} to the destination @var{f2}.
+##
+## The name @var{f1} may contain globbing patterns.  If @var{f1} expands to
+## multiple file names, @var{f2} must be a directory.
+## when the force flag @qcode{'f'} is given any existing files will be
+## overwritten without prompting.
 ##
-## If successful, @var{status} is 1, with @var{msg} and @var{msgid} empty
-## character strings.  Otherwise, @var{status} is 0, @var{msg} contains a
-## system-dependent error message, and @var{msgid} contains a unique
-## message identifier.
-## @seealso{movefile}
+## If successful, @var{status} is 1, and @var{msg}, @var{msgid} are empty
+## character strings ("").  Otherwise, @var{status} is 0, @var{msg} contains a
+## system-dependent error message, and @var{msgid} contains a unique message
+## identifier.  Note that the status code is exacly opposite that of the
+## @code{system} command.
+## @seealso{movefile, glob}
 ## @end deftypefn
 
 function [status, msg, msgid] = copyfile (f1, f2, force)
 
+  if (nargin < 2 || nargin > 3)
+    print_usage ();
+  endif
+
   max_cmd_line = 1024;
   status = true;
   msg = "";
   msgid = "";
 
-  ## FIXME -- maybe use the same method as in ls to allow users control
+  ## FIXME: maybe use the same method as in ls to allow users control
   ## over the command that is executed.
 
   if (ispc () && ! isunix ()
@@ -52,80 +58,76 @@
     cmd_force_flag = "-f";
   endif
 
-  if (nargin == 2 || nargin == 3)
-    ## Input type check.
-    if (! (ischar (f1) || iscellstr (f1)))
-      error ("copyfile: first argument must be a character string or a cell array of character strings");
-    endif
+  ## Input type check.
+  if (! (ischar (f1) || iscellstr (f1)))
+    error ("copyfile: F1 must be a character string or a cell array of character strings");
+  endif
 
-    if (! ischar (f2))
-      error ("copyfile: second argument must be a character string");
-    endif
+  if (! ischar (f2))
+    error ("copyfile: F2 must be a character string");
+  endif
 
-    if (nargin == 3 && strcmp (force, "f"))
-      cmd = [cmd " " cmd_force_flag];
-    endif
+  if (nargin == 3 && strcmp (force, "f"))
+    cmd = [cmd " " cmd_force_flag];
+  endif
 
-    ## If f1 isn't a cellstr convert it to one.
-    if (ischar (f1))
-      f1 = cellstr (f1);
-    endif
-
-    ## If f1 has more than 1 element f2 must be a directory
-    isdir = (exist (f2, "dir") != 0);
-    if (length (f1) > 1 && ! isdir)
-      error ("copyfile: when copying multiple files, second argument must be a directory");
-    endif
+  ## If f1 isn't a cellstr convert it to one.
+  if (ischar (f1))
+    f1 = cellstr (f1);
+  endif
 
-    ## Protect the file name(s).
-    f1 = glob (f1);
-    if (isempty (f1))
-      error ("copyfile: no files to move");
-    endif
-    p1 = sprintf ("\"%s\" ", f1{:});
-    p2 = tilde_expand (f2);
+  ## If f1 has more than 1 element f2 must be a directory
+  isdir = (exist (f2, "dir") != 0);
+  if (length (f1) > 1 && ! isdir)
+    error ("copyfile: when copying multiple files, F2 must be a directory");
+  endif
 
-    if (isdir && length (p1) > max_cmd_line)
-      l2 = length (p2) + length (cmd) + 6;
-      while (! isempty (f1))
-        p1 = sprintf ("\"%s\" ", f1{1});
+  ## Protect the file name(s).
+  f1 = glob (f1);
+  if (isempty (f1))
+    error ("copyfile: no files to move");
+  endif
+  p1 = sprintf ('"%s" ', f1{:});
+  p2 = tilde_expand (f2);
+
+  if (isdir && length (p1) > max_cmd_line)
+    l2 = length (p2) + length (cmd) + 6;
+    while (! isempty (f1))
+      p1 = sprintf ('"%s" ', f1{1});
+      f1(1) = [];
+      while (! isempty (f1)
+             && (length (p1) + length (f1{1}) + l2 < max_cmd_line))
+        p1 = sprintf ('%s"%s" ', p1, f1{1});
         f1(1) = [];
-        while (!isempty (f1) && (length (p1) + length (f1{1}) + l2 <
-                                 max_cmd_line))
-          p1 = sprintf ("%s\"%s\" ", p1, f1{1});
-          f1(1) = [];
-        endwhile
+      endwhile
 
-        if (ispc () && ! isunix ()
-            && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
-          p1 = strrep (p1, "\\", "/");
-          p2 = strrep (p2, "\\", "/");
-        endif
-
-        ## Copy the files.
-        [err, msg] = system (sprintf ("%s %s\"%s\"", cmd, p1, p2));
-        if (err < 0)
-          status = false;
-          msgid = "copyfile";
-          break;
-        endif
-      endwhile
-    else
       if (ispc () && ! isunix ()
           && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
-        p1 = strrep (p1, "\\", "/");
-        p2 = strrep (p2, "\\", "/");
+        p1 = strrep (p1, '\', '/');
+        p2 = strrep (p2, '\', '/');
       endif
 
       ## Copy the files.
-      [err, msg] = system (sprintf ("%s %s\"%s\"", cmd, p1, p2));
-      if (err < 0)
+      [err, msg] = system (sprintf ('%s %s"%s"', cmd, p1, p2));
+      if (err != 0)
         status = false;
         msgid = "copyfile";
+        break;
       endif
+    endwhile
+  else
+    if (ispc () && ! isunix ()
+        && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
+      p1 = strrep (p1, '\', '/');
+      p2 = strrep (p2, '\', '/');
     endif
-  else
-    print_usage ();
+
+    ## Copy the files.
+    [err, msg] = system (sprintf ('%s %s"%s"', cmd, p1, p2));
+    if (err != 0)
+      status = false;
+      msgid = "copyfile";
+    endif
   endif
 
 endfunction
--- a/scripts/miscellaneous/movefile.m	Sun Sep 08 21:08:37 2013 -0700
+++ b/scripts/miscellaneous/movefile.m	Sun Sep 08 21:11:45 2013 -0700
@@ -17,28 +17,39 @@
 ## <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn  {Function File} {[@var{status}, @var{msg}, @var{msgid}] =} movefile (@var{f1}, @var{f2})
-## @deftypefnx {Function File} {[@var{status}, @var{msg}, @var{msgid}] =} movefile (@var{f1}, @var{f2}, 'f')
-## Move the file @var{f1} to the new name @var{f2}.  The name @var{f1}
-## may contain globbing patterns.  If @var{f1} expands to multiple file
-## names, @var{f2} must be a directory.  If the force flag @qcode{'f'} is given
-## then any existing files will be overwritten without prompting.
+## @deftypefn  {Function File} {} movefile (@var{f1})
+## @deftypefnx {Function File} {} movefile (@var{f1}, @var{f2})
+## @deftypefnx {Function File} {} movefile (@var{f1}, @var{f2}, 'f')
+## @deftypefnx {Function File} {[@var{status}, @var{msg}, @var{msgid}] =} movefile (@dots{})
+## Move the file @var{f1} to the destination @var{f2}.
 ##
-## If successful, @var{status} is 1, with @var{msg} and @var{msgid} empty
-## character strings.  Otherwise, @var{status} is 0, @var{msg} contains a
-## system-dependent error message, and @var{msgid} contains a unique
-## message identifier.
-## @seealso{rename, copyfile}
+## The name @var{f1} may contain globbing patterns.  If @var{f1} expands to
+## multiple file names, @var{f2} must be a directory.  If no destination
+## @var{f2} is specified then the destination is the present working directory.
+## If @var{f2} is a file name then @var{f1} is renamed to @var{f2}.
+## When the force flag @qcode{'f'} is given any existing files will be
+## overwritten without prompting.
+##
+## If successful, @var{status} is 1, and @var{msg}, @var{msgid} are empty
+## character strings ("").  Otherwise, @var{status} is 0, @var{msg} contains a
+## system-dependent error message, and @var{msgid} contains a unique message
+## identifier.  Note that the status code is exacly opposite that of the
+## @code{system} command.
+## @seealso{rename, copyfile, glob}
 ## @end deftypefn
 
 function [status, msg, msgid] = movefile (f1, f2, force)
 
+  if (nargin < 1 || nargin > 3)
+    print_usage ();
+  endif
+
   max_cmd_line = 1024;
   status = true;
   msg = "";
   msgid = "";
 
-  ## FIXME -- maybe use the same method as in ls to allow users control
+  ## FIXME: maybe use the same method as in ls to allow users control
   ## over the command that is executed.
 
   if (ispc () && ! isunix ()
@@ -51,79 +62,78 @@
     cmd_force_flag = "-f";
   endif
 
-  if (nargin == 2 || nargin == 3)
-    ## Input type check.
-    if (! (ischar (f1) || iscellstr (f1)))
-      error ("movefile: first argument must be a character string or a cell array of character strings");
-    endif
-
-    if (! ischar (f2))
-      error ("movefile: second argument must be a character string");
-    endif
+  ## Input type check.
+  if (! (ischar (f1) || iscellstr (f1)))
+    error ("movefile: F1 must be a character string or a cell array of character strings");
+  endif
 
-    if (nargin == 3 && strcmp (force, "f"))
-      cmd = [cmd " " cmd_force_flag];
-    endif
+  if (nargin == 1)
+    f2 = pwd ();
+  elseif (! ischar (f2))
+    error ("movefile: F2 must be a character string");
+  endif
 
-    ## If f1 isn't a cellstr convert it to one.
-    if (ischar (f1))
-      f1 = cellstr (f1);
-    endif
+  if (nargin == 3 && strcmp (force, "f"))
+    cmd = [cmd " " cmd_force_flag];
+  endif
 
-    ## If f1 has more than 1 element f2 must be a directory
-    isdir = (exist (f2, "dir") != 0);
-    if (length (f1) > 1 && ! isdir)
-      error ("movefile: when moving multiple files, second argument must be a directory");
-    endif
+  ## If f1 isn't a cellstr convert it to one.
+  if (ischar (f1))
+    f1 = cellstr (f1);
+  endif
 
-    ## Protect the file name(s).
-    f1 = glob (f1);
-    if (isempty (f1))
-      error ("movefile: no files to move");
-    endif
-    p1 = sprintf ("\"%s\" ", f1{:});
-    p2 = tilde_expand (f2);
+  ## If f1 has more than 1 element f2 must be a directory
+  isdir = (exist (f2, "dir") != 0);
+  if (length (f1) > 1 && ! isdir)
+    error ("movefile: when moving multiple files, F2 must be a directory");
+  endif
 
-    if (isdir && length (p1) > max_cmd_line)
-      l2 = length (p2) + length (cmd) + 6;
-      while (! isempty (f1))
-        p1 = sprintf ("\"%s\" ", f1{1});
+  ## Protect the file name(s).
+  f1 = glob (f1);
+  if (isempty (f1))
+    error ("movefile: no files to move");
+  endif
+  p1 = sprintf ('"%s" ', f1{:});
+  p2 = tilde_expand (f2);
+
+  if (isdir && length (p1) > max_cmd_line)
+    l2 = length (p2) + length (cmd) + 6;
+    while (! isempty (f1))
+      p1 = sprintf ('"%s" ', f1{1});
+      f1(1) = [];
+      while (! isempty (f1)
+             && (length (p1) + length (f1{1}) + l2 < max_cmd_line))
+        p1 = sprintf ('%s"%s" ', p1, f1{1});
         f1(1) = [];
-        while (!isempty (f1) && (length (p1) + length (f1{1}) + l2 <
-                                 max_cmd_line))
-          p1 = sprintf ("%s\"%s\" ", p1, f1{1});
-          f1(1) = [];
-        endwhile
+      endwhile
 
-        if (ispc () && ! isunix ()
-            && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
-          p1 = strrep (p1, "\\", "/");
-          p2 = strrep (p2, "\\", "/");
-        endif
-
-        ## Move the file(s).
-        [err, msg] = system (sprintf ("%s %s \"%s\"", cmd, p1, p2));
-        if (err < 0)
-          status = false;
-          msgid = "movefile";
-        endif
-      endwhile
-    else
       if (ispc () && ! isunix ()
           && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
-        p1 = strrep (p1, "\\", "/");
-        p2 = strrep (p2, "\\", "/");
+        p1 = strrep (p1, '\', '/');
+        p2 = strrep (p2, '\', '/');
       endif
 
       ## Move the file(s).
-      [err, msg] = system (sprintf ("%s %s \"%s\"", cmd, p1, p2));
-      if (err < 0)
+      [err, msg] = system (sprintf ('%s %s "%s"', cmd, p1, p2));
+      if (err != 0)
         status = false;
         msgid = "movefile";
       endif
-    endif
+    endwhile
   else
-    print_usage ();
+    if (ispc () && ! isunix ()
+        && ! isempty (file_in_path (getenv ("PATH"), "cp.exe")))
+      p1 = strrep (p1, '\', '/');
+      p2 = strrep (p2, '\', '/');
+    endif
+
+    ## Move the file(s).
+    [err, msg] = system (sprintf ('%s %s "%s"', cmd, p1, p2));
+    if (err != 0)
+      status = false;
+      msgid = "movefile";
+    endif
   endif
+
 endfunction