dos2unix
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6242 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
797d7c5701
commit
89ecc93992
|
@ -1,161 +1,161 @@
|
|||
/* A conio implementation for Mingw/Dev-C++.
|
||||
*
|
||||
* Written by:
|
||||
* Hongli Lai <hongli@telekabel.nl>
|
||||
* tkorrovi <tkorrovi@altavista.net> on 2002/02/26.
|
||||
* Andrew Westcott <ajwestco@users.sourceforge.net>
|
||||
*
|
||||
* Offered for use in the public domain without any warranty.
|
||||
*/
|
||||
|
||||
#ifndef _CONIO_H_
|
||||
#define _CONIO_H_
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define BLINK 0
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BLACK,
|
||||
BLUE,
|
||||
GREEN,
|
||||
CYAN,
|
||||
RED,
|
||||
MAGENTA,
|
||||
BROWN,
|
||||
LIGHTGRAY,
|
||||
DARKGRAY,
|
||||
LIGHTBLUE,
|
||||
LIGHTGREEN,
|
||||
LIGHTCYAN,
|
||||
LIGHTRED,
|
||||
LIGHTMAGENTA,
|
||||
YELLOW,
|
||||
WHITE
|
||||
} COLORS;
|
||||
|
||||
|
||||
#define cgets _cgets
|
||||
#define cprintf _cprintf
|
||||
#define cputs _cputs
|
||||
#define cscanf _cscanf
|
||||
#define ScreenClear clrscr
|
||||
|
||||
/* blinkvideo */
|
||||
|
||||
void clreol (void);
|
||||
void clrscr (void);
|
||||
|
||||
int _conio_gettext (int left, int top, int right, int bottom,
|
||||
char *str);
|
||||
/* _conio_kbhit */
|
||||
|
||||
void delline (void);
|
||||
|
||||
/* gettextinfo */
|
||||
void gotoxy(int x, int y);
|
||||
/*
|
||||
highvideo
|
||||
insline
|
||||
intensevideo
|
||||
lowvideo
|
||||
movetext
|
||||
normvideo
|
||||
*/
|
||||
|
||||
void gotoxy(int x, int y);
|
||||
|
||||
void puttext (int left, int top, int right, int bottom, char *str);
|
||||
|
||||
// Screen Variables
|
||||
|
||||
/* ScreenCols
|
||||
ScreenGetChar
|
||||
ScreenGetCursor
|
||||
ScreenMode
|
||||
ScreenPutChar
|
||||
ScreenPutString
|
||||
ScreenRetrieve
|
||||
ScreenRows
|
||||
ScreenSetCursor
|
||||
ScreenUpdate
|
||||
ScreenUpdateLine
|
||||
ScreenVisualBell
|
||||
_set_screen_lines */
|
||||
|
||||
void _setcursortype (int type);
|
||||
|
||||
void textattr (int _attr);
|
||||
|
||||
void textbackground (int color);
|
||||
|
||||
void textcolor (int color);
|
||||
|
||||
/* textmode */
|
||||
|
||||
int wherex (void);
|
||||
|
||||
int wherey (void);
|
||||
|
||||
/* window */
|
||||
|
||||
|
||||
|
||||
/* The code below was part of Mingw's conio.h */
|
||||
/*
|
||||
* conio.h
|
||||
*
|
||||
* Low level console I/O functions. Pretty please try to use the ANSI
|
||||
* standard ones if you are writing new code.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.4 $
|
||||
* $Author: hongli $
|
||||
* $Date: 2002/04/26 19:31:25 $
|
||||
*
|
||||
*/
|
||||
|
||||
char* _cgets (char*);
|
||||
int _cprintf (const char*, ...);
|
||||
int _cputs (const char*);
|
||||
int _cscanf (char*, ...);
|
||||
|
||||
int _getch (void);
|
||||
int _getche (void);
|
||||
int _kbhit (void);
|
||||
int _putch (int);
|
||||
int _ungetch (int);
|
||||
|
||||
|
||||
int getch (void);
|
||||
int getche (void);
|
||||
int kbhit (void);
|
||||
int putch (int);
|
||||
int ungetch (int);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CONIO_H_ */
|
||||
/* A conio implementation for Mingw/Dev-C++.
|
||||
*
|
||||
* Written by:
|
||||
* Hongli Lai <hongli@telekabel.nl>
|
||||
* tkorrovi <tkorrovi@altavista.net> on 2002/02/26.
|
||||
* Andrew Westcott <ajwestco@users.sourceforge.net>
|
||||
*
|
||||
* Offered for use in the public domain without any warranty.
|
||||
*/
|
||||
|
||||
#ifndef _CONIO_H_
|
||||
#define _CONIO_H_
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define BLINK 0
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BLACK,
|
||||
BLUE,
|
||||
GREEN,
|
||||
CYAN,
|
||||
RED,
|
||||
MAGENTA,
|
||||
BROWN,
|
||||
LIGHTGRAY,
|
||||
DARKGRAY,
|
||||
LIGHTBLUE,
|
||||
LIGHTGREEN,
|
||||
LIGHTCYAN,
|
||||
LIGHTRED,
|
||||
LIGHTMAGENTA,
|
||||
YELLOW,
|
||||
WHITE
|
||||
} COLORS;
|
||||
|
||||
|
||||
#define cgets _cgets
|
||||
#define cprintf _cprintf
|
||||
#define cputs _cputs
|
||||
#define cscanf _cscanf
|
||||
#define ScreenClear clrscr
|
||||
|
||||
/* blinkvideo */
|
||||
|
||||
void clreol (void);
|
||||
void clrscr (void);
|
||||
|
||||
int _conio_gettext (int left, int top, int right, int bottom,
|
||||
char *str);
|
||||
/* _conio_kbhit */
|
||||
|
||||
void delline (void);
|
||||
|
||||
/* gettextinfo */
|
||||
void gotoxy(int x, int y);
|
||||
/*
|
||||
highvideo
|
||||
insline
|
||||
intensevideo
|
||||
lowvideo
|
||||
movetext
|
||||
normvideo
|
||||
*/
|
||||
|
||||
void gotoxy(int x, int y);
|
||||
|
||||
void puttext (int left, int top, int right, int bottom, char *str);
|
||||
|
||||
// Screen Variables
|
||||
|
||||
/* ScreenCols
|
||||
ScreenGetChar
|
||||
ScreenGetCursor
|
||||
ScreenMode
|
||||
ScreenPutChar
|
||||
ScreenPutString
|
||||
ScreenRetrieve
|
||||
ScreenRows
|
||||
ScreenSetCursor
|
||||
ScreenUpdate
|
||||
ScreenUpdateLine
|
||||
ScreenVisualBell
|
||||
_set_screen_lines */
|
||||
|
||||
void _setcursortype (int type);
|
||||
|
||||
void textattr (int _attr);
|
||||
|
||||
void textbackground (int color);
|
||||
|
||||
void textcolor (int color);
|
||||
|
||||
/* textmode */
|
||||
|
||||
int wherex (void);
|
||||
|
||||
int wherey (void);
|
||||
|
||||
/* window */
|
||||
|
||||
|
||||
|
||||
/* The code below was part of Mingw's conio.h */
|
||||
/*
|
||||
* conio.h
|
||||
*
|
||||
* Low level console I/O functions. Pretty please try to use the ANSI
|
||||
* standard ones if you are writing new code.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.4 $
|
||||
* $Author: hongli $
|
||||
* $Date: 2002/04/26 19:31:25 $
|
||||
*
|
||||
*/
|
||||
|
||||
char* _cgets (char*);
|
||||
int _cprintf (const char*, ...);
|
||||
int _cputs (const char*);
|
||||
int _cscanf (char*, ...);
|
||||
|
||||
int _getch (void);
|
||||
int _getche (void);
|
||||
int _kbhit (void);
|
||||
int _putch (int);
|
||||
int _ungetch (int);
|
||||
|
||||
|
||||
int getch (void);
|
||||
int getche (void);
|
||||
int kbhit (void);
|
||||
int putch (int);
|
||||
int ungetch (int);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CONIO_H_ */
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
/*
|
||||
File: exprconf.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, October 20, 2005
|
||||
Desc: Configuration for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRCONF_H
|
||||
#define __BAVII_EXPRCONF_H
|
||||
|
||||
/*
|
||||
Error checking level
|
||||
|
||||
0: Don't check any errors (don't use errno). Divide by 0
|
||||
is avoided and the part that divides by 0 is 0. For example
|
||||
'4+1/0' is 4.
|
||||
|
||||
1: Check math errors.
|
||||
*/
|
||||
#define EXPR_ERROR_LEVEL_NONE 0
|
||||
#define EXPR_ERROR_LEVEL_CHECK 1
|
||||
|
||||
#ifndef EXPR_ERROR_LEVEL
|
||||
#define EXPR_ERROR_LEVEL EXPR_ERROR_LEVEL_CHECK
|
||||
#endif
|
||||
|
||||
#endif /* __BAVII_EXPRCONF_H */
|
||||
/*
|
||||
File: exprconf.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, October 20, 2005
|
||||
Desc: Configuration for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRCONF_H
|
||||
#define __BAVII_EXPRCONF_H
|
||||
|
||||
/*
|
||||
Error checking level
|
||||
|
||||
0: Don't check any errors (don't use errno). Divide by 0
|
||||
is avoided and the part that divides by 0 is 0. For example
|
||||
'4+1/0' is 4.
|
||||
|
||||
1: Check math errors.
|
||||
*/
|
||||
#define EXPR_ERROR_LEVEL_NONE 0
|
||||
#define EXPR_ERROR_LEVEL_CHECK 1
|
||||
|
||||
#ifndef EXPR_ERROR_LEVEL
|
||||
#define EXPR_ERROR_LEVEL EXPR_ERROR_LEVEL_CHECK
|
||||
#endif
|
||||
|
||||
#endif /* __BAVII_EXPRCONF_H */
|
||||
|
|
|
@ -1,268 +1,268 @@
|
|||
/*
|
||||
File: expreval.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Evaluation routines for the ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
/* Defines for error checking */
|
||||
#include <errno.h>
|
||||
|
||||
#if(EXPR_ERROR_LEVEL >= EXPR_ERROR_LEVEL_CHECK)
|
||||
#define EXPR_RESET_ERR() errno = 0
|
||||
#define EXPR_CHECK_ERR() if(errno) return EXPR_ERROR_OUTOFRANGE
|
||||
#else
|
||||
#define EXPR_RESET_ERR()
|
||||
#define EXPR_CHECK_ERR()
|
||||
#endif
|
||||
|
||||
|
||||
/* This routine will evaluate an expression */
|
||||
int exprEval(exprObj *obj, EXPRTYPE *val)
|
||||
{
|
||||
EXPRTYPE dummy;
|
||||
|
||||
if(val == NULL)
|
||||
val = &dummy;
|
||||
|
||||
/* Make sure it was parsed successfully */
|
||||
if(!obj->parsedbad && obj->parsedgood && obj->headnode)
|
||||
{
|
||||
/* Do NOT reset the break count. Let is accumulate
|
||||
between calls until breaker function is called */
|
||||
return exprEvalNode(obj, obj->headnode, 0, val);
|
||||
}
|
||||
else
|
||||
return EXPR_ERROR_BADEXPR;
|
||||
}
|
||||
|
||||
/* Evaluate a node */
|
||||
int exprEvalNode(exprObj *obj, exprNode *nodes, int curnode, EXPRTYPE *val)
|
||||
{
|
||||
int err;
|
||||
int pos;
|
||||
EXPRTYPE d1, d2;
|
||||
|
||||
if(obj == NULL || nodes == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Update n to point to correct node */
|
||||
nodes += curnode;
|
||||
|
||||
/* Check breaker count */
|
||||
if(obj->breakcur-- <= 0)
|
||||
{
|
||||
/* Reset count before returning */
|
||||
obj->breakcur = obj->breakcount;
|
||||
|
||||
if(exprGetBreakResult(obj))
|
||||
{
|
||||
return EXPR_ERROR_BREAK;
|
||||
}
|
||||
}
|
||||
|
||||
switch(nodes->type)
|
||||
{
|
||||
case EXPR_NODETYPE_MULTI:
|
||||
{
|
||||
/* Multi for multiple expressions in one string */
|
||||
for(pos = 0; pos < nodes->data.oper.nodecount; pos++)
|
||||
{
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, pos, val);
|
||||
if(err)
|
||||
return err;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_ADD:
|
||||
{
|
||||
/* Addition */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 + d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_SUBTRACT:
|
||||
{
|
||||
/* Subtraction */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 - d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_MULTIPLY:
|
||||
{
|
||||
/* Multiplication */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 * d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_DIVIDE:
|
||||
{
|
||||
/* Division */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
if(d2 != 0.0)
|
||||
*val = d1 / d2;
|
||||
else
|
||||
{
|
||||
#if(EXPR_ERROR_LEVEL >= EXPR_ERROR_LEVEL_CHECK)
|
||||
return EXPR_ERROR_DIVBYZERO;
|
||||
#else
|
||||
*val = 0.0;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_EXPONENT:
|
||||
{
|
||||
/* Exponent */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
EXPR_RESET_ERR();
|
||||
*val = pow(d1, d2);
|
||||
EXPR_CHECK_ERR();
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_NEGATE:
|
||||
{
|
||||
/* Negative value */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
*val = -d1;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case EXPR_NODETYPE_VALUE:
|
||||
{
|
||||
/* Directly access the value */
|
||||
*val = nodes->data.value.value;
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_VARIABLE:
|
||||
{
|
||||
/* Directly access the variable or constant */
|
||||
*val = *(nodes->data.variable.vaddr);
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_ASSIGN:
|
||||
{
|
||||
/* Evaluate assignment subnode */
|
||||
err = exprEvalNode(obj, nodes->data.assign.node, 0, val);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
/* Directly assign the variable */
|
||||
*(nodes->data.assign.vaddr) = *val;
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_FUNCTION:
|
||||
{
|
||||
/* Evaluate the function */
|
||||
if(nodes->data.function.fptr == NULL)
|
||||
{
|
||||
/* No function pointer means we are not using
|
||||
function solvers. See if the function has a
|
||||
type to solve directly. */
|
||||
switch(nodes->data.function.type)
|
||||
{
|
||||
/* This is to keep the file from being too crowded.
|
||||
See exprilfs.h for the definitions. */
|
||||
#include "exprilfs.h"
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
return EXPR_ERROR_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the correct function */
|
||||
return (*(nodes->data.function.fptr))(obj,
|
||||
nodes->data.function.nodes, nodes->data.function.nodecount,
|
||||
nodes->data.function.refs, nodes->data.function.refcount, val);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
/* Unknown node type */
|
||||
return EXPR_ERROR_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
File: expreval.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Evaluation routines for the ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
/* Defines for error checking */
|
||||
#include <errno.h>
|
||||
|
||||
#if(EXPR_ERROR_LEVEL >= EXPR_ERROR_LEVEL_CHECK)
|
||||
#define EXPR_RESET_ERR() errno = 0
|
||||
#define EXPR_CHECK_ERR() if(errno) return EXPR_ERROR_OUTOFRANGE
|
||||
#else
|
||||
#define EXPR_RESET_ERR()
|
||||
#define EXPR_CHECK_ERR()
|
||||
#endif
|
||||
|
||||
|
||||
/* This routine will evaluate an expression */
|
||||
int exprEval(exprObj *obj, EXPRTYPE *val)
|
||||
{
|
||||
EXPRTYPE dummy;
|
||||
|
||||
if(val == NULL)
|
||||
val = &dummy;
|
||||
|
||||
/* Make sure it was parsed successfully */
|
||||
if(!obj->parsedbad && obj->parsedgood && obj->headnode)
|
||||
{
|
||||
/* Do NOT reset the break count. Let is accumulate
|
||||
between calls until breaker function is called */
|
||||
return exprEvalNode(obj, obj->headnode, 0, val);
|
||||
}
|
||||
else
|
||||
return EXPR_ERROR_BADEXPR;
|
||||
}
|
||||
|
||||
/* Evaluate a node */
|
||||
int exprEvalNode(exprObj *obj, exprNode *nodes, int curnode, EXPRTYPE *val)
|
||||
{
|
||||
int err;
|
||||
int pos;
|
||||
EXPRTYPE d1, d2;
|
||||
|
||||
if(obj == NULL || nodes == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Update n to point to correct node */
|
||||
nodes += curnode;
|
||||
|
||||
/* Check breaker count */
|
||||
if(obj->breakcur-- <= 0)
|
||||
{
|
||||
/* Reset count before returning */
|
||||
obj->breakcur = obj->breakcount;
|
||||
|
||||
if(exprGetBreakResult(obj))
|
||||
{
|
||||
return EXPR_ERROR_BREAK;
|
||||
}
|
||||
}
|
||||
|
||||
switch(nodes->type)
|
||||
{
|
||||
case EXPR_NODETYPE_MULTI:
|
||||
{
|
||||
/* Multi for multiple expressions in one string */
|
||||
for(pos = 0; pos < nodes->data.oper.nodecount; pos++)
|
||||
{
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, pos, val);
|
||||
if(err)
|
||||
return err;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_ADD:
|
||||
{
|
||||
/* Addition */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 + d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_SUBTRACT:
|
||||
{
|
||||
/* Subtraction */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 - d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_MULTIPLY:
|
||||
{
|
||||
/* Multiplication */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
*val = d1 * d2;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_DIVIDE:
|
||||
{
|
||||
/* Division */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
if(d2 != 0.0)
|
||||
*val = d1 / d2;
|
||||
else
|
||||
{
|
||||
#if(EXPR_ERROR_LEVEL >= EXPR_ERROR_LEVEL_CHECK)
|
||||
return EXPR_ERROR_DIVBYZERO;
|
||||
#else
|
||||
*val = 0.0;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_EXPONENT:
|
||||
{
|
||||
/* Exponent */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 1, &d2);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
EXPR_RESET_ERR();
|
||||
*val = pow(d1, d2);
|
||||
EXPR_CHECK_ERR();
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_NEGATE:
|
||||
{
|
||||
/* Negative value */
|
||||
err = exprEvalNode(obj, nodes->data.oper.nodes, 0, &d1);
|
||||
|
||||
if(!err)
|
||||
*val = -d1;
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case EXPR_NODETYPE_VALUE:
|
||||
{
|
||||
/* Directly access the value */
|
||||
*val = nodes->data.value.value;
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_VARIABLE:
|
||||
{
|
||||
/* Directly access the variable or constant */
|
||||
*val = *(nodes->data.variable.vaddr);
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_ASSIGN:
|
||||
{
|
||||
/* Evaluate assignment subnode */
|
||||
err = exprEvalNode(obj, nodes->data.assign.node, 0, val);
|
||||
|
||||
if(!err)
|
||||
{
|
||||
/* Directly assign the variable */
|
||||
*(nodes->data.assign.vaddr) = *val;
|
||||
}
|
||||
else
|
||||
return err;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case EXPR_NODETYPE_FUNCTION:
|
||||
{
|
||||
/* Evaluate the function */
|
||||
if(nodes->data.function.fptr == NULL)
|
||||
{
|
||||
/* No function pointer means we are not using
|
||||
function solvers. See if the function has a
|
||||
type to solve directly. */
|
||||
switch(nodes->data.function.type)
|
||||
{
|
||||
/* This is to keep the file from being too crowded.
|
||||
See exprilfs.h for the definitions. */
|
||||
#include "exprilfs.h"
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
return EXPR_ERROR_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the correct function */
|
||||
return (*(nodes->data.function.fptr))(obj,
|
||||
nodes->data.function.nodes, nodes->data.function.nodecount,
|
||||
nodes->data.function.refs, nodes->data.function.refcount, val);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
/* Unknown node type */
|
||||
return EXPR_ERROR_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,127 +1,127 @@
|
|||
/*
|
||||
File: expreval.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Main include file for ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
/* Include once */
|
||||
#ifndef __BAVII_EXPREVAL_H
|
||||
#define __BAVII_EXPREVAL_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Define type of data to use */
|
||||
typedef double EXPRTYPE;
|
||||
|
||||
/* Defines for various things */
|
||||
|
||||
/* Max id size */
|
||||
#define EXPR_MAXIDENTSIZE 255
|
||||
|
||||
/* Error values */
|
||||
enum
|
||||
{
|
||||
EXPR_ERROR_UNKNOWN = -1, /* Unknown error */
|
||||
EXPR_ERROR_NOERROR = 0, /* No Error */
|
||||
EXPR_ERROR_MEMORY, /* Memory allocation failed */
|
||||
EXPR_ERROR_NULLPOINTER, /* Null pointer passed to function */
|
||||
EXPR_ERROR_NOTFOUND, /* Item not found in a list */
|
||||
EXPR_ERROR_UNMATCHEDCOMMENT, /* Unmatched comment tags */
|
||||
EXPR_ERROR_INVALIDCHAR, /* Invalid characters in expression */
|
||||
EXPR_ERROR_ALREADYEXISTS, /* An item already called create */
|
||||
EXPR_ERROR_ALREADYPARSEDBAD, /* Expression parsed already, but unsuccessfully. call free or clear */
|
||||
EXPR_ERROR_ALREADYPARSEDGOOD, /* Expression parsed already, successfully, call free or clear */
|
||||
EXPR_ERROR_EMPTYEXPR, /* Empty expression string passed to parse */
|
||||
EXPR_ERROR_UNMATCHEDPAREN, /* Unmatched parenthesis */
|
||||
EXPR_ERROR_SYNTAX, /* Syntax error in expression */
|
||||
EXPR_ERROR_MISSINGSEMICOLON, /* Missing semicolon at end of expression */
|
||||
EXPR_ERROR_BADIDENTIFIER, /* Identifier was to big or not formed right */
|
||||
EXPR_ERROR_NOSUCHFUNCTION, /* Function does not exist in function list */
|
||||
EXPR_ERROR_BADNUMBERARGUMENTS, /* Bad number of arguments in a function call */
|
||||
EXPR_ERROR_BADEXPR, /* This is a bad expression to evaluate. It has not been parsed or has unsuccessfully */
|
||||
EXPR_ERROR_UNABLETOASSIGN, /* Unable to do an assignment, maybe no variable list */
|
||||
EXPR_ERROR_DIVBYZERO, /* Attempted a division by zero */
|
||||
EXPR_ERROR_NOVARLIST, /* No variable list found but one is needed */
|
||||
EXPR_ERROR_BREAK, /* Expression was broken by break function */
|
||||
EXPR_ERROR_CONSTANTASSIGN, /* Assignment to a constant */
|
||||
EXPR_ERROR_REFCONSTANT, /* Constant used as a reference parameter */
|
||||
EXPR_ERROR_OUTOFRANGE, /* A bad value was passed to a function */
|
||||
|
||||
EXPR_ERROR_USER /* Custom errors should be larger than this */
|
||||
};
|
||||
|
||||
/* Macros */
|
||||
|
||||
/* Forward declarations */
|
||||
typedef struct _exprNode exprNode;
|
||||
typedef struct _exprFuncList exprFuncList;
|
||||
typedef struct _exprValList exprValList;
|
||||
typedef struct _exprObj exprObj;
|
||||
|
||||
/* Function types */
|
||||
typedef int (*exprFuncType)(exprObj *obj, exprNode *nodes, int nodecount, EXPRTYPE **refs, int refcount, EXPRTYPE *val);
|
||||
typedef int (*exprBreakFuncType)(exprObj *obj);
|
||||
|
||||
|
||||
|
||||
/* Functions */
|
||||
|
||||
/* Version information function */
|
||||
void exprGetVersion(int *major, int *minor);
|
||||
|
||||
/* Functions for function lists */
|
||||
int exprFuncListCreate(exprFuncList **flist);
|
||||
int exprFuncListAdd(exprFuncList *flist, char *name, exprFuncType ptr, int min, int max, int refmin, int refmax);
|
||||
int exprFuncListFree(exprFuncList *flist);
|
||||
int exprFuncListClear(exprFuncList *flist);
|
||||
int exprFuncListInit(exprFuncList *flist);
|
||||
|
||||
/* Functions for value lists */
|
||||
int exprValListCreate(exprValList **vlist);
|
||||
int exprValListAdd(exprValList *vlist, char *name, EXPRTYPE val);
|
||||
int exprValListSet(exprValList *vlist, char *name, EXPRTYPE val);
|
||||
int exprValListGet(exprValList *vlist, char *name, EXPRTYPE *val);
|
||||
int exprValListAddAddress(exprValList *vlist, char *name, EXPRTYPE *addr);
|
||||
int exprValListGetAddress(exprValList *vlist, char *name, EXPRTYPE **addr);
|
||||
void *exprValListGetNext(exprValList *vlist, char **name, EXPRTYPE *value, EXPRTYPE** addr, void *cookie);
|
||||
int exprValListFree(exprValList *vlist);
|
||||
int exprValListClear(exprValList *vlist);
|
||||
int exprValListInit(exprValList *vlist);
|
||||
|
||||
/* Functions for expression objects */
|
||||
int exprCreate(exprObj **obj, exprFuncList *flist, exprValList *vlist, exprValList *clist,
|
||||
exprBreakFuncType breaker, void *userdata);
|
||||
int exprFree(exprObj *obj);
|
||||
int exprClear(exprObj *obj);
|
||||
int exprParse(exprObj *obj, char *expr);
|
||||
int exprEval(exprObj *obj, EXPRTYPE *val);
|
||||
int exprEvalNode(exprObj *obj, exprNode *nodes, int curnode, EXPRTYPE *val);
|
||||
exprFuncList *exprGetFuncList(exprObj *obj);
|
||||
exprValList *exprGetVarList(exprObj *obj);
|
||||
exprValList *exprGetConstList(exprObj *obj);
|
||||
exprBreakFuncType exprGetBreakFunc(exprObj *obj);
|
||||
int exprGetBreakResult(exprObj *obj);
|
||||
void* exprGetUserData(exprObj *obj);
|
||||
void exprSetUserData(exprObj *obj, void *userdata);
|
||||
void exprSetBreakCount(exprObj *obj, int count);
|
||||
void exprGetErrorPosition(exprObj *obj, int *start, int *end);
|
||||
|
||||
/* Other useful routines */
|
||||
int exprValidIdent(char *name);
|
||||
|
||||
/* Name mangling */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPREVAL_H */
|
||||
/*
|
||||
File: expreval.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Main include file for ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
/* Include once */
|
||||
#ifndef __BAVII_EXPREVAL_H
|
||||
#define __BAVII_EXPREVAL_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Define type of data to use */
|
||||
typedef double EXPRTYPE;
|
||||
|
||||
/* Defines for various things */
|
||||
|
||||
/* Max id size */
|
||||
#define EXPR_MAXIDENTSIZE 255
|
||||
|
||||
/* Error values */
|
||||
enum
|
||||
{
|
||||
EXPR_ERROR_UNKNOWN = -1, /* Unknown error */
|
||||
EXPR_ERROR_NOERROR = 0, /* No Error */
|
||||
EXPR_ERROR_MEMORY, /* Memory allocation failed */
|
||||
EXPR_ERROR_NULLPOINTER, /* Null pointer passed to function */
|
||||
EXPR_ERROR_NOTFOUND, /* Item not found in a list */
|
||||
EXPR_ERROR_UNMATCHEDCOMMENT, /* Unmatched comment tags */
|
||||
EXPR_ERROR_INVALIDCHAR, /* Invalid characters in expression */
|
||||
EXPR_ERROR_ALREADYEXISTS, /* An item already called create */
|
||||
EXPR_ERROR_ALREADYPARSEDBAD, /* Expression parsed already, but unsuccessfully. call free or clear */
|
||||
EXPR_ERROR_ALREADYPARSEDGOOD, /* Expression parsed already, successfully, call free or clear */
|
||||
EXPR_ERROR_EMPTYEXPR, /* Empty expression string passed to parse */
|
||||
EXPR_ERROR_UNMATCHEDPAREN, /* Unmatched parenthesis */
|
||||
EXPR_ERROR_SYNTAX, /* Syntax error in expression */
|
||||
EXPR_ERROR_MISSINGSEMICOLON, /* Missing semicolon at end of expression */
|
||||
EXPR_ERROR_BADIDENTIFIER, /* Identifier was to big or not formed right */
|
||||
EXPR_ERROR_NOSUCHFUNCTION, /* Function does not exist in function list */
|
||||
EXPR_ERROR_BADNUMBERARGUMENTS, /* Bad number of arguments in a function call */
|
||||
EXPR_ERROR_BADEXPR, /* This is a bad expression to evaluate. It has not been parsed or has unsuccessfully */
|
||||
EXPR_ERROR_UNABLETOASSIGN, /* Unable to do an assignment, maybe no variable list */
|
||||
EXPR_ERROR_DIVBYZERO, /* Attempted a division by zero */
|
||||
EXPR_ERROR_NOVARLIST, /* No variable list found but one is needed */
|
||||
EXPR_ERROR_BREAK, /* Expression was broken by break function */
|
||||
EXPR_ERROR_CONSTANTASSIGN, /* Assignment to a constant */
|
||||
EXPR_ERROR_REFCONSTANT, /* Constant used as a reference parameter */
|
||||
EXPR_ERROR_OUTOFRANGE, /* A bad value was passed to a function */
|
||||
|
||||
EXPR_ERROR_USER /* Custom errors should be larger than this */
|
||||
};
|
||||
|
||||
/* Macros */
|
||||
|
||||
/* Forward declarations */
|
||||
typedef struct _exprNode exprNode;
|
||||
typedef struct _exprFuncList exprFuncList;
|
||||
typedef struct _exprValList exprValList;
|
||||
typedef struct _exprObj exprObj;
|
||||
|
||||
/* Function types */
|
||||
typedef int (*exprFuncType)(exprObj *obj, exprNode *nodes, int nodecount, EXPRTYPE **refs, int refcount, EXPRTYPE *val);
|
||||
typedef int (*exprBreakFuncType)(exprObj *obj);
|
||||
|
||||
|
||||
|
||||
/* Functions */
|
||||
|
||||
/* Version information function */
|
||||
void exprGetVersion(int *major, int *minor);
|
||||
|
||||
/* Functions for function lists */
|
||||
int exprFuncListCreate(exprFuncList **flist);
|
||||
int exprFuncListAdd(exprFuncList *flist, char *name, exprFuncType ptr, int min, int max, int refmin, int refmax);
|
||||
int exprFuncListFree(exprFuncList *flist);
|
||||
int exprFuncListClear(exprFuncList *flist);
|
||||
int exprFuncListInit(exprFuncList *flist);
|
||||
|
||||
/* Functions for value lists */
|
||||
int exprValListCreate(exprValList **vlist);
|
||||
int exprValListAdd(exprValList *vlist, char *name, EXPRTYPE val);
|
||||
int exprValListSet(exprValList *vlist, char *name, EXPRTYPE val);
|
||||
int exprValListGet(exprValList *vlist, char *name, EXPRTYPE *val);
|
||||
int exprValListAddAddress(exprValList *vlist, char *name, EXPRTYPE *addr);
|
||||
int exprValListGetAddress(exprValList *vlist, char *name, EXPRTYPE **addr);
|
||||
void *exprValListGetNext(exprValList *vlist, char **name, EXPRTYPE *value, EXPRTYPE** addr, void *cookie);
|
||||
int exprValListFree(exprValList *vlist);
|
||||
int exprValListClear(exprValList *vlist);
|
||||
int exprValListInit(exprValList *vlist);
|
||||
|
||||
/* Functions for expression objects */
|
||||
int exprCreate(exprObj **obj, exprFuncList *flist, exprValList *vlist, exprValList *clist,
|
||||
exprBreakFuncType breaker, void *userdata);
|
||||
int exprFree(exprObj *obj);
|
||||
int exprClear(exprObj *obj);
|
||||
int exprParse(exprObj *obj, char *expr);
|
||||
int exprEval(exprObj *obj, EXPRTYPE *val);
|
||||
int exprEvalNode(exprObj *obj, exprNode *nodes, int curnode, EXPRTYPE *val);
|
||||
exprFuncList *exprGetFuncList(exprObj *obj);
|
||||
exprValList *exprGetVarList(exprObj *obj);
|
||||
exprValList *exprGetConstList(exprObj *obj);
|
||||
exprBreakFuncType exprGetBreakFunc(exprObj *obj);
|
||||
int exprGetBreakResult(exprObj *obj);
|
||||
void* exprGetUserData(exprObj *obj);
|
||||
void exprSetUserData(exprObj *obj, void *userdata);
|
||||
void exprSetBreakCount(exprObj *obj, int count);
|
||||
void exprGetErrorPosition(exprObj *obj, int *start, int *end);
|
||||
|
||||
/* Other useful routines */
|
||||
int exprValidIdent(char *name);
|
||||
|
||||
/* Name mangling */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPREVAL_H */
|
||||
|
|
|
@ -1,329 +1,329 @@
|
|||
/*
|
||||
File: exprfunc.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Expression function list routines
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Internal functions */
|
||||
static exprFunc *exprCreateFunc(char *name, exprFuncType ptr, int type, int min, int max, int refmin, int refmax);
|
||||
static void exprFuncListFreeData(exprFunc *func);
|
||||
|
||||
|
||||
/* This function creates the function list, */
|
||||
int exprFuncListCreate(exprFuncList **flist)
|
||||
{
|
||||
exprFuncList *tmp;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
*flist = NULL; /* Set to NULL initially */
|
||||
|
||||
tmp = exprAllocMem(sizeof(exprFuncList));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY; /* Could not allocate memory */
|
||||
|
||||
/* Update pointer */
|
||||
*flist = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a function to the list */
|
||||
int exprFuncListAdd(exprFuncList *flist, char *name, exprFuncType ptr, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
/* Fix values only if none are negative (negative values mean no limit) */
|
||||
|
||||
/* if both are neg, no min or max number of args */
|
||||
/* if min is neg, max pos, no min number of args but a maximum */
|
||||
/* if min is pos, max neg, there is a min number of args, but no max */
|
||||
/* if both pos, then a min and max limit. We swap to make sure it works
|
||||
right. I.E. Min of 3 and max of 2 would make function unusable */
|
||||
if(min >= 0 && max >= 0)
|
||||
{
|
||||
if(min > max)
|
||||
{
|
||||
result = min;
|
||||
min = max;
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(refmin >= 0 && refmax >= 0)
|
||||
{
|
||||
if(refmin > refmax)
|
||||
{
|
||||
result = refmin;
|
||||
refmin = max;
|
||||
refmax = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(flist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateFunc(name, ptr, EXPR_NODETYPE_FUNCTION, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* It did not exist, so add it at the head */
|
||||
tmp = exprCreateFunc(name, ptr, EXPR_NODETYPE_FUNCTION, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = flist->head;
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a function node type to the list
|
||||
This works pretty much the same way, except the function
|
||||
pointer is NULL and the node type specifies the function
|
||||
to do. exprEvalNode handles this, instead of calling
|
||||
a function solver. */
|
||||
int exprFuncListAddType(exprFuncList *flist, char *name, int type, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
/* Fix values only if none are negative (negative values mean no limit) */
|
||||
|
||||
/* if both are neg, no min or max number of args */
|
||||
/* if min is neg, max pos, no min number of args but a maximum */
|
||||
/* if min is pos, max neg, there is a min number of args, but no max */
|
||||
/* if both pos, then a min and max limit. We swap to make sure it works
|
||||
right. I.E. Min of 3 and max of 2 would make function unusable */
|
||||
if(min >= 0 && max >= 0)
|
||||
{
|
||||
if(min > max)
|
||||
{
|
||||
result = min;
|
||||
min = max;
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(refmin >= 0 && refmax >= 0)
|
||||
{
|
||||
if(refmin > refmax)
|
||||
{
|
||||
result = refmin;
|
||||
refmin = max;
|
||||
refmax = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(flist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateFunc(name, NULL, type, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* It did not exist, so add it at the head */
|
||||
tmp = exprCreateFunc(name, NULL, type, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = flist->head;
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get the function from a list along with it's min an max data */
|
||||
int exprFuncListGet(exprFuncList *flist, char *name, exprFuncType *ptr, int *type, int *min, int *max, int *refmin, int *refmax)
|
||||
{
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
*ptr = cur->fptr;
|
||||
*min = cur->min;
|
||||
*max = cur->max;
|
||||
*refmin = cur->refmin;
|
||||
*refmax = cur->refmax;
|
||||
*type = cur->type;
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find the item in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* This routine will free the function list */
|
||||
int exprFuncListFree(exprFuncList *flist)
|
||||
{
|
||||
/* Make sure it exists, if not it is not error */
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes */
|
||||
exprFuncListFreeData(flist->head);
|
||||
|
||||
/* Free the container */
|
||||
exprFreeMem(flist);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will clear the function list */
|
||||
int exprFuncListClear(exprFuncList *flist)
|
||||
{
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes only */
|
||||
if(flist->head)
|
||||
{
|
||||
exprFuncListFreeData(flist->head);
|
||||
|
||||
flist->head = NULL;
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will free any child nodes, and then free itself */
|
||||
void exprFuncListFreeData(exprFunc *func)
|
||||
{
|
||||
exprFunc *next;
|
||||
|
||||
while(func)
|
||||
{
|
||||
/* Remember the next item */
|
||||
next = func->next;
|
||||
|
||||
/* Free name */
|
||||
exprFreeMem(func->fname);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(func);
|
||||
|
||||
func = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will create the function object */
|
||||
exprFunc *exprCreateFunc(char *name, exprFuncType ptr, int type, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
char *vtmp;
|
||||
|
||||
/* We already checked the name in exprFuncListAdd */
|
||||
|
||||
/* Create it */
|
||||
tmp = exprAllocMem(sizeof(exprFunc));
|
||||
if(tmp == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Allocate space for the name */
|
||||
vtmp = exprAllocMem(strlen(name) + 1);
|
||||
|
||||
if(vtmp == NULL)
|
||||
{
|
||||
exprFreeMem(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy the data over */
|
||||
strcpy(vtmp, name);
|
||||
tmp->fname = vtmp;
|
||||
tmp->fptr = ptr;
|
||||
tmp->min = min;
|
||||
tmp->max = max;
|
||||
tmp->refmin = refmin;
|
||||
tmp->refmax = refmax;
|
||||
tmp->type = type;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
/*
|
||||
File: exprfunc.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Expression function list routines
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Internal functions */
|
||||
static exprFunc *exprCreateFunc(char *name, exprFuncType ptr, int type, int min, int max, int refmin, int refmax);
|
||||
static void exprFuncListFreeData(exprFunc *func);
|
||||
|
||||
|
||||
/* This function creates the function list, */
|
||||
int exprFuncListCreate(exprFuncList **flist)
|
||||
{
|
||||
exprFuncList *tmp;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
*flist = NULL; /* Set to NULL initially */
|
||||
|
||||
tmp = exprAllocMem(sizeof(exprFuncList));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY; /* Could not allocate memory */
|
||||
|
||||
/* Update pointer */
|
||||
*flist = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a function to the list */
|
||||
int exprFuncListAdd(exprFuncList *flist, char *name, exprFuncType ptr, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
/* Fix values only if none are negative (negative values mean no limit) */
|
||||
|
||||
/* if both are neg, no min or max number of args */
|
||||
/* if min is neg, max pos, no min number of args but a maximum */
|
||||
/* if min is pos, max neg, there is a min number of args, but no max */
|
||||
/* if both pos, then a min and max limit. We swap to make sure it works
|
||||
right. I.E. Min of 3 and max of 2 would make function unusable */
|
||||
if(min >= 0 && max >= 0)
|
||||
{
|
||||
if(min > max)
|
||||
{
|
||||
result = min;
|
||||
min = max;
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(refmin >= 0 && refmax >= 0)
|
||||
{
|
||||
if(refmin > refmax)
|
||||
{
|
||||
result = refmin;
|
||||
refmin = max;
|
||||
refmax = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(flist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateFunc(name, ptr, EXPR_NODETYPE_FUNCTION, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* It did not exist, so add it at the head */
|
||||
tmp = exprCreateFunc(name, ptr, EXPR_NODETYPE_FUNCTION, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = flist->head;
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a function node type to the list
|
||||
This works pretty much the same way, except the function
|
||||
pointer is NULL and the node type specifies the function
|
||||
to do. exprEvalNode handles this, instead of calling
|
||||
a function solver. */
|
||||
int exprFuncListAddType(exprFuncList *flist, char *name, int type, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
/* Fix values only if none are negative (negative values mean no limit) */
|
||||
|
||||
/* if both are neg, no min or max number of args */
|
||||
/* if min is neg, max pos, no min number of args but a maximum */
|
||||
/* if min is pos, max neg, there is a min number of args, but no max */
|
||||
/* if both pos, then a min and max limit. We swap to make sure it works
|
||||
right. I.E. Min of 3 and max of 2 would make function unusable */
|
||||
if(min >= 0 && max >= 0)
|
||||
{
|
||||
if(min > max)
|
||||
{
|
||||
result = min;
|
||||
min = max;
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(refmin >= 0 && refmax >= 0)
|
||||
{
|
||||
if(refmin > refmax)
|
||||
{
|
||||
result = refmin;
|
||||
refmin = max;
|
||||
refmax = result;
|
||||
}
|
||||
}
|
||||
|
||||
if(flist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateFunc(name, NULL, type, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* It did not exist, so add it at the head */
|
||||
tmp = exprCreateFunc(name, NULL, type, min, max, refmin, refmax);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = flist->head;
|
||||
flist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get the function from a list along with it's min an max data */
|
||||
int exprFuncListGet(exprFuncList *flist, char *name, exprFuncType *ptr, int *type, int *min, int *max, int *refmin, int *refmax)
|
||||
{
|
||||
exprFunc *cur;
|
||||
int result;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = flist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->fname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
*ptr = cur->fptr;
|
||||
*min = cur->min;
|
||||
*max = cur->max;
|
||||
*refmin = cur->refmin;
|
||||
*refmax = cur->refmax;
|
||||
*type = cur->type;
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find the item in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* This routine will free the function list */
|
||||
int exprFuncListFree(exprFuncList *flist)
|
||||
{
|
||||
/* Make sure it exists, if not it is not error */
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes */
|
||||
exprFuncListFreeData(flist->head);
|
||||
|
||||
/* Free the container */
|
||||
exprFreeMem(flist);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will clear the function list */
|
||||
int exprFuncListClear(exprFuncList *flist)
|
||||
{
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes only */
|
||||
if(flist->head)
|
||||
{
|
||||
exprFuncListFreeData(flist->head);
|
||||
|
||||
flist->head = NULL;
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will free any child nodes, and then free itself */
|
||||
void exprFuncListFreeData(exprFunc *func)
|
||||
{
|
||||
exprFunc *next;
|
||||
|
||||
while(func)
|
||||
{
|
||||
/* Remember the next item */
|
||||
next = func->next;
|
||||
|
||||
/* Free name */
|
||||
exprFreeMem(func->fname);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(func);
|
||||
|
||||
func = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will create the function object */
|
||||
exprFunc *exprCreateFunc(char *name, exprFuncType ptr, int type, int min, int max, int refmin, int refmax)
|
||||
{
|
||||
exprFunc *tmp;
|
||||
char *vtmp;
|
||||
|
||||
/* We already checked the name in exprFuncListAdd */
|
||||
|
||||
/* Create it */
|
||||
tmp = exprAllocMem(sizeof(exprFunc));
|
||||
if(tmp == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Allocate space for the name */
|
||||
vtmp = exprAllocMem(strlen(name) + 1);
|
||||
|
||||
if(vtmp == NULL)
|
||||
{
|
||||
exprFreeMem(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy the data over */
|
||||
strcpy(vtmp, name);
|
||||
tmp->fname = vtmp;
|
||||
tmp->fptr = ptr;
|
||||
tmp->min = min;
|
||||
tmp->max = max;
|
||||
tmp->refmin = refmin;
|
||||
tmp->refmax = refmax;
|
||||
tmp->type = type;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,112 +1,112 @@
|
|||
/*
|
||||
File: exprincl.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Includes, macros, etc needed by this library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRINCL_H
|
||||
#define __BAVII_EXPRINCL_H
|
||||
|
||||
|
||||
/* Includes and macros and whatnot for building the library */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if (_MSC_VER >= 1400) // VC8+
|
||||
#ifndef _CRT_SECURE_NO_DEPRECATE
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
#ifndef _CRT_NONSTDC_NO_DEPRECATE
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE
|
||||
#endif
|
||||
#endif // VC8+
|
||||
#endif
|
||||
|
||||
/* Memory routines. memory.h for VC++, mem.h for BC++ */
|
||||
#ifdef __TURBOC__
|
||||
#include <mem.h>
|
||||
#else
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
/* Memory allocation */
|
||||
#include <malloc.h>
|
||||
|
||||
/* String routines */
|
||||
#include <string.h>
|
||||
|
||||
/* Character manipulation routines */
|
||||
#include <ctype.h>
|
||||
|
||||
/* Standard routines */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Math routines */
|
||||
#include <math.h>
|
||||
|
||||
/* Time */
|
||||
#include <time.h>
|
||||
|
||||
|
||||
/* Math constants. VC++ does not seem to have these */
|
||||
#ifndef M_E
|
||||
#define M_E 2.7182818284590452354
|
||||
#endif
|
||||
|
||||
#ifndef M_LOG2E
|
||||
#define M_LOG2E 1.4426950408889634074
|
||||
#endif
|
||||
|
||||
#ifndef M_LOG10E
|
||||
#define M_LOG10E 0.43429448190325182765
|
||||
#endif
|
||||
|
||||
#ifndef M_LN2
|
||||
#define M_LN2 0.69314718055994530942
|
||||
#endif
|
||||
|
||||
#ifndef M_LN10
|
||||
#define M_LN10 2.30258509299404568402
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
#ifndef M_PI_2
|
||||
#define M_PI_2 1.57079632679489661923
|
||||
#endif
|
||||
|
||||
#ifndef M_PI_4
|
||||
#define M_PI_4 0.78539816339744830962
|
||||
#endif
|
||||
|
||||
#ifndef M_1_PI
|
||||
#define M_1_PI 0.31830988618379067154
|
||||
#endif
|
||||
|
||||
#ifndef M_2_PI
|
||||
#define M_2_PI 0.63661977236758134308
|
||||
#endif
|
||||
|
||||
#ifndef M_1_SQRTPI
|
||||
#define M_1_SQRTPI 0.56418958354776
|
||||
#endif
|
||||
|
||||
#ifndef M_2_SQRTPI
|
||||
#define M_2_SQRTPI 1.12837916709551257390
|
||||
#endif
|
||||
|
||||
#ifndef M_SQRT2
|
||||
#define M_SQRT2 1.41421356237309504880
|
||||
#endif
|
||||
|
||||
#ifndef M_1_SQRT2
|
||||
#define M_1_SQRT2 0.70710678118654752440
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPRINCL_H */
|
||||
/*
|
||||
File: exprincl.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Includes, macros, etc needed by this library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRINCL_H
|
||||
#define __BAVII_EXPRINCL_H
|
||||
|
||||
|
||||
/* Includes and macros and whatnot for building the library */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if (_MSC_VER >= 1400) // VC8+
|
||||
#ifndef _CRT_SECURE_NO_DEPRECATE
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
#ifndef _CRT_NONSTDC_NO_DEPRECATE
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE
|
||||
#endif
|
||||
#endif // VC8+
|
||||
#endif
|
||||
|
||||
/* Memory routines. memory.h for VC++, mem.h for BC++ */
|
||||
#ifdef __TURBOC__
|
||||
#include <mem.h>
|
||||
#else
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
/* Memory allocation */
|
||||
#include <malloc.h>
|
||||
|
||||
/* String routines */
|
||||
#include <string.h>
|
||||
|
||||
/* Character manipulation routines */
|
||||
#include <ctype.h>
|
||||
|
||||
/* Standard routines */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Math routines */
|
||||
#include <math.h>
|
||||
|
||||
/* Time */
|
||||
#include <time.h>
|
||||
|
||||
|
||||
/* Math constants. VC++ does not seem to have these */
|
||||
#ifndef M_E
|
||||
#define M_E 2.7182818284590452354
|
||||
#endif
|
||||
|
||||
#ifndef M_LOG2E
|
||||
#define M_LOG2E 1.4426950408889634074
|
||||
#endif
|
||||
|
||||
#ifndef M_LOG10E
|
||||
#define M_LOG10E 0.43429448190325182765
|
||||
#endif
|
||||
|
||||
#ifndef M_LN2
|
||||
#define M_LN2 0.69314718055994530942
|
||||
#endif
|
||||
|
||||
#ifndef M_LN10
|
||||
#define M_LN10 2.30258509299404568402
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
#ifndef M_PI_2
|
||||
#define M_PI_2 1.57079632679489661923
|
||||
#endif
|
||||
|
||||
#ifndef M_PI_4
|
||||
#define M_PI_4 0.78539816339744830962
|
||||
#endif
|
||||
|
||||
#ifndef M_1_PI
|
||||
#define M_1_PI 0.31830988618379067154
|
||||
#endif
|
||||
|
||||
#ifndef M_2_PI
|
||||
#define M_2_PI 0.63661977236758134308
|
||||
#endif
|
||||
|
||||
#ifndef M_1_SQRTPI
|
||||
#define M_1_SQRTPI 0.56418958354776
|
||||
#endif
|
||||
|
||||
#ifndef M_2_SQRTPI
|
||||
#define M_2_SQRTPI 1.12837916709551257390
|
||||
#endif
|
||||
|
||||
#ifndef M_SQRT2
|
||||
#define M_SQRT2 1.41421356237309504880
|
||||
#endif
|
||||
|
||||
#ifndef M_1_SQRT2
|
||||
#define M_1_SQRT2 0.70710678118654752440
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPRINCL_H */
|
||||
|
|
|
@ -1,115 +1,115 @@
|
|||
/*
|
||||
File: exprinit.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, May 1, 2003
|
||||
Desc: Extra functions and routines for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Include files */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
|
||||
/* Macro for adding a function node type */
|
||||
#define EXPR_ADDFUNC_TYPE(name, type, argmin, argmax, refmin, refmax) \
|
||||
err = exprFuncListAddType(flist, name, type, argmin, argmax, refmin, refmax); \
|
||||
if(err != EXPR_ERROR_NOERROR) \
|
||||
return err;
|
||||
|
||||
/* Macro for adding a constant */
|
||||
#define EXPR_ADDCONST(name, val) \
|
||||
err = exprValListAdd(vlist, name, val); \
|
||||
if(err != EXPR_ERROR_NOERROR) \
|
||||
return err;
|
||||
|
||||
/* Call this function to initialize these functions into a function list */
|
||||
int exprFuncListInit(exprFuncList *flist)
|
||||
{
|
||||
int err;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
EXPR_ADDFUNC_TYPE("abs", EXPR_NODEFUNC_ABS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("mod", EXPR_NODEFUNC_MOD, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ipart", EXPR_NODEFUNC_IPART, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("fpart", EXPR_NODEFUNC_FPART, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("min", EXPR_NODEFUNC_MIN, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("max", EXPR_NODEFUNC_MAX, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pow", EXPR_NODEFUNC_POW, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sqrt", EXPR_NODEFUNC_SQRT, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sin", EXPR_NODEFUNC_SIN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sinh", EXPR_NODEFUNC_SINH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("asin", EXPR_NODEFUNC_ASIN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("cos", EXPR_NODEFUNC_COS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("cosh", EXPR_NODEFUNC_COSH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("acos", EXPR_NODEFUNC_ACOS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("tan", EXPR_NODEFUNC_TAN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("tanh", EXPR_NODEFUNC_TANH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("atan", EXPR_NODEFUNC_ATAN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("atan2", EXPR_NODEFUNC_ATAN2, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("log", EXPR_NODEFUNC_LOG, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pow10", EXPR_NODEFUNC_POW10, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ln", EXPR_NODEFUNC_LN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("exp", EXPR_NODEFUNC_EXP, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("logn", EXPR_NODEFUNC_LOGN, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ceil", EXPR_NODEFUNC_CEIL, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("floor", EXPR_NODEFUNC_FLOOR, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("rand", EXPR_NODEFUNC_RAND, 0, 0, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("random", EXPR_NODEFUNC_RANDOM, 2, 2, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("randomize", EXPR_NODEFUNC_RANDOMIZE, 0, 0, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("deg", EXPR_NODEFUNC_DEG, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("rad", EXPR_NODEFUNC_RAD, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("recttopolr", EXPR_NODEFUNC_RECTTOPOLR, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("recttopola", EXPR_NODEFUNC_RECTTOPOLA, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poltorectx", EXPR_NODEFUNC_POLTORECTX, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poltorecty", EXPR_NODEFUNC_POLTORECTY, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("if", EXPR_NODEFUNC_IF, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("select", EXPR_NODEFUNC_SELECT, 3, 4, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("equal", EXPR_NODEFUNC_EQUAL, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("above", EXPR_NODEFUNC_ABOVE, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("below", EXPR_NODEFUNC_BELOW, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("avg", EXPR_NODEFUNC_AVG, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("clip", EXPR_NODEFUNC_CLIP, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("clamp", EXPR_NODEFUNC_CLAMP, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pntchange", EXPR_NODEFUNC_PNTCHANGE, 5, 5, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poly", EXPR_NODEFUNC_POLY, 2, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("and", EXPR_NODEFUNC_AND, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("or", EXPR_NODEFUNC_OR, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("not", EXPR_NODEFUNC_NOT, 1 ,1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("for", EXPR_NODEFUNC_FOR, 4, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("many", EXPR_NODEFUNC_MANY, 1, -1, 0, 0);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Call this function to initialize some constants into a value list */
|
||||
int exprValListInit(exprValList *vlist)
|
||||
{
|
||||
int err;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
EXPR_ADDCONST("M_E", M_E);
|
||||
EXPR_ADDCONST("M_LOG2E", M_LOG2E);
|
||||
EXPR_ADDCONST("M_LOG10E", M_LOG10E);
|
||||
EXPR_ADDCONST("M_LN2", M_LN2);
|
||||
EXPR_ADDCONST("M_LN10", M_LN10);
|
||||
EXPR_ADDCONST("M_PI", M_PI);
|
||||
EXPR_ADDCONST("M_PI_2", M_PI_2);
|
||||
EXPR_ADDCONST("M_PI_4", M_PI_4);
|
||||
EXPR_ADDCONST("M_1_PI", M_1_PI);
|
||||
EXPR_ADDCONST("M_2_PI", M_2_PI);
|
||||
EXPR_ADDCONST("M_1_SQRTPI", M_1_SQRTPI);
|
||||
EXPR_ADDCONST("M_2_SQRTPI", M_2_SQRTPI);
|
||||
EXPR_ADDCONST("M_SQRT2", M_SQRT2);
|
||||
EXPR_ADDCONST("M_1_SQRT2", M_1_SQRT2);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
File: exprinit.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, May 1, 2003
|
||||
Desc: Extra functions and routines for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Include files */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
|
||||
/* Macro for adding a function node type */
|
||||
#define EXPR_ADDFUNC_TYPE(name, type, argmin, argmax, refmin, refmax) \
|
||||
err = exprFuncListAddType(flist, name, type, argmin, argmax, refmin, refmax); \
|
||||
if(err != EXPR_ERROR_NOERROR) \
|
||||
return err;
|
||||
|
||||
/* Macro for adding a constant */
|
||||
#define EXPR_ADDCONST(name, val) \
|
||||
err = exprValListAdd(vlist, name, val); \
|
||||
if(err != EXPR_ERROR_NOERROR) \
|
||||
return err;
|
||||
|
||||
/* Call this function to initialize these functions into a function list */
|
||||
int exprFuncListInit(exprFuncList *flist)
|
||||
{
|
||||
int err;
|
||||
|
||||
if(flist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
EXPR_ADDFUNC_TYPE("abs", EXPR_NODEFUNC_ABS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("mod", EXPR_NODEFUNC_MOD, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ipart", EXPR_NODEFUNC_IPART, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("fpart", EXPR_NODEFUNC_FPART, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("min", EXPR_NODEFUNC_MIN, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("max", EXPR_NODEFUNC_MAX, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pow", EXPR_NODEFUNC_POW, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sqrt", EXPR_NODEFUNC_SQRT, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sin", EXPR_NODEFUNC_SIN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("sinh", EXPR_NODEFUNC_SINH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("asin", EXPR_NODEFUNC_ASIN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("cos", EXPR_NODEFUNC_COS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("cosh", EXPR_NODEFUNC_COSH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("acos", EXPR_NODEFUNC_ACOS, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("tan", EXPR_NODEFUNC_TAN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("tanh", EXPR_NODEFUNC_TANH, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("atan", EXPR_NODEFUNC_ATAN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("atan2", EXPR_NODEFUNC_ATAN2, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("log", EXPR_NODEFUNC_LOG, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pow10", EXPR_NODEFUNC_POW10, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ln", EXPR_NODEFUNC_LN, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("exp", EXPR_NODEFUNC_EXP, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("logn", EXPR_NODEFUNC_LOGN, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("ceil", EXPR_NODEFUNC_CEIL, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("floor", EXPR_NODEFUNC_FLOOR, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("rand", EXPR_NODEFUNC_RAND, 0, 0, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("random", EXPR_NODEFUNC_RANDOM, 2, 2, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("randomize", EXPR_NODEFUNC_RANDOMIZE, 0, 0, 1, 1);
|
||||
EXPR_ADDFUNC_TYPE("deg", EXPR_NODEFUNC_DEG, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("rad", EXPR_NODEFUNC_RAD, 1, 1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("recttopolr", EXPR_NODEFUNC_RECTTOPOLR, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("recttopola", EXPR_NODEFUNC_RECTTOPOLA, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poltorectx", EXPR_NODEFUNC_POLTORECTX, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poltorecty", EXPR_NODEFUNC_POLTORECTY, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("if", EXPR_NODEFUNC_IF, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("select", EXPR_NODEFUNC_SELECT, 3, 4, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("equal", EXPR_NODEFUNC_EQUAL, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("above", EXPR_NODEFUNC_ABOVE, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("below", EXPR_NODEFUNC_BELOW, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("avg", EXPR_NODEFUNC_AVG, 1, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("clip", EXPR_NODEFUNC_CLIP, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("clamp", EXPR_NODEFUNC_CLAMP, 3, 3, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("pntchange", EXPR_NODEFUNC_PNTCHANGE, 5, 5, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("poly", EXPR_NODEFUNC_POLY, 2, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("and", EXPR_NODEFUNC_AND, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("or", EXPR_NODEFUNC_OR, 2, 2, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("not", EXPR_NODEFUNC_NOT, 1 ,1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("for", EXPR_NODEFUNC_FOR, 4, -1, 0, 0);
|
||||
EXPR_ADDFUNC_TYPE("many", EXPR_NODEFUNC_MANY, 1, -1, 0, 0);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Call this function to initialize some constants into a value list */
|
||||
int exprValListInit(exprValList *vlist)
|
||||
{
|
||||
int err;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
EXPR_ADDCONST("M_E", M_E);
|
||||
EXPR_ADDCONST("M_LOG2E", M_LOG2E);
|
||||
EXPR_ADDCONST("M_LOG10E", M_LOG10E);
|
||||
EXPR_ADDCONST("M_LN2", M_LN2);
|
||||
EXPR_ADDCONST("M_LN10", M_LN10);
|
||||
EXPR_ADDCONST("M_PI", M_PI);
|
||||
EXPR_ADDCONST("M_PI_2", M_PI_2);
|
||||
EXPR_ADDCONST("M_PI_4", M_PI_4);
|
||||
EXPR_ADDCONST("M_1_PI", M_1_PI);
|
||||
EXPR_ADDCONST("M_2_PI", M_2_PI);
|
||||
EXPR_ADDCONST("M_1_SQRTPI", M_1_SQRTPI);
|
||||
EXPR_ADDCONST("M_2_SQRTPI", M_2_SQRTPI);
|
||||
EXPR_ADDCONST("M_SQRT2", M_SQRT2);
|
||||
EXPR_ADDCONST("M_1_SQRT2", M_1_SQRT2);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,39 +1,39 @@
|
|||
/*
|
||||
File: exprmem.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Memory functions for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Allocate memory and zero it */
|
||||
void* exprAllocMem(size_t size)
|
||||
{
|
||||
void *data = malloc(size);
|
||||
|
||||
if(data)
|
||||
{
|
||||
memset(data, 0, size);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* Free memory */
|
||||
void exprFreeMem(void *data)
|
||||
{
|
||||
if(data)
|
||||
free(data);
|
||||
}
|
||||
|
||||
/* Allocate a list of nodes */
|
||||
exprNode *exprAllocNodes(size_t count)
|
||||
{
|
||||
return exprAllocMem(count * sizeof(exprNode));
|
||||
}
|
||||
/*
|
||||
File: exprmem.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Memory functions for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Allocate memory and zero it */
|
||||
void* exprAllocMem(size_t size)
|
||||
{
|
||||
void *data = malloc(size);
|
||||
|
||||
if(data)
|
||||
{
|
||||
memset(data, 0, size);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* Free memory */
|
||||
void exprFreeMem(void *data)
|
||||
{
|
||||
if(data)
|
||||
free(data);
|
||||
}
|
||||
|
||||
/* Allocate a list of nodes */
|
||||
exprNode *exprAllocNodes(size_t count)
|
||||
{
|
||||
return exprAllocMem(count * sizeof(exprNode));
|
||||
}
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
/*
|
||||
File: exprmem.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Memory functions for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRMEM_H
|
||||
#define __BAVII_EXPRMEM_H
|
||||
|
||||
/* Needed for exprNode */
|
||||
#include "exprpriv.h"
|
||||
|
||||
void* exprAllocMem(size_t size);
|
||||
void exprFreeMem(void *data);
|
||||
exprNode *exprAllocNodes(size_t count);
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPRMEM_H */
|
||||
/*
|
||||
File: exprmem.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Wednesday, April 30, 2003
|
||||
Desc: Memory functions for ExprEval
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
#ifndef __BAVII_EXPRMEM_H
|
||||
#define __BAVII_EXPRMEM_H
|
||||
|
||||
/* Needed for exprNode */
|
||||
#include "exprpriv.h"
|
||||
|
||||
void* exprAllocMem(size_t size);
|
||||
void exprFreeMem(void *data);
|
||||
exprNode *exprAllocNodes(size_t count);
|
||||
|
||||
|
||||
#endif /* __BAVII_EXPRMEM_H */
|
||||
|
|
|
@ -1,237 +1,237 @@
|
|||
/*
|
||||
File: exprobj.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Tuesday, April 29, 2003
|
||||
Desc: Functions for the exprObj type
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Internal functions */
|
||||
static void exprFreeNodeData(exprNode *node);
|
||||
|
||||
|
||||
/* Function to create an expression object */
|
||||
int exprCreate(exprObj **obj, exprFuncList *flist, exprValList *vlist, exprValList *clist,
|
||||
exprBreakFuncType breaker, void *userdata)
|
||||
{
|
||||
exprObj *tmp;
|
||||
|
||||
/* Allocate memory for the object */
|
||||
tmp = exprAllocMem(sizeof(exprObj));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
|
||||
/* Assign data */
|
||||
tmp->flist = flist;
|
||||
tmp->vlist = vlist;
|
||||
tmp->clist = clist;
|
||||
tmp->breakerfunc = breaker;
|
||||
tmp->userdata = userdata;
|
||||
tmp->breakcount = 100000; /* Default breaker count setting */
|
||||
tmp->breakcur = 0;
|
||||
|
||||
/* Update pointer */
|
||||
*obj = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Free the expression */
|
||||
int exprFree(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* First free the node data */
|
||||
exprFreeNodeData(obj->headnode);
|
||||
exprFreeMem(obj->headnode);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(obj);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Clear expression, keep lists, etc */
|
||||
int exprClear(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the node data only, keep function, variable, constant lists */
|
||||
exprFreeNodeData(obj->headnode);
|
||||
exprFreeMem(obj->headnode);
|
||||
|
||||
obj->headnode = NULL;
|
||||
obj->parsedbad = 0;
|
||||
obj->parsedgood = 0;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get functions to get information about the expression object */
|
||||
|
||||
/* Get the function list */
|
||||
exprFuncList *exprGetFuncList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->flist;
|
||||
}
|
||||
|
||||
/* Get the variable list */
|
||||
exprValList *exprGetVarList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->vlist;
|
||||
}
|
||||
|
||||
/* Get the constant list */
|
||||
exprValList *exprGetConstList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->clist;
|
||||
}
|
||||
|
||||
/* Get the breaker function */
|
||||
exprBreakFuncType exprGetBreakFunc(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->breakerfunc;
|
||||
}
|
||||
|
||||
/* Check for break status */
|
||||
int exprGetBreakResult(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return 0;
|
||||
|
||||
if(obj->breakerfunc == NULL)
|
||||
return 0;
|
||||
|
||||
return (*(obj->breakerfunc))(obj);
|
||||
}
|
||||
|
||||
/* Get the user data */
|
||||
void *exprGetUserData(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->userdata;
|
||||
}
|
||||
|
||||
|
||||
/* Set functions to set certain data */
|
||||
|
||||
/* Set user data */
|
||||
void exprSetUserData(exprObj *obj, void *userdata)
|
||||
{
|
||||
if(obj)
|
||||
obj->userdata = userdata;
|
||||
}
|
||||
|
||||
|
||||
/* Set breaker count */
|
||||
void exprSetBreakCount(exprObj *obj, int count)
|
||||
{
|
||||
if(obj)
|
||||
{
|
||||
/* If count is negative, make it positive */
|
||||
if(count < 0)
|
||||
count = -count;
|
||||
|
||||
obj->breakcount = count;
|
||||
|
||||
/* Make sure the current value is not bigger than count */
|
||||
if(obj->breakcur > count)
|
||||
obj->breakcur = count;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get error position */
|
||||
void exprGetErrorPosition(exprObj *obj, int *start, int *end)
|
||||
{
|
||||
if(obj)
|
||||
{
|
||||
if(start)
|
||||
*start = obj->starterr;
|
||||
|
||||
if(end)
|
||||
*end = obj->enderr;
|
||||
}
|
||||
}
|
||||
|
||||
/* This function will free a node's data */
|
||||
static void exprFreeNodeData(exprNode *node)
|
||||
{
|
||||
int pos;
|
||||
|
||||
if(node == NULL)
|
||||
return;
|
||||
|
||||
/* free data based on type */
|
||||
switch(node->type)
|
||||
{
|
||||
case EXPR_NODETYPE_ADD:
|
||||
case EXPR_NODETYPE_SUBTRACT:
|
||||
case EXPR_NODETYPE_MULTIPLY:
|
||||
case EXPR_NODETYPE_DIVIDE:
|
||||
case EXPR_NODETYPE_EXPONENT:
|
||||
case EXPR_NODETYPE_NEGATE:
|
||||
case EXPR_NODETYPE_MULTI:
|
||||
/* Free operation data */
|
||||
if(node->data.oper.nodes)
|
||||
{
|
||||
for(pos = 0; pos < node->data.oper.nodecount; pos++)
|
||||
exprFreeNodeData(&(node->data.oper.nodes[pos]));
|
||||
|
||||
exprFreeMem(node->data.oper.nodes);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case EXPR_NODETYPE_VALUE:
|
||||
/* Nothing to free for value */
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_VARIABLE:
|
||||
/* Nothing to free for variable */
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_FUNCTION:
|
||||
/* Free data of each subnode */
|
||||
if(node->data.function.nodes)
|
||||
{
|
||||
for(pos = 0; pos < node->data.function.nodecount; pos++)
|
||||
exprFreeNodeData(&(node->data.function.nodes[pos]));
|
||||
|
||||
/* Free the subnode array */
|
||||
exprFreeMem(node->data.function.nodes);
|
||||
}
|
||||
|
||||
/* Free reference variable list */
|
||||
if(node->data.function.refs)
|
||||
exprFreeMem(node->data.function.refs);
|
||||
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_ASSIGN:
|
||||
/* Free subnode data */
|
||||
if(node->data.assign.node)
|
||||
{
|
||||
exprFreeNodeData(node->data.assign.node);
|
||||
|
||||
/* Free the subnode */
|
||||
exprFreeMem(node->data.assign.node);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
File: exprobj.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Tuesday, April 29, 2003
|
||||
Desc: Functions for the exprObj type
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
/* Internal functions */
|
||||
static void exprFreeNodeData(exprNode *node);
|
||||
|
||||
|
||||
/* Function to create an expression object */
|
||||
int exprCreate(exprObj **obj, exprFuncList *flist, exprValList *vlist, exprValList *clist,
|
||||
exprBreakFuncType breaker, void *userdata)
|
||||
{
|
||||
exprObj *tmp;
|
||||
|
||||
/* Allocate memory for the object */
|
||||
tmp = exprAllocMem(sizeof(exprObj));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
|
||||
/* Assign data */
|
||||
tmp->flist = flist;
|
||||
tmp->vlist = vlist;
|
||||
tmp->clist = clist;
|
||||
tmp->breakerfunc = breaker;
|
||||
tmp->userdata = userdata;
|
||||
tmp->breakcount = 100000; /* Default breaker count setting */
|
||||
tmp->breakcur = 0;
|
||||
|
||||
/* Update pointer */
|
||||
*obj = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Free the expression */
|
||||
int exprFree(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* First free the node data */
|
||||
exprFreeNodeData(obj->headnode);
|
||||
exprFreeMem(obj->headnode);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(obj);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Clear expression, keep lists, etc */
|
||||
int exprClear(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the node data only, keep function, variable, constant lists */
|
||||
exprFreeNodeData(obj->headnode);
|
||||
exprFreeMem(obj->headnode);
|
||||
|
||||
obj->headnode = NULL;
|
||||
obj->parsedbad = 0;
|
||||
obj->parsedgood = 0;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get functions to get information about the expression object */
|
||||
|
||||
/* Get the function list */
|
||||
exprFuncList *exprGetFuncList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->flist;
|
||||
}
|
||||
|
||||
/* Get the variable list */
|
||||
exprValList *exprGetVarList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->vlist;
|
||||
}
|
||||
|
||||
/* Get the constant list */
|
||||
exprValList *exprGetConstList(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->clist;
|
||||
}
|
||||
|
||||
/* Get the breaker function */
|
||||
exprBreakFuncType exprGetBreakFunc(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->breakerfunc;
|
||||
}
|
||||
|
||||
/* Check for break status */
|
||||
int exprGetBreakResult(exprObj *obj)
|
||||
{
|
||||
if(obj == NULL)
|
||||
return 0;
|
||||
|
||||
if(obj->breakerfunc == NULL)
|
||||
return 0;
|
||||
|
||||
return (*(obj->breakerfunc))(obj);
|
||||
}
|
||||
|
||||
/* Get the user data */
|
||||
void *exprGetUserData(exprObj *obj)
|
||||
{
|
||||
return (obj == NULL) ? NULL : obj->userdata;
|
||||
}
|
||||
|
||||
|
||||
/* Set functions to set certain data */
|
||||
|
||||
/* Set user data */
|
||||
void exprSetUserData(exprObj *obj, void *userdata)
|
||||
{
|
||||
if(obj)
|
||||
obj->userdata = userdata;
|
||||
}
|
||||
|
||||
|
||||
/* Set breaker count */
|
||||
void exprSetBreakCount(exprObj *obj, int count)
|
||||
{
|
||||
if(obj)
|
||||
{
|
||||
/* If count is negative, make it positive */
|
||||
if(count < 0)
|
||||
count = -count;
|
||||
|
||||
obj->breakcount = count;
|
||||
|
||||
/* Make sure the current value is not bigger than count */
|
||||
if(obj->breakcur > count)
|
||||
obj->breakcur = count;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get error position */
|
||||
void exprGetErrorPosition(exprObj *obj, int *start, int *end)
|
||||
{
|
||||
if(obj)
|
||||
{
|
||||
if(start)
|
||||
*start = obj->starterr;
|
||||
|
||||
if(end)
|
||||
*end = obj->enderr;
|
||||
}
|
||||
}
|
||||
|
||||
/* This function will free a node's data */
|
||||
static void exprFreeNodeData(exprNode *node)
|
||||
{
|
||||
int pos;
|
||||
|
||||
if(node == NULL)
|
||||
return;
|
||||
|
||||
/* free data based on type */
|
||||
switch(node->type)
|
||||
{
|
||||
case EXPR_NODETYPE_ADD:
|
||||
case EXPR_NODETYPE_SUBTRACT:
|
||||
case EXPR_NODETYPE_MULTIPLY:
|
||||
case EXPR_NODETYPE_DIVIDE:
|
||||
case EXPR_NODETYPE_EXPONENT:
|
||||
case EXPR_NODETYPE_NEGATE:
|
||||
case EXPR_NODETYPE_MULTI:
|
||||
/* Free operation data */
|
||||
if(node->data.oper.nodes)
|
||||
{
|
||||
for(pos = 0; pos < node->data.oper.nodecount; pos++)
|
||||
exprFreeNodeData(&(node->data.oper.nodes[pos]));
|
||||
|
||||
exprFreeMem(node->data.oper.nodes);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case EXPR_NODETYPE_VALUE:
|
||||
/* Nothing to free for value */
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_VARIABLE:
|
||||
/* Nothing to free for variable */
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_FUNCTION:
|
||||
/* Free data of each subnode */
|
||||
if(node->data.function.nodes)
|
||||
{
|
||||
for(pos = 0; pos < node->data.function.nodecount; pos++)
|
||||
exprFreeNodeData(&(node->data.function.nodes[pos]));
|
||||
|
||||
/* Free the subnode array */
|
||||
exprFreeMem(node->data.function.nodes);
|
||||
}
|
||||
|
||||
/* Free reference variable list */
|
||||
if(node->data.function.refs)
|
||||
exprFreeMem(node->data.function.refs);
|
||||
|
||||
break;
|
||||
|
||||
case EXPR_NODETYPE_ASSIGN:
|
||||
/* Free subnode data */
|
||||
if(node->data.assign.node)
|
||||
{
|
||||
exprFreeNodeData(node->data.assign.node);
|
||||
|
||||
/* Free the subnode */
|
||||
exprFreeMem(node->data.assign.node);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,215 +1,215 @@
|
|||
/*
|
||||
File: exprpriv.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Tuesday, February 28, 2006
|
||||
Desc: Private include file for ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
/* Include once */
|
||||
#ifndef __BAVII_EXPRPRIV_H
|
||||
#define __BAVII_EXPRPRIV_H
|
||||
|
||||
/* Need some definitions, NULL, etc */
|
||||
#include <stddef.h>
|
||||
|
||||
/* Include config and main expreval header */
|
||||
#include "expreval.h"
|
||||
#include "exprconf.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
Version number
|
||||
*/
|
||||
#define EXPR_VERSIONMAJOR 2
|
||||
#define EXPR_VERSIONMINOR 7
|
||||
|
||||
/* Node types */
|
||||
enum
|
||||
{
|
||||
EXPR_NODETYPE_UNKNOWN = 0,
|
||||
EXPR_NODETYPE_MULTI,
|
||||
EXPR_NODETYPE_ADD,
|
||||
EXPR_NODETYPE_SUBTRACT,
|
||||
EXPR_NODETYPE_MULTIPLY,
|
||||
EXPR_NODETYPE_DIVIDE,
|
||||
EXPR_NODETYPE_EXPONENT,
|
||||
EXPR_NODETYPE_NEGATE,
|
||||
EXPR_NODETYPE_VALUE,
|
||||
EXPR_NODETYPE_VARIABLE,
|
||||
EXPR_NODETYPE_ASSIGN,
|
||||
EXPR_NODETYPE_FUNCTION
|
||||
};
|
||||
|
||||
/* Functions can be evaluated directly in EXPREVAL. If fptr
|
||||
is NULL, type is used to determine what the function is */
|
||||
enum
|
||||
{
|
||||
EXPR_NODEFUNC_UNKNOWN = 0,
|
||||
EXPR_NODEFUNC_ABS,
|
||||
EXPR_NODEFUNC_MOD,
|
||||
EXPR_NODEFUNC_IPART,
|
||||
EXPR_NODEFUNC_FPART,
|
||||
EXPR_NODEFUNC_MIN,
|
||||
EXPR_NODEFUNC_MAX,
|
||||
EXPR_NODEFUNC_POW,
|
||||
EXPR_NODEFUNC_SQRT,
|
||||
EXPR_NODEFUNC_SIN,
|
||||
EXPR_NODEFUNC_SINH,
|
||||
EXPR_NODEFUNC_ASIN,
|
||||
EXPR_NODEFUNC_COS,
|
||||
EXPR_NODEFUNC_COSH,
|
||||
EXPR_NODEFUNC_ACOS,
|
||||
EXPR_NODEFUNC_TAN,
|
||||
EXPR_NODEFUNC_TANH,
|
||||
EXPR_NODEFUNC_ATAN,
|
||||
EXPR_NODEFUNC_ATAN2,
|
||||
EXPR_NODEFUNC_LOG,
|
||||
EXPR_NODEFUNC_POW10,
|
||||
EXPR_NODEFUNC_LN,
|
||||
EXPR_NODEFUNC_EXP,
|
||||
EXPR_NODEFUNC_LOGN,
|
||||
EXPR_NODEFUNC_CEIL,
|
||||
EXPR_NODEFUNC_FLOOR,
|
||||
EXPR_NODEFUNC_RAND,
|
||||
EXPR_NODEFUNC_RANDOM,
|
||||
EXPR_NODEFUNC_RANDOMIZE,
|
||||
EXPR_NODEFUNC_DEG,
|
||||
EXPR_NODEFUNC_RAD,
|
||||
EXPR_NODEFUNC_RECTTOPOLR,
|
||||
EXPR_NODEFUNC_RECTTOPOLA,
|
||||
EXPR_NODEFUNC_POLTORECTX,
|
||||
EXPR_NODEFUNC_POLTORECTY,
|
||||
EXPR_NODEFUNC_IF,
|
||||
EXPR_NODEFUNC_SELECT,
|
||||
EXPR_NODEFUNC_EQUAL,
|
||||
EXPR_NODEFUNC_ABOVE,
|
||||
EXPR_NODEFUNC_BELOW,
|
||||
EXPR_NODEFUNC_AVG,
|
||||
EXPR_NODEFUNC_CLIP,
|
||||
EXPR_NODEFUNC_CLAMP,
|
||||
EXPR_NODEFUNC_PNTCHANGE,
|
||||
EXPR_NODEFUNC_POLY,
|
||||
EXPR_NODEFUNC_AND,
|
||||
EXPR_NODEFUNC_OR,
|
||||
EXPR_NODEFUNC_NOT,
|
||||
EXPR_NODEFUNC_FOR,
|
||||
EXPR_NODEFUNC_MANY
|
||||
};
|
||||
|
||||
/* Forward declarations */
|
||||
typedef struct _exprFunc exprFunc;
|
||||
typedef struct _exprVal exprVal;
|
||||
|
||||
/* Expression object */
|
||||
struct _exprObj
|
||||
{
|
||||
struct _exprFuncList *flist; /* Functions */
|
||||
struct _exprValList *vlist; /* Variables */
|
||||
struct _exprValList *clist; /* Constants */
|
||||
struct _exprNode *headnode; /* Head parsed node */
|
||||
|
||||
exprBreakFuncType breakerfunc; /* Break function type */
|
||||
|
||||
void *userdata; /* User data, can be any 32 bit value */
|
||||
int parsedgood; /* non-zero if successfully parsed */
|
||||
int parsedbad; /* non-zero if parsed but unsuccessful */
|
||||
int breakcount; /* how often to check the breaker function */
|
||||
int breakcur; /* do we check the breaker function yet */
|
||||
int starterr; /* start position of an error */
|
||||
int enderr; /* end position of an error */
|
||||
};
|
||||
|
||||
/* Object for a function */
|
||||
struct _exprFunc
|
||||
{
|
||||
char *fname; /* Name of the function */
|
||||
exprFuncType fptr; /* Function pointer */
|
||||
int min, max; /* Min and max args for the function. */
|
||||
int refmin, refmax; /* Min and max ref. variables for the function */
|
||||
int type; /* Function node type. exprEvalNOde solves the function */
|
||||
|
||||
struct _exprFunc *next; /* For linked list */
|
||||
};
|
||||
|
||||
/* Function list object */
|
||||
struct _exprFuncList
|
||||
{
|
||||
struct _exprFunc *head;
|
||||
};
|
||||
|
||||
/* Object for values */
|
||||
struct _exprVal
|
||||
{
|
||||
char *vname; /* Name of the value */
|
||||
EXPRTYPE vval; /* Value of the value */
|
||||
EXPRTYPE *vptr; /* Pointer to a value. Used only if not NULL */
|
||||
|
||||
struct _exprVal *next; /* For linked list */
|
||||
};
|
||||
|
||||
/* Value list */
|
||||
struct _exprValList
|
||||
{
|
||||
struct _exprVal *head;
|
||||
};
|
||||
|
||||
/* Expression node type */
|
||||
struct _exprNode
|
||||
{
|
||||
int type; /* Node type */
|
||||
|
||||
union _data /* Union of info for various types */
|
||||
{
|
||||
struct _oper
|
||||
{
|
||||
struct _exprNode *nodes; /* Operation arguments */
|
||||
int nodecount; /* Number of arguments */
|
||||
} oper;
|
||||
|
||||
struct _variable
|
||||
{
|
||||
EXPRTYPE *vaddr; /* Used if EXPR_FAST_VAR_ACCESS defined */
|
||||
} variable;
|
||||
|
||||
struct _value
|
||||
{
|
||||
EXPRTYPE value; /* Value if type is value */
|
||||
} value;
|
||||
|
||||
struct _assign /* Assignment struct */
|
||||
{
|
||||
EXPRTYPE *vaddr; /* Used if EXPR_FAST_VAR_ACCESS defined */
|
||||
struct _exprNode *node; /* Node to evaluate */
|
||||
} assign;
|
||||
|
||||
struct _function
|
||||
{
|
||||
exprFuncType fptr; /* Function pointer */
|
||||
struct _exprNode *nodes; /* Array of argument nodes */
|
||||
int nodecount; /* Number of argument nodes */
|
||||
EXPRTYPE **refs; /* Reference variables */
|
||||
int refcount; /* Number of variable references (not a reference counter) */
|
||||
int type; /* Type of function for exprEvalNode if fptr is NULL */
|
||||
} function;
|
||||
} data;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Functions for function lists */
|
||||
int exprFuncListAddType(exprFuncList *flist, char *name, int type, int min, int max, int refmin, int refmax);
|
||||
int exprFuncListGet(exprFuncList *flist, char *name, exprFuncType *ptr, int *type, int *min, int *max, int *refmin, int *refmax);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BAVII_EXPRPRIV_H */
|
||||
|
||||
/*
|
||||
File: exprpriv.h
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Tuesday, February 28, 2006
|
||||
Desc: Private include file for ExprEval library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
|
||||
/* Include once */
|
||||
#ifndef __BAVII_EXPRPRIV_H
|
||||
#define __BAVII_EXPRPRIV_H
|
||||
|
||||
/* Need some definitions, NULL, etc */
|
||||
#include <stddef.h>
|
||||
|
||||
/* Include config and main expreval header */
|
||||
#include "expreval.h"
|
||||
#include "exprconf.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
Version number
|
||||
*/
|
||||
#define EXPR_VERSIONMAJOR 2
|
||||
#define EXPR_VERSIONMINOR 7
|
||||
|
||||
/* Node types */
|
||||
enum
|
||||
{
|
||||
EXPR_NODETYPE_UNKNOWN = 0,
|
||||
EXPR_NODETYPE_MULTI,
|
||||
EXPR_NODETYPE_ADD,
|
||||
EXPR_NODETYPE_SUBTRACT,
|
||||
EXPR_NODETYPE_MULTIPLY,
|
||||
EXPR_NODETYPE_DIVIDE,
|
||||
EXPR_NODETYPE_EXPONENT,
|
||||
EXPR_NODETYPE_NEGATE,
|
||||
EXPR_NODETYPE_VALUE,
|
||||
EXPR_NODETYPE_VARIABLE,
|
||||
EXPR_NODETYPE_ASSIGN,
|
||||
EXPR_NODETYPE_FUNCTION
|
||||
};
|
||||
|
||||
/* Functions can be evaluated directly in EXPREVAL. If fptr
|
||||
is NULL, type is used to determine what the function is */
|
||||
enum
|
||||
{
|
||||
EXPR_NODEFUNC_UNKNOWN = 0,
|
||||
EXPR_NODEFUNC_ABS,
|
||||
EXPR_NODEFUNC_MOD,
|
||||
EXPR_NODEFUNC_IPART,
|
||||
EXPR_NODEFUNC_FPART,
|
||||
EXPR_NODEFUNC_MIN,
|
||||
EXPR_NODEFUNC_MAX,
|
||||
EXPR_NODEFUNC_POW,
|
||||
EXPR_NODEFUNC_SQRT,
|
||||
EXPR_NODEFUNC_SIN,
|
||||
EXPR_NODEFUNC_SINH,
|
||||
EXPR_NODEFUNC_ASIN,
|
||||
EXPR_NODEFUNC_COS,
|
||||
EXPR_NODEFUNC_COSH,
|
||||
EXPR_NODEFUNC_ACOS,
|
||||
EXPR_NODEFUNC_TAN,
|
||||
EXPR_NODEFUNC_TANH,
|
||||
EXPR_NODEFUNC_ATAN,
|
||||
EXPR_NODEFUNC_ATAN2,
|
||||
EXPR_NODEFUNC_LOG,
|
||||
EXPR_NODEFUNC_POW10,
|
||||
EXPR_NODEFUNC_LN,
|
||||
EXPR_NODEFUNC_EXP,
|
||||
EXPR_NODEFUNC_LOGN,
|
||||
EXPR_NODEFUNC_CEIL,
|
||||
EXPR_NODEFUNC_FLOOR,
|
||||
EXPR_NODEFUNC_RAND,
|
||||
EXPR_NODEFUNC_RANDOM,
|
||||
EXPR_NODEFUNC_RANDOMIZE,
|
||||
EXPR_NODEFUNC_DEG,
|
||||
EXPR_NODEFUNC_RAD,
|
||||
EXPR_NODEFUNC_RECTTOPOLR,
|
||||
EXPR_NODEFUNC_RECTTOPOLA,
|
||||
EXPR_NODEFUNC_POLTORECTX,
|
||||
EXPR_NODEFUNC_POLTORECTY,
|
||||
EXPR_NODEFUNC_IF,
|
||||
EXPR_NODEFUNC_SELECT,
|
||||
EXPR_NODEFUNC_EQUAL,
|
||||
EXPR_NODEFUNC_ABOVE,
|
||||
EXPR_NODEFUNC_BELOW,
|
||||
EXPR_NODEFUNC_AVG,
|
||||
EXPR_NODEFUNC_CLIP,
|
||||
EXPR_NODEFUNC_CLAMP,
|
||||
EXPR_NODEFUNC_PNTCHANGE,
|
||||
EXPR_NODEFUNC_POLY,
|
||||
EXPR_NODEFUNC_AND,
|
||||
EXPR_NODEFUNC_OR,
|
||||
EXPR_NODEFUNC_NOT,
|
||||
EXPR_NODEFUNC_FOR,
|
||||
EXPR_NODEFUNC_MANY
|
||||
};
|
||||
|
||||
/* Forward declarations */
|
||||
typedef struct _exprFunc exprFunc;
|
||||
typedef struct _exprVal exprVal;
|
||||
|
||||
/* Expression object */
|
||||
struct _exprObj
|
||||
{
|
||||
struct _exprFuncList *flist; /* Functions */
|
||||
struct _exprValList *vlist; /* Variables */
|
||||
struct _exprValList *clist; /* Constants */
|
||||
struct _exprNode *headnode; /* Head parsed node */
|
||||
|
||||
exprBreakFuncType breakerfunc; /* Break function type */
|
||||
|
||||
void *userdata; /* User data, can be any 32 bit value */
|
||||
int parsedgood; /* non-zero if successfully parsed */
|
||||
int parsedbad; /* non-zero if parsed but unsuccessful */
|
||||
int breakcount; /* how often to check the breaker function */
|
||||
int breakcur; /* do we check the breaker function yet */
|
||||
int starterr; /* start position of an error */
|
||||
int enderr; /* end position of an error */
|
||||
};
|
||||
|
||||
/* Object for a function */
|
||||
struct _exprFunc
|
||||
{
|
||||
char *fname; /* Name of the function */
|
||||
exprFuncType fptr; /* Function pointer */
|
||||
int min, max; /* Min and max args for the function. */
|
||||
int refmin, refmax; /* Min and max ref. variables for the function */
|
||||
int type; /* Function node type. exprEvalNOde solves the function */
|
||||
|
||||
struct _exprFunc *next; /* For linked list */
|
||||
};
|
||||
|
||||
/* Function list object */
|
||||
struct _exprFuncList
|
||||
{
|
||||
struct _exprFunc *head;
|
||||
};
|
||||
|
||||
/* Object for values */
|
||||
struct _exprVal
|
||||
{
|
||||
char *vname; /* Name of the value */
|
||||
EXPRTYPE vval; /* Value of the value */
|
||||
EXPRTYPE *vptr; /* Pointer to a value. Used only if not NULL */
|
||||
|
||||
struct _exprVal *next; /* For linked list */
|
||||
};
|
||||
|
||||
/* Value list */
|
||||
struct _exprValList
|
||||
{
|
||||
struct _exprVal *head;
|
||||
};
|
||||
|
||||
/* Expression node type */
|
||||
struct _exprNode
|
||||
{
|
||||
int type; /* Node type */
|
||||
|
||||
union _data /* Union of info for various types */
|
||||
{
|
||||
struct _oper
|
||||
{
|
||||
struct _exprNode *nodes; /* Operation arguments */
|
||||
int nodecount; /* Number of arguments */
|
||||
} oper;
|
||||
|
||||
struct _variable
|
||||
{
|
||||
EXPRTYPE *vaddr; /* Used if EXPR_FAST_VAR_ACCESS defined */
|
||||
} variable;
|
||||
|
||||
struct _value
|
||||
{
|
||||
EXPRTYPE value; /* Value if type is value */
|
||||
} value;
|
||||
|
||||
struct _assign /* Assignment struct */
|
||||
{
|
||||
EXPRTYPE *vaddr; /* Used if EXPR_FAST_VAR_ACCESS defined */
|
||||
struct _exprNode *node; /* Node to evaluate */
|
||||
} assign;
|
||||
|
||||
struct _function
|
||||
{
|
||||
exprFuncType fptr; /* Function pointer */
|
||||
struct _exprNode *nodes; /* Array of argument nodes */
|
||||
int nodecount; /* Number of argument nodes */
|
||||
EXPRTYPE **refs; /* Reference variables */
|
||||
int refcount; /* Number of variable references (not a reference counter) */
|
||||
int type; /* Type of function for exprEvalNode if fptr is NULL */
|
||||
} function;
|
||||
} data;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Functions for function lists */
|
||||
int exprFuncListAddType(exprFuncList *flist, char *name, int type, int min, int max, int refmin, int refmax);
|
||||
int exprFuncListGet(exprFuncList *flist, char *name, exprFuncType *ptr, int *type, int *min, int *max, int *refmin, int *refmax);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BAVII_EXPRPRIV_H */
|
||||
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
/*
|
||||
File: exprutil.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Monday, April 28, 2003
|
||||
Desc: Utility functions for use by this library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Include files */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
|
||||
/* Return the version number */
|
||||
void exprGetVersion(int *major, int *minor)
|
||||
{
|
||||
*major = EXPR_VERSIONMAJOR;
|
||||
*minor = EXPR_VERSIONMINOR;
|
||||
}
|
||||
|
||||
/* This utility function determines if an identifier is valid */
|
||||
int exprValidIdent(char *name)
|
||||
{
|
||||
if(name == NULL) /* Null string */
|
||||
return 0;
|
||||
|
||||
/* First must be letter or underscore */
|
||||
if(isalpha(*name) || *name == '_')
|
||||
name++; /* Point to next letter */
|
||||
else
|
||||
return 0; /* Not letter or underscore, maybe empty*/
|
||||
|
||||
/* others can be letter, number, or underscore */
|
||||
while(isalnum(*name) || *name == '_')
|
||||
name++;
|
||||
|
||||
/* When the while breaks out, we should be at the end */
|
||||
return (*name == '\0') ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
File: exprutil.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Monday, April 28, 2003
|
||||
Desc: Utility functions for use by this library
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Include files */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
|
||||
|
||||
/* Return the version number */
|
||||
void exprGetVersion(int *major, int *minor)
|
||||
{
|
||||
*major = EXPR_VERSIONMAJOR;
|
||||
*minor = EXPR_VERSIONMINOR;
|
||||
}
|
||||
|
||||
/* This utility function determines if an identifier is valid */
|
||||
int exprValidIdent(char *name)
|
||||
{
|
||||
if(name == NULL) /* Null string */
|
||||
return 0;
|
||||
|
||||
/* First must be letter or underscore */
|
||||
if(isalpha(*name) || *name == '_')
|
||||
name++; /* Point to next letter */
|
||||
else
|
||||
return 0; /* Not letter or underscore, maybe empty*/
|
||||
|
||||
/* others can be letter, number, or underscore */
|
||||
while(isalnum(*name) || *name == '_')
|
||||
name++;
|
||||
|
||||
/* When the while breaks out, we should be at the end */
|
||||
return (*name == '\0') ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,395 +1,395 @@
|
|||
/*
|
||||
File: exprval.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Value lists for variables and constants
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
|
||||
/* Internal functions */
|
||||
static exprVal *exprCreateVal(char *name, EXPRTYPE val, EXPRTYPE *addr);
|
||||
static void exprValListFreeData(exprVal *val);
|
||||
static void exprValListResetData(exprVal *val);
|
||||
|
||||
/* This function creates the value list, */
|
||||
int exprValListCreate(exprValList **vlist)
|
||||
{
|
||||
exprValList *tmp;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
*vlist = NULL; /* Set to NULL initially */
|
||||
|
||||
tmp = exprAllocMem(sizeof(exprValList));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY; /* Could not allocate memory */
|
||||
|
||||
/* Update pointer */
|
||||
*vlist = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a value to the list */
|
||||
int exprValListAdd(exprValList *vlist, char *name, EXPRTYPE val)
|
||||
{
|
||||
exprVal *tmp;
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
if(vlist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateVal(name, val, NULL);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
vlist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if already exists */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* We did not find it, create it and add it to the beginning */
|
||||
tmp = exprCreateVal(name, val, NULL);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = vlist->head;
|
||||
vlist->head = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Set a value in the list */
|
||||
int exprValListSet(exprValList *vlist, char *name, EXPRTYPE val)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Find and set it */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*(cur->vptr) = val;
|
||||
else
|
||||
cur->vval = val;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* Get the value from a list */
|
||||
int exprValListGet(exprValList *vlist, char *name, EXPRTYPE *val)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
if(cur->vptr)
|
||||
*val = *(cur->vptr);
|
||||
else
|
||||
*val = cur->vval;
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find the item in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* Add an address to the list */
|
||||
int exprValListAddAddress(exprValList *vlist, char *name, EXPRTYPE *addr)
|
||||
{
|
||||
exprVal *tmp;
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
if(vlist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateVal(name, (EXPRTYPE)0.0, addr);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
vlist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* Add it to the list */
|
||||
tmp = exprCreateVal(name, (EXPRTYPE)0.0, addr);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = vlist->head;
|
||||
vlist->head = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Get memory address of a variable value in a value list */
|
||||
int exprValListGetAddress(exprValList *vlist, char *name, EXPRTYPE **addr)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
/* Not found yet */
|
||||
*addr = NULL;
|
||||
|
||||
if(vlist == NULL || addr == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
if(cur->vptr)
|
||||
*addr = cur->vptr;
|
||||
else
|
||||
*addr = &(cur->vval);
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find it in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* This function is used to enumerate the values in a value list */
|
||||
void *exprValListGetNext(exprValList *vlist, char **name, EXPRTYPE *value, EXPRTYPE** addr, void *cookie)
|
||||
{
|
||||
exprVal *cur;
|
||||
|
||||
if(vlist == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Get the current item */
|
||||
cur = (exprVal*)cookie;
|
||||
|
||||
/* Find the next item */
|
||||
if(cur == NULL)
|
||||
cur = vlist->head;
|
||||
else
|
||||
cur = cur->next;
|
||||
|
||||
/* Set up the data */
|
||||
if(cur)
|
||||
{
|
||||
if(name)
|
||||
*name = cur->vname;
|
||||
|
||||
if(value)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*value = *(cur->vptr);
|
||||
else
|
||||
*value = cur->vval;
|
||||
}
|
||||
|
||||
if(addr)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*addr = cur->vptr;
|
||||
else
|
||||
*addr = &(cur->vval);
|
||||
}
|
||||
}
|
||||
|
||||
/* If there was no value, return NULL, otherwise, return the item */
|
||||
return (void*)cur;
|
||||
}
|
||||
|
||||
/* This routine will free the value list */
|
||||
int exprValListFree(exprValList *vlist)
|
||||
{
|
||||
/* Make sure it exists, if not it is not error */
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes */
|
||||
exprValListFreeData(vlist->head);
|
||||
|
||||
/* Freethe container */
|
||||
exprFreeMem(vlist);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will reset the value list to 0.0 */
|
||||
int exprValListClear(exprValList *vlist)
|
||||
{
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
exprValListResetData(vlist->head);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will free any child nodes, and then free itself */
|
||||
static void exprValListFreeData(exprVal *val)
|
||||
{
|
||||
exprVal *next;
|
||||
|
||||
while(val)
|
||||
{
|
||||
/* Remember the next */
|
||||
next = val->next;
|
||||
|
||||
/* Free name */
|
||||
exprFreeMem(val->vname);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(val);
|
||||
|
||||
val = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will reset variables to 0.0 */
|
||||
static void exprValListResetData(exprVal *val)
|
||||
{
|
||||
while(val)
|
||||
{
|
||||
/* Reset data */
|
||||
if(val->vptr)
|
||||
*(val->vptr) = 0.0;
|
||||
|
||||
val->vval = 0.0;
|
||||
|
||||
val = val->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will create the value object */
|
||||
static exprVal *exprCreateVal(char *name, EXPRTYPE val, EXPRTYPE *addr)
|
||||
{
|
||||
exprVal *tmp;
|
||||
char *vtmp;
|
||||
|
||||
/* Name already tested in exprValListAdd */
|
||||
|
||||
/* Create it */
|
||||
tmp = exprAllocMem(sizeof(exprVal));
|
||||
if(tmp == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Allocate space for the name */
|
||||
vtmp = exprAllocMem(strlen(name) + 1);
|
||||
|
||||
if(vtmp == NULL)
|
||||
{
|
||||
exprFreeMem(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy the data over */
|
||||
strcpy(vtmp, name);
|
||||
tmp->vname = vtmp;
|
||||
tmp->vval = val;
|
||||
tmp->vptr = addr;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
/*
|
||||
File: exprval.c
|
||||
Auth: Brian Allen Vanderburg II
|
||||
Date: Thursday, April 24, 2003
|
||||
Desc: Value lists for variables and constants
|
||||
|
||||
This file is part of ExprEval.
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include "exprincl.h"
|
||||
|
||||
#include "exprpriv.h"
|
||||
#include "exprmem.h"
|
||||
|
||||
|
||||
/* Internal functions */
|
||||
static exprVal *exprCreateVal(char *name, EXPRTYPE val, EXPRTYPE *addr);
|
||||
static void exprValListFreeData(exprVal *val);
|
||||
static void exprValListResetData(exprVal *val);
|
||||
|
||||
/* This function creates the value list, */
|
||||
int exprValListCreate(exprValList **vlist)
|
||||
{
|
||||
exprValList *tmp;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
*vlist = NULL; /* Set to NULL initially */
|
||||
|
||||
tmp = exprAllocMem(sizeof(exprValList));
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY; /* Could not allocate memory */
|
||||
|
||||
/* Update pointer */
|
||||
*vlist = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Add a value to the list */
|
||||
int exprValListAdd(exprValList *vlist, char *name, EXPRTYPE val)
|
||||
{
|
||||
exprVal *tmp;
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
if(vlist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateVal(name, val, NULL);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
vlist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if already exists */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* We did not find it, create it and add it to the beginning */
|
||||
tmp = exprCreateVal(name, val, NULL);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = vlist->head;
|
||||
vlist->head = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Set a value in the list */
|
||||
int exprValListSet(exprValList *vlist, char *name, EXPRTYPE val)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Find and set it */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*(cur->vptr) = val;
|
||||
else
|
||||
cur->vval = val;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* Get the value from a list */
|
||||
int exprValListGet(exprValList *vlist, char *name, EXPRTYPE *val)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
if(cur->vptr)
|
||||
*val = *(cur->vptr);
|
||||
else
|
||||
*val = cur->vval;
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find the item in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* Add an address to the list */
|
||||
int exprValListAddAddress(exprValList *vlist, char *name, EXPRTYPE *addr)
|
||||
{
|
||||
exprVal *tmp;
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
/* Make sure the name is valid */
|
||||
if(!exprValidIdent(name))
|
||||
return EXPR_ERROR_BADIDENTIFIER;
|
||||
|
||||
if(vlist->head == NULL)
|
||||
{
|
||||
/* Create the node right here */
|
||||
tmp = exprCreateVal(name, (EXPRTYPE)0.0, addr);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
vlist->head = tmp;
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* See if it already exists */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
return EXPR_ERROR_ALREADYEXISTS;
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* Add it to the list */
|
||||
tmp = exprCreateVal(name, (EXPRTYPE)0.0, addr);
|
||||
|
||||
if(tmp == NULL)
|
||||
return EXPR_ERROR_MEMORY;
|
||||
|
||||
tmp->next = vlist->head;
|
||||
vlist->head = tmp;
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* Get memory address of a variable value in a value list */
|
||||
int exprValListGetAddress(exprValList *vlist, char *name, EXPRTYPE **addr)
|
||||
{
|
||||
exprVal *cur;
|
||||
int result;
|
||||
|
||||
/* Not found yet */
|
||||
*addr = NULL;
|
||||
|
||||
if(vlist == NULL || addr == NULL)
|
||||
return EXPR_ERROR_NULLPOINTER;
|
||||
|
||||
|
||||
if(name == NULL || name[0] == '\0')
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
|
||||
/* Search for the item */
|
||||
cur = vlist->head;
|
||||
|
||||
while(cur)
|
||||
{
|
||||
result = strcmp(name, cur->vname);
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
/* We found it. */
|
||||
if(cur->vptr)
|
||||
*addr = cur->vptr;
|
||||
else
|
||||
*addr = &(cur->vval);
|
||||
|
||||
/* return now */
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* If we got here, we did not find it in the list */
|
||||
return EXPR_ERROR_NOTFOUND;
|
||||
}
|
||||
|
||||
/* This function is used to enumerate the values in a value list */
|
||||
void *exprValListGetNext(exprValList *vlist, char **name, EXPRTYPE *value, EXPRTYPE** addr, void *cookie)
|
||||
{
|
||||
exprVal *cur;
|
||||
|
||||
if(vlist == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Get the current item */
|
||||
cur = (exprVal*)cookie;
|
||||
|
||||
/* Find the next item */
|
||||
if(cur == NULL)
|
||||
cur = vlist->head;
|
||||
else
|
||||
cur = cur->next;
|
||||
|
||||
/* Set up the data */
|
||||
if(cur)
|
||||
{
|
||||
if(name)
|
||||
*name = cur->vname;
|
||||
|
||||
if(value)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*value = *(cur->vptr);
|
||||
else
|
||||
*value = cur->vval;
|
||||
}
|
||||
|
||||
if(addr)
|
||||
{
|
||||
if(cur->vptr)
|
||||
*addr = cur->vptr;
|
||||
else
|
||||
*addr = &(cur->vval);
|
||||
}
|
||||
}
|
||||
|
||||
/* If there was no value, return NULL, otherwise, return the item */
|
||||
return (void*)cur;
|
||||
}
|
||||
|
||||
/* This routine will free the value list */
|
||||
int exprValListFree(exprValList *vlist)
|
||||
{
|
||||
/* Make sure it exists, if not it is not error */
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
/* Free the nodes */
|
||||
exprValListFreeData(vlist->head);
|
||||
|
||||
/* Freethe container */
|
||||
exprFreeMem(vlist);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will reset the value list to 0.0 */
|
||||
int exprValListClear(exprValList *vlist)
|
||||
{
|
||||
if(vlist == NULL)
|
||||
return EXPR_ERROR_NOERROR;
|
||||
|
||||
exprValListResetData(vlist->head);
|
||||
|
||||
return EXPR_ERROR_NOERROR;
|
||||
}
|
||||
|
||||
/* This routine will free any child nodes, and then free itself */
|
||||
static void exprValListFreeData(exprVal *val)
|
||||
{
|
||||
exprVal *next;
|
||||
|
||||
while(val)
|
||||
{
|
||||
/* Remember the next */
|
||||
next = val->next;
|
||||
|
||||
/* Free name */
|
||||
exprFreeMem(val->vname);
|
||||
|
||||
/* Free ourself */
|
||||
exprFreeMem(val);
|
||||
|
||||
val = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will reset variables to 0.0 */
|
||||
static void exprValListResetData(exprVal *val)
|
||||
{
|
||||
while(val)
|
||||
{
|
||||
/* Reset data */
|
||||
if(val->vptr)
|
||||
*(val->vptr) = 0.0;
|
||||
|
||||
val->vval = 0.0;
|
||||
|
||||
val = val->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* This routine will create the value object */
|
||||
static exprVal *exprCreateVal(char *name, EXPRTYPE val, EXPRTYPE *addr)
|
||||
{
|
||||
exprVal *tmp;
|
||||
char *vtmp;
|
||||
|
||||
/* Name already tested in exprValListAdd */
|
||||
|
||||
/* Create it */
|
||||
tmp = exprAllocMem(sizeof(exprVal));
|
||||
if(tmp == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Allocate space for the name */
|
||||
vtmp = exprAllocMem(strlen(name) + 1);
|
||||
|
||||
if(vtmp == NULL)
|
||||
{
|
||||
exprFreeMem(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy the data over */
|
||||
strcpy(vtmp, name);
|
||||
tmp->vname = vtmp;
|
||||
tmp->vval = val;
|
||||
tmp->vptr = addr;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue