]> Creatis software - CreaPhase.git/blob - octave_packages/m/miscellaneous/what.m
update packages
[CreaPhase.git] / octave_packages / m / miscellaneous / what.m
1 ## Copyright (C) 2007-2012 David Bateman
2 ##
3 ## This file is part of Octave.
4 ##
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
9 ##
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 ## General Public License for more details.
14 ##
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING.  If not, see
17 ## <http://www.gnu.org/licenses/>.
18
19 ## -*- texinfo -*-
20 ## @deftypefn  {Command} {} what
21 ## @deftypefnx {Command} {} what @var{dir}
22 ## @deftypefnx {Function File} {w =} what (@var{dir})
23 ## List the Octave specific files in directory @var{dir}.  If @var{dir} is
24 ## not specified then the current directory is used.  If a return argument is
25 ## requested, the files found are returned in the structure @var{w}.
26 ## @seealso{which}
27 ## @end deftypefn
28
29 function ret = what (d)
30
31   if (nargin == 0)
32     d = pwd ();
33   elseif (isempty (strfind (d, filesep ())))
34     ## Find the appropriate directory on the path.
35     p = strtrim (strsplit (path (), pathsep()));
36     d = p{find (cellfun (@(x) ! isempty (strfind (x, d)), p))(end)};
37   else
38     [status, msg, msgid] = fileattrib (d);
39     if (status != 1)
40       error ("what: could not find the file or path %s", d);
41     else
42       d = msg.Name;
43     endif
44   endif
45
46   files = dir (d);
47   w.path = d;
48   w.m = cell (0, 1);
49   w.mex = cell (0, 1);
50   w.oct = cell (0, 1);
51   w.mat = cell (0, 1);
52   w.mdl = cell (0, 1);
53   w.p = cell (0, 1);
54   w.classes = cell (0, 1);
55
56   for i = 1 : length (files)
57     n = files(i).name;
58     ## Ignore . and ..
59     if (strcmp (n, ".") || strcmp (n, ".."))
60       continue;
61     else
62       ## Ignore mdl and p files
63       [dummy, f, e] = fileparts (n);
64       if (strcmp (e, ".m"))
65         w.m{end+1} = n;
66       elseif (strcmp (e, mexext ()))
67         w.mex{end+1} = n;
68       elseif (strcmp (e, ".oct"))
69         w.oct{end+1} = n;
70       elseif (strcmp (e, ".mat"))
71         w.mat{end+1} = n;
72       elseif(strcmp (n(1), "@"))
73         w.classes{end+1} = n;
74       endif
75     endif
76   endfor
77
78   if (nargout == 0)
79     __display_filenames__ ("M-files in directory", w.path, w.m);
80     __display_filenames__ ("\nMEX-files in directory", w.path, w.mex);
81     __display_filenames__ ("\nOCT-files in directory", w.path, w.oct);
82     __display_filenames__ ("\nMAT-files in directory", w.path, w.mat);
83     __display_filenames__ ("\nClasses in directory", w.path, w.classes);
84   else
85     ret = w;
86   endif
87 endfunction
88
89 function __display_filenames__ (msg, p, f)
90   if (length (f) > 0)
91     printf ("%s %s:\n\n", msg, p);
92
93     maxlen = max (cellfun ("length", f));
94     ncols = max (1, floor (terminal_size()(2) / (maxlen + 3)));
95     fmt = "";
96     for i = 1: ncols
97       fmt = sprintf ("%s   %%-%ds", fmt, maxlen);
98     endfor
99     fmt = [fmt, "\n"];
100
101     nrows = ceil (length (f) / ncols);
102     for i = 1 : nrows
103       args  = f(i:nrows:end);
104       if (length (args) < ncols)
105         args(end + 1 : ncols) = {""};
106       endif
107       printf (fmt, args{:});
108     endfor
109   endif
110 endfunction