static void evalPrimary(Parser *p){

    double d, d2=NAN;

    char *next= p->s;

    int i;



    /* number */

    d= strtod(p->s, &next);

    if(next != p->s){

        push(p, d);

        p->s= next;

        return;

    }

    

    /* named constants */

    for(i=0; p->const_name[i]; i++){

        if(strmatch(p->s, p->const_name[i])){

            push(p, p->const_value[i]);

            p->s+= strlen(p->const_name[i]);

            return;

        }

    }

    

    p->s= strchr(p->s, '(');

    if(p->s==NULL){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ( in \"%s\"\n", next);

        return;

    }

    p->s++; // "("

    evalExpression(p);

    d= pop(p);

    p->s++; // ")" or ","

    if(p->s[-1]== ','){

        evalExpression(p);

        d2= pop(p);

        p->s++; // ")"

    }

    

         if( strmatch(next, "sinh"  ) ) d= sinh(d);

    else if( strmatch(next, "cosh"  ) ) d= cosh(d);

    else if( strmatch(next, "tanh"  ) ) d= tanh(d);

    else if( strmatch(next, "sin"   ) ) d= sin(d);

    else if( strmatch(next, "cos"   ) ) d= cos(d);

    else if( strmatch(next, "tan"   ) ) d= tan(d);

    else if( strmatch(next, "exp"   ) ) d= exp(d);

    else if( strmatch(next, "log"   ) ) d= log(d);

    else if( strmatch(next, "squish") ) d= 1/(1+exp(4*d));

    else if( strmatch(next, "gauss" ) ) d= exp(-d*d/2)/sqrt(2*M_PI);

    else if( strmatch(next, "abs"   ) ) d= fabs(d);

    else if( strmatch(next, "max"   ) ) d= d > d2 ? d : d2;

    else if( strmatch(next, "min"   ) ) d= d < d2 ? d : d2;

    else if( strmatch(next, "gt"    ) ) d= d > d2 ? 1.0 : 0.0;

    else if( strmatch(next, "lt"    ) ) d= d > d2 ? 0.0 : 1.0;

    else if( strmatch(next, "eq"    ) ) d= d == d2 ? 1.0 : 0.0;

//    else if( strmatch(next, "l1"    ) ) d= 1 + d2*(d - 1);

//    else if( strmatch(next, "sq01"  ) ) d= (d >= 0.0 && d <=1.0) ? 1.0 : 0.0;

    else{

        int error=1;

        for(i=0; p->func1_name && p->func1_name[i]; i++){

            if(strmatch(next, p->func1_name[i])){

                d= p->func1[i](p->opaque, d);

                error=0;

                break;

            }

        }



        for(i=0; p->func2_name && p->func2_name[i]; i++){

            if(strmatch(next, p->func2_name[i])){

                d= p->func2[i](p->opaque, d, d2);

                error=0;

                break;

            }

        }



        if(error){

            av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", next);

            return;

        }

    }

    

    if(p->s[-1]!= ')'){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", next);

        return;

    }

    push(p, d);

}      

static void evalPrimary(Parser *p){

    double d, d2=NAN;

    char *next= p->s;

    int i;



    

    d= strtod(p->s, &next);

    if(next != p->s){

        push(p, d);

        p->s= next;

        return;

    }

    

    

    for(i=0; p->const_name[i]; i++){

        if(strmatch(p->s, p->const_name[i])){

            push(p, p->const_value[i]);

            p->s+= strlen(p->const_name[i]);

            return;

        }

    }

    

    p->s= strchr(p->s, '(');

    if(p->s==NULL){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ( in \"%s\"\n", next);

        return;

    }

    p->s++; 

    evalExpression(p);

    d= pop(p);

    p->s++; 

    if(p->s[-1]== ','){

        evalExpression(p);

        d2= pop(p);

        p->s++; 

    }

    

         if( strmatch(next, "sinh"  ) ) d= sinh(d);

    else if( strmatch(next, "cosh"  ) ) d= cosh(d);

    else if( strmatch(next, "tanh"  ) ) d= tanh(d);

    else if( strmatch(next, "sin"   ) ) d= sin(d);

    else if( strmatch(next, "cos"   ) ) d= cos(d);

    else if( strmatch(next, "tan"   ) ) d= tan(d);

    else if( strmatch(next, "exp"   ) ) d= exp(d);

    else if( strmatch(next, "log"   ) ) d= log(d);

    else if( strmatch(next, "squish") ) d= 1/(1+exp(4*d));

    else if( strmatch(next, "gauss" ) ) d= exp(-d*d/2)/sqrt(2*M_PI);

    else if( strmatch(next, "abs"   ) ) d= fabs(d);

    else if( strmatch(next, "max"   ) ) d= d > d2 ? d : d2;

    else if( strmatch(next, "min"   ) ) d= d < d2 ? d : d2;

    else if( strmatch(next, "gt"    ) ) d= d > d2 ? 1.0 : 0.0;

    else if( strmatch(next, "lt"    ) ) d= d > d2 ? 0.0 : 1.0;

    else if( strmatch(next, "eq"    ) ) d= d == d2 ? 1.0 : 0.0;





    else{

        int error=1;

        for(i=0; p->func1_name && p->func1_name[i]; i++){

            if(strmatch(next, p->func1_name[i])){

                d= p->func1[i](p->opaque, d);

                error=0;

                break;

            }

        }



        for(i=0; p->func2_name && p->func2_name[i]; i++){

            if(strmatch(next, p->func2_name[i])){

                d= p->func2[i](p->opaque, d, d2);

                error=0;

                break;

            }

        }



        if(error){

            av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", next);

            return;

        }

    }

    

    if(p->s[-1]!= ')'){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", next);

        return;

    }

    push(p, d);

}      

