Metropoli BBS
VIEWER: inptprsl.h MODE: TEXT (ASCII)
/*****************************************************************************
*   "Irit" - the 3d polygonal solid modeller.				     *
*									     *
* Written by:  Gershon Elber				Ver 0.2, Mar. 1990   *
******************************************************************************
*   General, local to module, definitions for the Input Parser module.	     *
*   Note this module actually consists of InptPrsr/InptEval/OverLoad modules.*
*****************************************************************************/

#ifndef	INPT_PRSR_LH
#define	INPT_PRSR_LH

/* #define DEBUG        Print some intermediate results (InptPrsr/InptEval). */

#define MAX_PARSER_STACK	200	     /* Depth of expression nesting. */

typedef enum {
    POLY_EXPR =     0x0001,
    NUMERIC_EXPR =  0x0002,
    VECTOR_EXPR	=   0x0004,
    MATRIX_EXPR	=   0x0008,
    CURVE_EXPR =    0x0010,
    SURFACE_EXPR =  0x0020,
    STRING_EXPR	=   0x0040,
    OLST_EXPR =     0x0080,
    CTLPT_EXPR =    0x0100,

    NO_EXPR =       0x1000,
    POLY_CURVE_EXPR = POLY_EXPR | CURVE_EXPR,
    GEOM_EXPR =     POLY_EXPR | CURVE_EXPR | SURFACE_EXPR,
    OLST_GEOM_EXPR = OLST_EXPR | GEOM_EXPR,
    ANY_EXPR =      POLY_EXPR | NUMERIC_EXPR | VECTOR_EXPR |
    		    MATRIX_EXPR | CURVE_EXPR | SURFACE_EXPR |
		    STRING_EXPR | OLST_EXPR | CTLPT_EXPR,

    ERROR_EXPR =    0x4000
} IritExprType;


extern InptPrsrEvalErrType IPGlblEvalError;	 /* Global used by EvalTree. */

/*****************************************************************************
* The expression parse tree node definition:				     *
*****************************************************************************/
typedef	struct ParseTree {
    struct ParseTree *Right, *Left;
    int NodeKind;
    IritObjectType ObjType;
    union {
	RealType R;
	ObjectStruct *PObj;
    } U;
} ParseTree;

/* See Irit.h file for the different object possible: */
#define IS_POLY_NODE(Node)	((Node)->ObjType == POLY_OBJ)
#define IS_NUM_NODE(Node)	((Node)->ObjType == NUMERIC_OBJ)
#define IS_VEC_NODE(Node)	((Node)->ObjType == VECTOR_OBJ)
#define IS_CTLPT_NODE(Node)	((Node)->ObjType == CTLPT_OBJ)
#define IS_MAT_NODE(Node)	((Node)->ObjType == MATRIX_OBJ)
#define IS_STR_NODE(Node)	((Node)->ObjType == STRING_OBJ)
#define IS_OLST_NODE(Node)	((Node)->ObjType == OBJ_LIST_OBJ)
#define IS_CRV_NODE(Node)	((Node)->ObjType == CURVE_OBJ)
#define IS_SRF_NODE(Node)	((Node)->ObjType == SURFACE_OBJ)

/*****************************************************************************
* The include file stack - nesting is allowed up to FILE_STACK_SIZE.	     *
*****************************************************************************/
typedef struct FileStackStruct {
    char Name[FILE_NAME_LEN];
    FILE *f;
} FileStackStruct;

#define FILE_STACK_SIZE	10

/*****************************************************************************
* Aliases are simple strings substitution - each entry holds alias Name and  *
* alias Value, which replaces Name. Name id not NULL if active.		     *
*****************************************************************************/
typedef struct OneAliasStruct {
    char *Name, *Value;
} OneAliasStruct;

#define NUM_OF_ALIASES	10

typedef struct AliasesStruct {
    OneAliasStruct Aliases[NUM_OF_ALIASES];
} AliasesStruct;

