% GETHELPVAR - convert a Matlab m-file help-message header 
%               into out variables 
% Usage:
%  >> [vartext, varnames] = gethelpvar( filein, varlist);
%
% Inputs:
%   filein     - input filename  (with .m extension)
%   varlist    - optional list of variable to return. If absent
%                return all variables.
%
% Outputs:
%   vartext     - variable text
%   varnames    - name of the variable returned;
%
% Notes: see HELP2HTML for file format
%
% Example: >> gethelpvar( 'gethelpvar.m', 'filein')
%
% Author:  Arnaud Delorme, Salk Institute 20 April 2002
%
% See also: HELP2HTML

% Copyright (C) 2001 Arnaud Delorme, Salk Institute, arno@salk.edu
%
% This file is part of EEGLAB, see http://www.eeglab.org
% for the documentation and details.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are met:
%
% 1. Redistributions of source code must retain the above copyright notice,
% this list of conditions and the following disclaimer.
%
% 2. Redistributions in binary form must reproduce the above copyright notice,
% this list of conditions and the following disclaimer in the documentation
% and/or other materials provided with the distribution.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
% THE POSSIBILITY OF SUCH DAMAGE.

function [alltext, allvars] = gethelpvar( filename, varlist )

if nargin < 1
	help gethelpvar;
	return;
end

% input file
% ---------- 
fid = fopen( filename, 'r');
if fid == -1
	error('File not found');
end

cont = 1;

% scan file
% -----------
str = fgets( fid );
% if first line is the name of the function, reload
if str(1) ~= '%', str = fgets( fid ); end; 

% state variables
% -----------
maindescription 	 = 1;
varname = [];
oldvarname = [];
vartext = []; 	
newvar  	 = 0;
allvars = {};
alltext = {};
indexout = 1;

while (str(1) == '%')
   str = deblank(str(2:end-1));
  
   % --- DECODING INPUT
   newvar  	 = 0;
   str = deblank2(str); 
   
   if ~isempty(str)
      
	  % find a title
	  % ------------
	  i2d = findstr(str, ':');
	  newtitle = 0;
	  if ~isempty(i2d)
	  	 i2d = i2d(1);
	  	 switch lower(str(1:i2d))
	  		case { 'usage:' 'authors:' 'author:' 'notes:' 'note:' 'input:' ...
	  		'inputs:' 'outputs:' 'output' 'example:' 'examples:' 'see also:' }, newtitle = 1;
		 end
		 if (i2d == length(str)) && (str(1) ~= '%'), newtitle = 1; end;	
   	  end
      if newtitle
  			tilehtml = str(1:i2d); 
  			newtitle = 1;
	        oldvarname = varname;
        		oldvartext = vartext;
        	if i2d < length(str)
         			%vartext = formatstr(str(i2d+1:end), g.refcall);
         			vartext = str(i2d+1:end);
         	else	vartext = [];
         	end;	
         	varname = [];
      else
	  % not a title
	  % ------------
         % scan lines
         [tok1, strrm] = strtok( str );
         [tok2, strrm] = strtok( strrm );

         if ~isempty(tok2) && ( isequal(tok2,'-') || isequal(tok2,'=')) % new variable 
            newvar = 1;
            oldvarname = varname;
            oldvartext = vartext;
            varname = tok1;
            strrm = deblank(strrm);            % remove tail blanks
            strrm = deblank(strrm(end:-1:1));	% remove initial blanks 
           	%strrm = formatstr( strrm(end:-1:1), g.refcall);
           	strrm = strrm(end:-1:1);
            vartext = strrm;
         else
            % continue current text
            str = deblank(str);            % remove tail blanks
            str = deblank(str(end:-1:1));	% remove initial blanks
            %str = formatstr( str(end:-1:1), g.refcall );
            str = str(end:-1:1);
            if isempty(vartext)
               vartext = str;
            else	
               if ~isempty(varname) 
               	    vartext = [ vartext 10 str]; % space if in array
               else 
               		if length(vartext)>3 && all(vartext(	end-2:end) == '.')
               			vartext = [ deblank2(vartext(1:end-3)) 10 str]; % space if '...'
               		else
                    	vartext = [ vartext 10 str];    % CR otherwise
                    end;	
               end;		
            end
         end;	 
         newtitle = 0;		
      end
	  % --- END OF DECODING 	
      
   	  str = fgets( fid );

      % test if last entry
      % ------------------
      if str(1) ~= '%'
  	 	 if ~newtitle
  	 	 	if ~isempty(oldvarname)
				allvars{indexout} = oldvarname;
				alltext{indexout} = oldvartext;
				indexout = indexout + 1;
           		%fprintf( fo, [ '</tr>' g.normrow g.normcol1 g.var '</td>\n' ], oldvarname);
           		%fprintf( fo, [ g.normcol2 g.vartext '</td></tr>\n' ], oldvartext);
       	 	else
       			if ~isempty(oldvartext)
           			%fprintf( fo, [ g.normcol2 g.tabtext '</td></tr>\n' ], oldvartext);	
       			end
         	end;	 	
         	newvar = 1;
         	oldvarname = varname;
         	oldvartext = vartext;
         end;	
      end; 

      % test if new input for an array
      % ------------------------------
      if newvar || newtitle
         if maindescription
            if ~isempty(oldvartext) % FUNCTION TITLE
               maintext = oldvartext;
               maindescription = 0;
               functioname = oldvarname( 1:findstr( oldvarname, '()' )-1);
               %fprintf( fo, [g.normrow g.normcol1 g.functionname '</td>\n'],upper(functioname));
               %fprintf( fo, [g.normcol2 g.description '</td></tr>\n'], [ upper(oldvartext(1)) oldvartext(2:end) ]);

               % INSERT IMAGE IF PRESENT
               %imagename = [ htmlfile( 1:findstr( htmlfile, functioname )-1) functioname '.jpg' ];
			   %if exist( imagename ) % do not make link if the file does not exist 
					%fprintf(fo, [ g.normrow g.doublecol ...
					%			'<CENTER><BR><A HREF="' imagename '" target="_blank"><img SRC=' imagename ...
					%			' height=150 width=200></A></CENTER></td></tr>' ]);
		       %end
            end;             
   		elseif ~isempty(oldvarname)
			allvars{indexout} = oldvarname;
			alltext{indexout} = oldvartext;
			indexout = indexout + 1;
       		%fprintf( fo, [ '</tr>' g.normrow g.normcol1 g.var '</td>\n' ], oldvarname);
       		%fprintf( fo, [ g.normcol2 g.vartext '</td></tr>\n' ], oldvartext);
   	 	else
   			if ~isempty(oldvartext)
       			%fprintf( fo, [ g.normcol2 g.text '</td></tr>\n' ], oldvartext);	
   			end
         end;      
      end;	
      
      % print title
      % -----------
      if newtitle
		 %fprintf( fo, [ g.normrow g.doublecol '<BR></td></tr>' g.normrow g.normcol1 g.title '</td>\n' ], tilehtml);
      	 if str(1) ~= '%' % last input
         	%fprintf( fo, [ g.normcol2 g.text '</td></tr>\n' ], vartext);
         end;		
         oldvarname = [];
         oldvartext = [];
      end
   else
      str = fgets( fid );
   end