static void FUNC_0(Parser *VAR_0){

    double VAR_1, VAR_2=NAN;

    char *VAR_3= VAR_0->s;

    int VAR_4;



    

    VAR_1= strtod(VAR_0->s, &VAR_3);

    if(VAR_3 != VAR_0->s){

        push(VAR_0, VAR_1);

        VAR_0->s= VAR_3;

        return;

    }

    

    

    for(VAR_4=0; VAR_0->const_name[VAR_4]; VAR_4++){

        if(strmatch(VAR_0->s, VAR_0->const_name[VAR_4])){

            push(VAR_0, VAR_0->const_value[VAR_4]);

            VAR_0->s+= strlen(VAR_0->const_name[VAR_4]);

            return;

        }

    }

    

    VAR_0->s= strchr(VAR_0->s, '(');

    if(VAR_0->s==NULL){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ( in \"%s\"\n", VAR_3);

        return;

    }

    VAR_0->s++; 

    evalExpression(VAR_0);

    VAR_1= pop(VAR_0);

    VAR_0->s++; 

    if(VAR_0->s[-1]== ','){

        evalExpression(VAR_0);

        VAR_2= pop(VAR_0);

        VAR_0->s++; 

    }

    

         if( strmatch(VAR_3, "sinh"  ) ) VAR_1= sinh(VAR_1);

    else if( strmatch(VAR_3, "cosh"  ) ) VAR_1= cosh(VAR_1);

    else if( strmatch(VAR_3, "tanh"  ) ) VAR_1= tanh(VAR_1);

    else if( strmatch(VAR_3, "sin"   ) ) VAR_1= sin(VAR_1);

    else if( strmatch(VAR_3, "cos"   ) ) VAR_1= cos(VAR_1);

    else if( strmatch(VAR_3, "tan"   ) ) VAR_1= tan(VAR_1);

    else if( strmatch(VAR_3, "exp"   ) ) VAR_1= exp(VAR_1);

    else if( strmatch(VAR_3, "log"   ) ) VAR_1= log(VAR_1);

    else if( strmatch(VAR_3, "squish") ) VAR_1= 1/(1+exp(4*VAR_1));

    else if( strmatch(VAR_3, "gauss" ) ) VAR_1= exp(-VAR_1*VAR_1/2)/sqrt(2*M_PI);

    else if( strmatch(VAR_3, "abs"   ) ) VAR_1= fabs(VAR_1);

    else if( strmatch(VAR_3, "max"   ) ) VAR_1= VAR_1 > VAR_2 ? VAR_1 : VAR_2;

    else if( strmatch(VAR_3, "min"   ) ) VAR_1= VAR_1 < VAR_2 ? VAR_1 : VAR_2;

    else if( strmatch(VAR_3, "gt"    ) ) VAR_1= VAR_1 > VAR_2 ? 1.0 : 0.0;

    else if( strmatch(VAR_3, "lt"    ) ) VAR_1= VAR_1 > VAR_2 ? 0.0 : 1.0;

    else if( strmatch(VAR_3, "eq"    ) ) VAR_1= VAR_1 == VAR_2 ? 1.0 : 0.0;





    else{

        int VAR_5=1;

        for(VAR_4=0; VAR_0->func1_name && VAR_0->func1_name[VAR_4]; VAR_4++){

            if(strmatch(VAR_3, VAR_0->func1_name[VAR_4])){

                VAR_1= VAR_0->func1[VAR_4](VAR_0->opaque, VAR_1);

                VAR_5=0;

                break;

            }

        }



        for(VAR_4=0; VAR_0->func2_name && VAR_0->func2_name[VAR_4]; VAR_4++){

            if(strmatch(VAR_3, VAR_0->func2_name[VAR_4])){

                VAR_1= VAR_0->func2[VAR_4](VAR_0->opaque, VAR_1, VAR_2);

                VAR_5=0;

                break;

            }

        }



        if(VAR_5){

            av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", VAR_3);

            return;

        }

    }

    

    if(VAR_0->s[-1]!= ')'){

        av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", VAR_3);

        return;

    }

    push(VAR_0, VAR_1);

}      