/*****************************************************************************
* Function entry table looks like this (for table see InptPrsr.c module):    *
*****************************************************************************/
#define FUNC_NAME_LEN	11			    /* 10 + NULL terminator. */
#define FUNC_MAX_PARAM	4	    /* Max. of all the function types below. */
#define ANY_PARAM_NUM	127

typedef struct FuncTableType {
    char FuncName[FUNC_NAME_LEN];
    int FuncToken;
    void (*Func)();
    ByteType NumOfParam;
    IritExprType ParamObjType[FUNC_MAX_PARAM];
} FuncTableType;

typedef struct NumFuncTableType {
    char FuncName[FUNC_NAME_LEN];
    int FuncToken;
#ifdef __MSDOS__
    double cdecl (*Func)(); /* So we can use -pr option of Borland C++ 3.0. */
#else
    double (*Func)();
#endif /* __MSDOS__ */
    ByteType NumOfParam;
    IritExprType ParamObjType[FUNC_MAX_PARAM];
} NumFuncTableType;

typedef struct ObjFuncTableType {
    char FuncName[FUNC_NAME_LEN];
    int FuncToken;
    ObjectStruct *(*Func)();
    ByteType NumOfParam;
    IritExprType ParamObjType[FUNC_MAX_PARAM];
} ObjFuncTableType;

typedef struct GenFuncTableType {
    char FuncName[FUNC_NAME_LEN];
    int FuncToken;
    void (*Func)();
    ByteType NumOfParam;
    IritExprType ParamObjType[FUNC_MAX_PARAM];
} GenFuncTableType;

typedef struct ConstantTableType {
    char FuncName[FUNC_NAME_LEN];
    RealType Value;
} ConstantTableType;

/* The followings are defined in the InptEval.c module and are globals so   */
/* InptPrsr.c module will be able to access them...			    */
extern NumFuncTableType NumFuncTable[];
extern int NumFuncTableSize;
extern ObjFuncTableType ObjFuncTable[];
extern int ObjFuncTableSize;
extern GenFuncTableType GenFuncTable[];
extern int GenFuncTableSize;
extern ConstantTableType ConstantTable[];
extern int ConstantTableSize;

/*****************************************************************************
* Tokens used in the expression	to tree	conversion and tree definition.	     *
*****************************************************************************/

#define	TOKENERROR  0

/* Warning - changing the order of these constants, needs updating the order */
/* of them, in the tables in the begining of InptPrsr.c & OverLoad.c modules.*/

#define	ARCCOS	    100			   /* Real value returned functions. */
#define	ARCSIN	    101
#define	ARCTAN2	    102
#define	ARCTAN	    103
#define	COS	    104
#define	EXP	    105
#define	FABS	    106
#define	LN	    107
#define	LOG	    108
#define	SIN	    109
#define	SQRT	    110
#define	TAN	    111
#define CPOLY	    112
#define AREA	    113
#define VOLUME      114
#define TIME	    115

#define NUM_FUNC    100
#define NUM_FUNC_OFFSET	100
#define IS_NUM_FUNCTION(Token)		(Token >= 100 && Token < 200)

#define VECTOR	    200			       /* Object returned Functions. */
#define CTLPT	    201
#define ROTX	    202
#define ROTY	    203
#define ROTZ	    204
#define TRANS	    205
#define SCALE	    206
#define BOX	    207
#define GBOX	    208
#define CONE	    209
#define CONE2	    210
#define CYLIN	    211
#define SPHERE	    212
#define TORUS	    213
#define CIRCPOLY    214
#define POLY	    215
#define CROSSEC	    216
#define SURFREV     217
#define EXTRUDE     218
#define LIST	    219
#define LOAD	    220
#define CONVEX	    221
#define SBEZIER     222
#define CBEZIER     223
#define SBSPLINE    224
#define CBSPLINE    225
#define SEVAL       226
#define CEVAL       227
#define STANGENT    228
#define CTANGENT    229
#define SNORMAL     230
#define SDIVIDE	    231
#define CDIVIDE     232
#define SREGION	    233
#define CREGION     234
#define SREFINE     235
#define CREFINE     236
#define SRAISE      237
#define CRAISE      238
#define CSURFACE    239
#define CMESH       240
#define NTH         241
#define GPOLYGON    242
#define GPOLYLINE   243
#define CIRCLE      244
#define ARC         245
#define RULEDSRF    246
#define BOOLSUM     247
#define SFROMCRVS   248
#define SWEEPSRF    249
#define OFFSET      250
#define CEDITPT     251
#define SEDITPT     252
#define MERGEPOLY   253

