function mexpr = m2c(mexpr)
%MATLAB expression to C/C++ expression. See documentation for details.
%basile.graf@epfl.ch

func = 'pow';
sq = 'sqrt';

%mexpr = [' ' mexpr ' ']; %

I = find(mexpr=='^');

par=0; % ( => par=par+1, ) => par=par-1

L=length(I);


for count=1:L %for each ^ found
    
    par=0;
    Ipow = find(mexpr=='^');
    I=Ipow(1);
    fin_g=I-1;

    while 1
        I=I-1;
        if mexpr(I)==')'; par=par+1; end
        if (mexpr(I)=='(' & par==0); debut_g=I+1; break, end
        if (mexpr(I)=='(' & par~=0); par=par-1; end
        if (par==0 & (mexpr(I)=='^' | mexpr(I)=='+' | mexpr(I)=='-' | mexpr(I)=='*' | mexpr(I)=='/')); debut_g=I+1; break, end
        if I==1; debut_g=1; break,  end
    end
    
    par=0;
    I=Ipow(1);
    debut_d=I+1;
    while 1
        I=I+1;
        if mexpr(I)=='('; par=par+1; end
        if (mexpr(I)==')' & par==0); fin_d=I-1; break, end
        if (mexpr(I)==')' & par~=0); par=par-1; end
        if (par==0 & (mexpr(I)=='^' | mexpr(I)=='+' | mexpr(I)=='-' | mexpr(I)=='*' | mexpr(I)=='/')); fin_d=I-1; break, end
        if I==length(mexpr); fin_d=length(mexpr); break, end
    end
    
    base = mexpr(debut_g:fin_g);
    expo = mexpr(debut_d:fin_d);
    
    try
        if eval(expo)==.5
            mexpr = [mexpr(1:debut_g-1) sq '(' base ')' mexpr(fin_d+1:end)];
        else
            mexpr = [mexpr(1:debut_g-1) func '(' base ',' expo ')' mexpr(fin_d+1:end)];
        end
    catch  
        mexpr = [mexpr(1:debut_g-1) func '(' base ',' expo ')' mexpr(fin_d+1:end)];
    end
    
end