Code covered by the BSD License  

Highlights from
matlab2fmex

image thumbnail

matlab2fmex

by

 

03 Feb 2004 (Updated )

matlab2fmex.m is a small translator which aims to convert numerical M-files to Fortran90 mex.

Editor's Notes:

This author's upload was somehow corrupted. We fixed this on March 29, 2006. At that time, we also converted it from a GZ file a ZIP file for better cross platform portability.

[outflag,howmany,subscripts,centercomma,parens,callword]=inwhichlast(i,spot);
function [outflag,howmany,subscripts,centercomma,parens,callword]=inwhichlast(i,spot);
%Key:
% outflag==0  ==>  in nothing at spot, return any mathematical nesting parenthesis, or [1 end]
% outflag==1  ==>  in bracket last
% outflag==2  ==>  in subscript last
% outflag==3  ==>  in make_converted function last
% outflag==4  ==>  in submitted subroutine call last
% outflag==5  ==>  in regular function call last (from intrinsics list)
% outflag==6  ==>  in regular function call last (not from intrinsics list (yet to be converted?))
declare_globals
outflag=0;howmany=0;subscripts=[];centercomma=[];parens=[];
temp1=find(~isspace(funstr{i}));
callword='';

left=funstr{i}=='(';
right=funstr{i}==')';
both_p=left-right;                 c_p=cumsum(both_p);
leftbracket=funstr{i}=='[';
rightbracket=funstr{i}==']';
both_b=leftbracket-rightbracket;   c_b=cumsum(both_b);
goon=0;
try
if (length(find(find(leftbracket)<spot))>length(find(find(rightbracket)<spot)))|(length(find(find(left)<spot))>length(find(find(right)<spot)))
 leftp=find(left);
 poss_p=leftp(leftp<spot);
 leftbracketp=find(leftbracket);
 poss_b=leftbracketp(leftbracketp<spot);
 poss=sort([poss_p poss_b]);
 for k=length(poss):-1:1
  if findrights(poss(k),funstr{i})>spot
   %if a word doesn't immediately precede this '(' then it is mathematical or superfluous
   %In this case, we should set j to the last unclosed '(' or '['
   %or return if there is no such '(' or '['.
   if funstr{i}(poss(k))=='['
    goon=1; j=poss(k); break
   else
    temp2=temp1(temp1<poss(k));
    if ~isempty(temp2)
     if length(funstrwords{i})>0
      if any(temp2(end)==funstrwords_e{i})
       if funstr{i}(poss(k))=='['
        goon=1; j=poss(k); break
       elseif funstr{i}(poss(k))=='('
        goon=1; j=poss(k); break
       end
      end
     end
    end
   end
  end
 end
end
catch
 funstr{i},spot,disp('is there a mismatched parenthesis or bracket?');keyboard
end
% if zzz
%  'eeeeeeeeee',goon,j,funstr{i},funstr{i}(1:j),zzz=0;kb
% end
if goon
 if strcmp(funstr{i}(j),'(')
  temp1=temp1(temp1<j);
  temp2=find(temp1(length(temp1))==funstrwords_e{i});
  if ~isempty(temp2)
   callword=temp2;
   if length(find(strcmpi(funstrwords{i}{temp2},inoutother3)))>0
    [howmany,subscripts,centercomma,parens]=hassubscript(i,temp2);
    if parens(2)>spot
     %In subscript last
     outflag=2;
    end
   elseif length(find(strcmpi(funstrwords{i}{temp2},make_words)))>0
    [howmany,subscripts,centercomma,parens]=hassubscript(i,temp2);
    if parens(2)>spot
     %In make_converted function last
     outflag=3;
    end
   elseif length(find(strcmpi(funstrwords{i}{temp2},filename_all)))>0
    [howmany,subscripts,centercomma,parens]=hassubscript(i,temp2);
    if parens(2)>spot
     %In submitted subroutine call last
     outflag=4;
    end
   elseif length(find(strcmpi(funstrwords{i}{temp2},intrinsics)))>0
    [howmany,subscripts,centercomma,parens]=hassubscript(i,temp2);
    if parens(2)>spot
     %In regular converted function (not make_*) last
     outflag=5;
    end
   elseif length(find(strcmpi(funstrwords{i}{temp2},funwords)))>0
    [howmany,subscripts,centercomma,parens]=hassubscript(i,temp2);
    if parens(2)>spot
     %In submitted subroutine call last
     outflag=6;
    end
   end
  else %no word immediately preceeds this parenthesis, but a mathematical ( or [ encompasses it
   if funstr{i}(j)=='[' | funstr{i}(j)=='('
    j2=findrights(j,funstr{i});
   end
   %outflag=0;howmany=1;subscripts{1}=funstr{i}(j+1:j2-1);centercomma=[];parens=[j j2];
   outflag=0;howmany=1;subscripts{1}=funstr{i};centercomma=[];parens=[1 length(funstr{i})];
  end
 elseif strcmp(funstr{i}(j),'[')
  [dummy,howmany,subscripts,centercomma,parens]=inbracket(i,spot,funstr);
  temp3=findrights(j,funstr{i});
  if temp3>spot
   %In bracket last
   outflag=1;
  end
 end
else
 outflag=0;howmany=1;subscripts{1}=funstr{i};centercomma=[];parens=[1 length(funstr{i})];
end
%funstr{i},funstr{i}(1:spot),kb

Contact us