diff m-toolbox/mk_file_list.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/mk_file_list.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,376 @@
+function [fails, ginfoFails] = mk_file_list(varargin)
+  % A  script to make a list of toolbox files and write an m-file to
+  % declare the files
+  %
+  % Usage: mk_file_list(toolbox_dir);
+  %
+  % M Hewitson
+  %
+  % $Id: mk_file_list.m,v 1.18 2008/12/21 18:49:25 hewitson Exp $
+  %
+
+  if nargin == 0
+    rdir = 'c:\matlab\ltpda_toolbox';
+  else
+    rdir = varargin{1};
+  end
+
+  if rdir(end) ~= filesep
+    rdir = [rdir filesep];
+  end
+
+  % Initialise
+  nn    = 1;
+  fails = {};
+  ginfoFails = {};
+
+  % make a list of all class methods
+  classes = utils.helper.ltpda_classes;
+
+  % Go through each class
+  for cls=classes
+    cl = char(cls);
+
+    % get the methods for this class
+    mths = methods(cl);
+
+    for m=1:numel(mths)
+      mth = mths{m};
+      % get file name
+      fi = which(fullfile(cl, mth));
+      if isempty(fi)
+        warning('!!! Can''t find %s/%s', cl, mth)
+      end
+      % Get path,name,ext
+      [path, fcnname, ext, ver] = fileparts(fi);
+
+      % get short name
+      sname = mth;
+      if ~strcmpi(mth, 'contents')
+        disp(sprintf('*** processing %s', mth));
+        % load file
+        fc = '';
+        if ~isempty(fi)
+          fd = fopen(fi, 'r');
+          if fd == -1
+            error('### Could not open %s', fi);
+          end
+          fc = fscanf(fd, '%s');
+          fclose(fd);
+        end
+        
+        % Look for a CVS version string
+        verstr = '';
+        try
+          ii = strfind(fc, '$Id:');
+          ts = fc(ii(1):end);
+          ii = strfind(ts, '$');
+          verstr = ts(1:ii(2));
+        catch
+          warning('!!! CVS Tag not found: Failed on %s', sname)
+          fails = [fails {sname}];
+        end
+        
+        % If we have a valid version string, continue
+        ver = '';
+        dt  = '';
+        tt  = '';
+        nm  = '';
+        if ~isempty(verstr)
+          
+          % parse version string
+          tks = regexp(verstr, 'v([.0-9]+)(\d{4}/\d{2}/\d{2})(\d{2}:\d{2}:\d{2})(\S+)', 'tokens');
+          try
+            ver = tks{1}{1};                    % version
+            dt  = tks{1}{2};                    % date
+            tt  = tks{1}{3};                    % time
+            ni  = strfind(tks{1}{4}, 'Exp$');
+            nm  = tks{1}{4}(1:ni-1);            % name
+          catch
+            ver = '';
+            dt  = '';
+            tt  = '';
+            nm  = '';
+            fails = [fails {sname}];
+          end
+        end
+        % make hash
+        if isempty(fc)
+          hs = '';
+        else
+          hs = utils.prog.hash(fc, 'MD5');
+        end
+        
+        % Look for the category
+        cat = '';
+        argsMin = '';
+        argsMax = '';
+        try
+          cmd = sprintf('ii = %s.getInfo(''%s'', ''None'');', cl, mth);
+          eval(cmd);
+          cat = ii.mcategory;
+          argsMin = num2str(ii.argsmin);
+          argsMax = num2str(ii.argsmax);
+        catch
+          lasterr
+          
+        end
+        
+        % fill cell array
+        vers(nn,1) = {fi};
+        vers(nn,2) = {sname};
+        vers(nn,3) = {ver};
+        vers(nn,4) = {dt};
+        vers(nn,5) = {tt};
+        vers(nn,6) = {nm};
+        vers(nn,7) = {path};
+        vers(nn,8) = {hs};
+        vers(nn,9) = {cat};
+        vers(nn,10) = {cl};
+        vers(nn,11) = {argsMin};
+        vers(nn,12) = {argsMax};
+        nn = nn + 1;
+      end
+    end
+  end
+
+
+  %--- Write out version file
+  fname = fullfile(rdir, 'ltpda', 'm', 'etc','ltpda_versions.m');
+  fd = fopen(fname, 'w+');
+  fprintf(fd, 'versions = {...\n');
+  for j=1:size(vers,1)
+    fprintf(fd, '\t\t');
+    for k=1:size(vers,2)
+      fprintf(fd, '''%s''', vers{j,k});
+      if k~=size(vers,2)
+        fprintf(fd, ', ');
+      end
+    end
+    fprintf(fd, '; ...\n');
+  end
+  fprintf(fd, '\t\t};\n');
+  fclose(fd);
+
+  % Compile this to p-code
+  run(fname)
+%   pcode(fname, '-inplace');
+%   delete(fname);
+
+  %--- Display failures
+  for j=1:length(fails)
+    disp(sprintf('### FAILED: %s', fails{j}));
+  end
+
+end
+
+%   %--- Process each file
+%   for j=1:nfs
+%
+%     % This file
+%     fi = tbfs{j};
+%
+%     % Get path,name,ext
+%     [path, fcnname, ext, ver] = fileparts(fi);
+%
+%     % Make exceptions
+%     if  ~strcmp(fcnname, 'Contents') && ...
+%         ~strcmp(fcnname, 'MakeContents')
+%
+%       % get short name
+%       sname = strrep(fi, rdir, '');
+%       if sname(1) == '/'
+%         sname = sname(2:end);
+%       end
+%       disp(sprintf('*** processing %s', sname));
+%
+%       % load file
+%       fd = fopen(fi, 'r');
+%       fc = fscanf(fd, '%s');
+%       fclose(fd);
+%
+%       % Look for a CVS version string
+%       try
+%         ii = strfind(fc, '$Id:');
+%         ts = fc(ii(1):end);
+%         ii = strfind(ts, '$');
+%         verstr = ts(1:ii(2));
+%       catch
+%         warning('!!! CVS Tag not found: Failed on %s', sname)
+%         fails = [fails {sname}];
+%       end
+%
+%
+%
+%       % If we have a valid version string, continue
+%       if ~isempty(verstr)
+%
+%         % parse version string
+%         tks = regexp(verstr, 'v([.0-9]+)(\d{4}/\d{2}/\d{2})(\d{2}:\d{2}:\d{2})(\S+)', 'tokens');
+%         try
+%           ver = tks{1}{1};                    % version
+%           dt  = tks{1}{2};                    % date
+%           tt  = tks{1}{3};                    % time
+%           ni  = strfind(tks{1}{4}, 'Exp$');
+%           nm  = tks{1}{4}(1:ni-1);            % name
+%         catch
+%           ver = '';
+%           dt  = '';
+%           tt  = '';
+%           nm  = '';
+%           fails = [fails {sname}];
+%         end
+%
+%         % make hash
+%         hs = utils.prog.hash(fc, 'MD5');
+%
+%         % get class/category
+%         idx = strfind(sname, fcnname);
+%         pth = sname(1:idx(end)-1);
+%
+%         % get class
+%         if ~isempty(strfind(pth, 'classes'))
+%           [s,r] = strtok(pth, '@');
+%           cl = r(2:end-1);
+%         else
+%           cl = 'None';
+%         end
+%
+%         % Look for the category
+%         cat = '';
+%         acc = '';
+%         if ismember(cl, classes)
+%           if ~strcmp(cl, 'None')
+%             try
+%               cmd = sprintf('ii = %s.getInfo(''%s'', ''None'');', cl, fcnname);
+%               eval(cmd);
+%               cat = ii.mcategory;
+%             end
+%           end
+%           if isempty(cat)
+%             ginfoFails = [ginfoFails {sname}];
+%           end
+%         end
+%
+%         % fill cell array
+%         vers(nn,1) = {fi};
+%         vers(nn,2) = {fcnname};
+%         vers(nn,3) = {ver};
+%         vers(nn,4) = {dt};
+%         vers(nn,5) = {tt};
+%         vers(nn,6) = {nm};
+%         vers(nn,7) = {pth};
+%         vers(nn,8) = {hs};
+%         vers(nn,9) = {cat};
+%         vers(nn,10) = {cl};
+%         nn = nn + 1;
+%       else
+%         fails = [fails {sname}];
+%       end
+%     end
+%   end
+%   % Only output those which are not empty
+%   vers = vers(1:nn-1,:);
+%
+%   %--- Write out version file
+%   fname = [rdir '/ltpda/m/etc/ltpda_versions.m'];
+%   fd = fopen(fname, 'w+');
+%   fprintf(fd, 'versions = {...\n');
+%   for j=1:length(vers)
+%     fprintf(fd, '\t\t');
+%     for k=1:size(vers,2)
+%       fprintf(fd, '''%s''', vers{j,k});
+%       if k~=size(vers,2)
+%         fprintf(fd, ', ');
+%       end
+%     end
+%     fprintf(fd, '; ...\n');
+%   end
+%   fprintf(fd, '\t\t};\n');
+%   fclose(fd);
+%
+%   % Compile this to p-code
+%   run(fname)
+% %   pcode(fname, '-inplace');
+% %   delete(fname);
+%
+%   %--- Display failures
+%   for j=1:length(fails)
+%     disp(sprintf('### FAILED: %s', fails{j}));
+%   end
+
+
+function files = mtfilescan(root_dir, ext)
+
+  % FILESCAN recursively scans the given directory for files that end in
+  % 'ext' and returns a list of the full paths.
+  %
+  % function files = mtfilescan(root_dir, ext)
+  %
+
+  files = getfiles(root_dir, ext, []);
+end
+
+%--------------------------------------------------------------------------
+function ofiles = getfiles(root_dir, iext, ofiles)
+  % Recursive function for getting file lists
+  %
+
+  disp(sprintf('   + looking in %s', root_dir));
+  files = dir(root_dir);
+
+  for j=1:length(files)
+    f = files(j);
+    if f.isdir
+      if strcmp(f.name,'.')==0 && strcmp(f.name,'..')==0
+        %mdisp('found dir %s', f.name);
+        ofiles = getfiles([root_dir '/' f.name], iext, ofiles);
+      end
+    else
+      [pathstr,name,ext,v] = fileparts(f.name);
+      if any(strcmp(ext, iext))
+        ofiles = [ofiles; cellstr([root_dir '/' f.name])];
+      end
+    end
+  end
+end
+
+function mths = getMethods(cl)
+
+  mths = [];
+  % Class info
+  try
+    % get meta info for this class
+    ci = eval(sprintf('?%s', cl));
+    % Get methods
+    ms = methods(cl); %ci.Methods;
+
+    % Check if this is an abstract class
+    try
+      o = feval(cl);
+      abstract = false;
+    catch
+      abstract = true;
+    end
+
+    if ~abstract
+      % Go through methods
+      for kk=1:numel(ms)
+        m = eval(sprintf('?%s', ms{kk}));
+        % If this is not an inherited
+%         if strcmp(m.DefiningClass.Name, cl)
+          disp(sprintf('   -- checking %s/%s', cl, m.Name));
+          if strcmp(m.Access, 'public') && ~m.Static && ~strcmp(m.Name, 'Contents')
+            mths = [mths; {m}];
+          end
+%         else
+%           warning('!!! Skipping inherited method %s/%s', cl, m.Name);
+%         end
+      end
+    end
+  catch
+    warning('!!! Couldn''t get meta info for class %s', cl);
+  end
+end
+
+% END