end
fclose( fid );

% remove quotes of variables
% --------------------------
for index = 1:length(allvars)
	if allvars{index}(1) == '''', allvars{index} = eval( allvars{index} ); end
end

if exist('varlist') == 1
	if ~iscell(varlist), varlist = { varlist }; end
        newtxt = mat2cell(zeros(length(varlist), 1), length(varlist), 1); % preallocation
	for index = 1:length(varlist)
		loc = strmatch( varlist{index}, allvars);
		if ~isempty(loc)
			newtxt{index} = alltext{loc(1)};
		else
			disp([ 'warning: variable ''' varlist{index} ''' not found']);
			newtxt{index} = '';
		end
	end
	alltext = newtxt;
end
	
return;

% -----------------
% sub-functions
% -----------------
function str = deblank2( str )
   str = deblank(str(end:-1:1));    % remove initial blanks
   str = deblank(str(end:-1:1));	% remove tail blanks 
return;

function strout = formatstr( str, refcall )
		[tok1, strrm] = strtok( str );
		strout = [];
		while ~isempty(tok1)
			tokout = functionformat( tok1, refcall );
			if isempty( strout)
				strout = tokout; 	
			else
				strout = [strout ' ' tokout ]; 	
            end
			[tok1, strrm] = strtok( strrm );
		end
return;	
 
function tokout = functionformat( tokin, refcall )
	tokout = tokin;	% default
	[test, realtokin, tail] = testfunc1( tokin );
	if ~test,  [test, realtokin, tail] = testfunc2( tokin ); end
	if test
        i1 = findstr( refcall, '%s');
        i2 = findstr(refcall(i1(1):end), '''');
        if isempty(i2)
            i2 = length(refcall(i1(1):end)) + 1;
        end
		filename  = [ realtokin refcall(i1+2:i1+i2-2)];
		if exist( filename ) % do not make link if the file does not exist 
			tokout =  sprintf( [ '<A HREF="' refcall '">%s</A>' tail ' ' ], realtokin, realtokin );
		end
    end
return;

function [test, realtokin, tail] = testfunc1( tokin ) % test if is string is 'function()[,]'
test = 0; realtokin = ''; tail = '';
if ~isempty( findstr( tokin, '()' ) )
    realtokin = tokin(1:findstr(tokin, '()') - 1);
    if length(realtokin) < (length(tokin) - 2)
        tail = tokin(end);
    else
        tail = [];
    end
    test = 1;
end
return;

function [test, realtokin, tail] = testfunc2( tokin ) % test if is string is 'FUNCTION[,]'  
	test = 0; realtokin = ''; tail = '';
	if all( upper(tokin) == tokin)
		if tokin(end) == ',' 
			realtokin = tokin(1:end-1);
			tail = ',';
		else
			realtokin = tokin;
		end
		testokin = realtokin;
		testokin(findstr(testokin, '_')) = 'A';
		testokin(findstr(testokin, '2')) = 'A';
		if all(double(testokin) > 64) && all(double(testokin) < 91)
			test = 1;
        end
		realtokin = lower(realtokin);
	end
return;	
