changeset 19217:666c4e0aca1e

what.m: Overhaul function. * what.m: Redo docstring. Match function variable names to documentation names. Add missing file categories slx and packages for Matlab compatibility. Re-order list of structure fieldnames to match Matlab. Vectorize for loop with repmat. Add BIST tests.
author Rik <rik@octave.org>
date Sun, 28 Sep 2014 12:55:03 -0700
parents ac8a49be686f
children e0a7718ac085
files scripts/miscellaneous/what.m
diffstat 1 files changed, 73 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/miscellaneous/what.m	Sun Sep 28 09:40:19 2014 -0700
+++ b/scripts/miscellaneous/what.m	Sun Sep 28 12:55:03 2014 -0700
@@ -20,40 +20,76 @@
 ## @deftypefn  {Command} {} what
 ## @deftypefnx {Command} {} what @var{dir}
 ## @deftypefnx {Function File} {w =} what (@var{dir})
-## List the Octave specific files in directory @var{dir}.  If @var{dir} is
-## not specified then the current directory is used.  If a return argument is
-## requested, the files found are returned in the structure @var{w}.
-## @seealso{which}
+## List the Octave specific files in directory @var{dir}.
+##
+## If @var{dir} is not specified then the current directory is used.
+##
+## If a return argument is requested, the files found are returned in the
+## structure @var{w}.  The structure contains the following fields:
+##
+## @table @asis
+## @item path
+## Full path to directory @var{dir}
+## @item m
+## Cell array of m-files
+## @item mat
+## Cell array of mat files
+## @item mex
+## Cell array of mex files
+## @item oct
+## Cell array of oct files
+## @item mdl
+## Cell array of mdl files
+## @item slx
+## Cell array of slx files
+## @item p
+## Cell array of p-files
+## @item classes
+## Cell array of class directories (@file{@@@var{classname}/})
+## @item packages
+## Cell array of package directories (@file{+@var{pkgname}/})
+## @end table
+##
+## Compatibility Note: Octave does not support mdl, slx, and p files; nor
+## does it support package directories.  @code{what} will always return an
+## empty list for these categories.
+## @seealso{which, ls, exist}
 ## @end deftypefn
 
-function ret = what (d)
+function retval = what (dir)
+
+  if (nargin > 1)
+    print_usage ();
+  endif
 
   if (nargin == 0)
-    d = pwd ();
+    dir = pwd ();
   else
-    dtmp = canonicalize_file_name (d);
+    dtmp = canonicalize_file_name (dir);
     if (isempty (dtmp))
       ## Search for directory name in path
-      if (d(end) == '/' || d(end) == '\')
-        d(end) = [];
+      if (dir(end) == '/' || dir(end) == '\')
+        dir(end) = [];
       endif
-      dtmp = dir_in_loadpath (d);
+      dtmp = dir_in_loadpath (dir);
       if (isempty (dtmp))
-        error ("what: could not find the directory %s", d);
+        error ("what: could not find the directory %s", dir);
       endif
     endif
-    d = dtmp;
+    dir = dtmp;
   endif
 
-  files = readdir (d);
-  w.path = d;
+  files = readdir (dir);
+  w.path = dir;
   w.m = cell (0, 1);
+  w.mat = cell (0, 1);
   w.mex = cell (0, 1);
   w.oct = cell (0, 1);
-  w.mat = cell (0, 1);
   w.mdl = cell (0, 1);
+  w.slx = cell (0, 1);
   w.p = cell (0, 1);
   w.classes = cell (0, 1);
+  w.packages = cell (0, 1);
 
   for i = 1 : length (files)
     n = files{i};
@@ -61,17 +97,17 @@
     if (strcmp (n, ".") || strcmp (n, ".."))
       continue;
     else
-      ## Ignore mdl and p files
+      ## Ignore mdl, slx, p, and packages since they are not  
       [~, f, e] = fileparts (n);
       if (strcmp (e, ".m"))
         w.m{end+1} = n;
+      elseif (strcmp (e, ".mat"))
+        w.mat{end+1} = n;
       elseif (strcmp (e, ".oct"))
         w.oct{end+1} = n;
       elseif (strcmp (e, mexext ()))
         w.mex{end+1} = n;
-      elseif (strcmp (e, ".mat"))
-        w.mat{end+1} = n;
-      elseif (strcmp (n(1), "@") && isdir (n))
+      elseif (n(1) == "@" && isdir (n))
         w.classes{end+1} = n;
       endif
     endif
@@ -79,35 +115,45 @@
 
   if (nargout == 0)
     __display_filenames__ ("M-files in directory", w.path, w.m);
+    __display_filenames__ ("\nMAT-files in directory", w.path, w.mat);
     __display_filenames__ ("\nMEX-files in directory", w.path, w.mex);
     __display_filenames__ ("\nOCT-files in directory", w.path, w.oct);
-    __display_filenames__ ("\nMAT-files in directory", w.path, w.mat);
     __display_filenames__ ("\nClasses in directory", w.path, w.classes);
   else
-    ret = w;
+    retval = w;
   endif
+
 endfunction
 
 function __display_filenames__ (msg, p, f)
+
   if (length (f) > 0)
     printf ("%s %s:\n\n", msg, p);
 
     maxlen = max (cellfun ("length", f));
     ncols = max (1, floor (terminal_size ()(2) / (maxlen + 3)));
-    fmt = "";
-    for i = 1: ncols
-      fmt = sprintf ("%s   %%-%ds", fmt, maxlen);
-    endfor
-    fmt = [fmt, "\n"];
+    fmt = sprintf ("   %%-%ds", maxlen);
+    fmt = repmat (fmt, [1, ncols]);
+    fmt = [fmt "\n"];
 
     nrows = ceil (length (f) / ncols);
     for i = 1 : nrows
       args  = f(i:nrows:end);
       if (length (args) < ncols)
-        args(end + 1 : ncols) = {""};
+        args(end+1 : ncols) = {""};
       endif
       printf (fmt, args{:});
     endfor
   endif
+
 endfunction
 
+
+%!test
+%! w = what ();
+%! assert (w.path, pwd);
+%! assert (fieldnames (w), {"path"; "m"; "mat"; "mex"; "oct"; "mdl"; "slx";
+%!                          "p"; "classes"; "packages"});
+
+%!error what (1, 2)
+