eval - evaluate simple arithmetic expressions

**#include <mba/eval.h>**
**struct eval *eval_new(symlook_fn ***symlook***, void *context);**

**void eval_del(void ****eval***);**

**int eval_expression(struct eval ****eval***, const tchar ****expr***, const tchar ****elim***, unsigned long ****result***);**

The

**eval**(3m) module will evaluate simple arithmentic expressions
consisting of integers, symbols for which the provided

**symlook_fn**
returns an integer, and any of the operators

*|&^+-*/()*.Operator

*Precedence*
Operator precedence is roughly the same as the C language.

( ) higher
* /
+ -
^ & | lower

Prefixing integer tokens with minus

*'-'* to indicate a negative value is
currently not supported.

**new**
- The
**eval_new** function creates and returns a new context object for
evaluating expressions. The *symlook* parameter is defined as
follows:

typedef int (*symlook_fn)(const tchar *name, unsigned long *val, void *context);

The

*symlook_fn* function will be called to resolve any non-numeric symbols
and should place the value identified by

*name* into

*val* and
return 0. If the symbol is not found -1 should be returned.

The

**eval_new** function can be used repeatedly to evaluate any number of
expressions before being destroyed with the

**eval_del** function. The

*context* parameter is passed uninterpreted to the

*symlook_fn*
(e.g. a map perhaps).

**del**
- The
**eval_del** function deletes the context object *eval*
freeing any memory allocated with *eval_new* or during the evaluation
of expressions.

**eval_expression**
- The
**eval_expression** function evaluates an infix expression like
*'(5 + 3) * N'*, converts it into a stack of tokens in postfix
orientation, and reduces it with a simple translation matrix to produce a
single integer value. The *eval* parameter is a context object
created with *eval_new*. The expression at *expr* is evaluated
up to, but not including, the memory at *elim*, and writes the
resulting value in the memory at *result*.

**eval_expression**
- The
**eval_expression** function returns 0 if the expression was
successfully reduced or -1 if an error occured in which case *errno*
will be set appropriately (e.g. *ENOENT* if the *symlook_fn*
could not resolve a symbol).