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).