This is a expression calculation function.
I have some problems about this function.
I cannot understand it well. please help me.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

typedef enum Ops
{
None,
Plus,
Minus,
Multiply,
Divide,
Power
} OPS;

long signif[] =
{
0,
10,
10,
11,
11,
12
};


long double Evaluate(long start, long stop, char* expr)
{
OPS op_found;
OPS op_last = None;
unsigned long op_cursign = 0xFFFFFFFF;
// what is this 0xFFFFFFFF mean ??
long op_pos;
long parnest, parpair;
long curpos;
int nonwhite;

/* Remove enclosing whitespaces paranthesis */
while(1)
{


//Remove enclosing parathesis
parnest = 0;
parpair = 0;
for(curpos = start; curpos <= stop; curpos++)
{
if(expr[curpos] == '(')
{
parnest++;
} else if(expr[curpos] == ')')
{
parnest--;
if(parnest == 0) parpair++;
}
}

if(expr[start] == '(' && expr[stop] == ')' && parpair == 1)
{
start++;
stop--;
} else break; //Break if there are no more paranthesis
}

//Search for operators
nonwhite = 0;
parnest = 0;
op_cursign = 0xFFFFFFFF;
op_last = None;
for(curpos = start; curpos <= stop; curpos++)
{
if(parnest == 0) // Are we in paranthesis
{
op_found = None;
if(nonwhite)
{
switch(expr[curpos])
{
case '+':
op_found = Plus;
break;
case '-':
op_found = Minus;
break;
case '*':
op_found = Multiply;
break;
case '/':
op_found = Divide;
break;
case '^':
op_found = Power;
break;
}
} else // why a else statements is needed
{
switch(expr[curpos])
{
//Interpret the operators as white spaces
case '+':
case '-':
case '*':
case '/':
case '^':
// what this switch statement mean?
case ' ':
case '\t':
case '\n':
case '\r':
break; //Ignore white spaces
default:
nonwhite = 1;
}
}

if(op_found != None)
{
nonwhite = 0;
if(signif[op_found] <= op_cursign)
{
op_cursign = signif[op_found];
op_last = op_found;
op_pos = curpos;
}
}
}

if(expr[
curpos] == '(')
{
parnest++;
} else if(expr[curpos] == ')')
{
parnest--;
}
}

if(parnest != 0)
{
printf("\nError: Parenthesis nesting error!\n");
return 0;
}

//Did we find any operators?
if(op_last != None)
{
long double a, b;

a = Evaluate(start, op_pos - 1, expr); // why assign a to this
b = Evaluate(op_pos + 1, stop, expr); // why assign b to this

switch(op_last)
{
case Plus:
return a+b;

case Minus:
return a-b;

case Multiply:
return a*b;

case Divide:
return a/b;

case Power:
return pow(a, b);
}
return 1;
}


return atof(&expr[start]);
}




The code i cannot understand is written down as comments,
if you understand this function well, please help me.