# HG changeset patch # User Rik # Date 1378699905 25200 # Node ID b6867a09d7cff872d0a64f320decfc27943267aa # Parent 6437a6815bc683fe7383b0bb1fecf5ae7262f1b9 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. diff -r 6437a6815bc6 -r b6867a09d7cf scripts/miscellaneous/copyfile.m --- 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 diff -r 6437a6815bc6 -r b6867a09d7cf scripts/miscellaneous/movefile.m --- 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 @@ ## . ## -*- 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