static void FUNC_0(Parser *VAR_0){ double VAR_1, VAR_2=NAN; char *VAR_3= VAR_0->s; int VAR_4; VAR_1= strtod(VAR_0->s, &VAR_3); if(VAR_3 != VAR_0->s){ push(VAR_0, VAR_1); VAR_0->s= VAR_3; return; } for(VAR_4=0; VAR_0->const_name[VAR_4]; VAR_4++){ if(strmatch(VAR_0->s, VAR_0->const_name[VAR_4])){ push(VAR_0, VAR_0->const_value[VAR_4]); VAR_0->s+= strlen(VAR_0->const_name[VAR_4]); return; } } VAR_0->s= strchr(VAR_0->s, '('); if(VAR_0->s==NULL){ av_log(NULL, AV_LOG_ERROR, "Parser: missing ( in \"%s\"\n", VAR_3); return; } VAR_0->s++; evalExpression(VAR_0); VAR_1= pop(VAR_0); VAR_0->s++; if(VAR_0->s[-1]== ','){ evalExpression(VAR_0); VAR_2= pop(VAR_0); VAR_0->s++; } if( strmatch(VAR_3, "sinh"  ) ) VAR_1= sinh(VAR_1); else if( strmatch(VAR_3, "cosh"  ) ) VAR_1= cosh(VAR_1); else if( strmatch(VAR_3, "tanh"  ) ) VAR_1= tanh(VAR_1); else if( strmatch(VAR_3, "sin"   ) ) VAR_1= sin(VAR_1); else if( strmatch(VAR_3, "cos"   ) ) VAR_1= cos(VAR_1); else if( strmatch(VAR_3, "tan"   ) ) VAR_1= tan(VAR_1); else if( strmatch(VAR_3, "exp"   ) ) VAR_1= exp(VAR_1); else if( strmatch(VAR_3, "log"   ) ) VAR_1= log(VAR_1); else if( strmatch(VAR_3, "squish") ) VAR_1= 1/(1+exp(4*VAR_1)); else if( strmatch(VAR_3, "gauss" ) ) VAR_1= exp(-VAR_1*VAR_1/2)/sqrt(2*M_PI); else if( strmatch(VAR_3, "abs"   ) ) VAR_1= fabs(VAR_1); else if( strmatch(VAR_3, "max"   ) ) VAR_1= VAR_1 > VAR_2 ? VAR_1 : VAR_2; else if( strmatch(VAR_3, "min"   ) ) VAR_1= VAR_1 < VAR_2 ? VAR_1 : VAR_2; else if( strmatch(VAR_3, "gt"    ) ) VAR_1= VAR_1 > VAR_2 ? 1.0 : 0.0; else if( strmatch(VAR_3, "lt"    ) ) VAR_1= VAR_1 > VAR_2 ? 0.0 : 1.0; else if( strmatch(VAR_3, "eq"    ) ) VAR_1= VAR_1 == VAR_2 ? 1.0 : 0.0; else{ int VAR_5=1; for(VAR_4=0; VAR_0->func1_name && VAR_0->func1_name[VAR_4]; VAR_4++){ if(strmatch(VAR_3, VAR_0->func1_name[VAR_4])){ VAR_1= VAR_0->func1[VAR_4](VAR_0->opaque, VAR_1); VAR_5=0; break; } } for(VAR_4=0; VAR_0->func2_name && VAR_0->func2_name[VAR_4]; VAR_4++){ if(strmatch(VAR_3, VAR_0->func2_name[VAR_4])){ VAR_1= VAR_0->func2[VAR_4](VAR_0->opaque, VAR_1, VAR_2); VAR_5=0; break; } } if(VAR_5){ av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", VAR_3); return; } } if(VAR_0->s[-1]!= ')'){ av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", VAR_3); return; } push(VAR_0, VAR_1); }