#define OBJ_FUNC    200
#define OBJ_FUNC_OFFSET	200
#define IS_OBJ_FUNCTION(Token)		(Token >= 200 && Token < 300)

#define EXIT	    300	   /* General Functions/No value returned functions. */
#define VIEW	    301
#define DIR	    302
#define CHDIR	    303
#define NORMAL	    304
#define INCLUDE	    305
#define SAVE        306
#define FREEOBJ     307
#define INTERACT    308
#define PAUSE	    309
#define IFCOND	    310
#define FORLOOP	    311
#define PRHELP	    312
#define VARLIST	    313
#define ALIAS	    314
#define BEEP	    315
#define EDIT	    316
#define SYSTEM	    317
#define LOGFILE	    318
#define COLOR	    319
#define SNOC        320
#define ATTRIB	    321
#define CLOSED	    322

#define COMMENT	    399

#define GEN_FUNC    300
#define GEN_FUNC_OFFSET	300
#define IS_GEN_FUNCTION(Token)		(Token >= 300 && Token < 400)

#define IS_FUNCTION(Token)              (Token >= 100 && Token < 400)
#define IS_NO_PARAM_FUNC(Token)		(Token == EXIT || Token == SYSTEM || \
					 Token == VARLIST)

#define	PLUS	    400					       /* Operators. */
#define	MINUS	    401
#define	MULT	    402
#define	DIV	    403
#define	POWER	    404
#define	UNARMINUS   405
#define EQUAL	    406
#define COMMA	    407
#define COLON	    408
#define SEMICOLON   409

#define	OPENPARA    430					     /* Paranthesis. */
#define	CLOSPARA    431

#define	NUMBER	    450					    /* Numeric Data. */
#define	PARAMETER   451				 /* Point on new/old object. */
#define STRING	    452	     /* Sequence of characters within double quotes. */

#define TOKENSTART  490
#define TOKENEND    491

#define OPERATORS   400
#define OPERATORS_OFFSET	400

/*****************************************************************************
*   The local function (static) prototypes:				     *
*   Note that if DEBUG is defined for the preprocessor, few more function    *
* become available:							     *
*   Also note that some of the routines are defined globals as both the      *
* InptPrsr.c and InptEval.c modules needs them.				     *
*****************************************************************************/
/* Main parser routine (operator preceedence): Input stream to bin-tree. */
ParseTree *MyExprMalloc(void);
void MyExprFree(ParseTree *Ptr);
void UpdateCharError(char *StrMsg, int Token);
void AliasEdit(char *Name, char *Value);
void AliasExpand(char *Line);
void FileInclude(char *FileName);
IritExprType InptPrsrTypeCheck(ParseTree *Root, int Level);   /* Type check. */
ParseTree *InptPrsrEvalTree(ParseTree *Root, int Level);   /* Evaluate tree. */
void InptPrsrFreeTree(ParseTree *Root);			   /* Free all tree. */
void InptPrsrPrintTree(ParseTree *Root, char *str);	      /* print it... */
ParseTree *InptPrsrCopyTree(ParseTree *Root);			 /* Copy it. */

#endif	/* INPT_PRSR_LH */
[ RETURN TO DIRECTORY ]