/*****************************************************************************/
/* */
-/* expr.h */
+/* expr.h */
/* */
-/* Expression evaluation for the ld65 linker */
+/* Expression evaluation for the ld65 linker */
/* */
/* */
/* */
-/* (C) 1998-2000 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@musoftware.de */
+/* (C) 1998-2011, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* common */
#include "exprdefs.h"
-
+
/* ld65 */
#include "objdata.h"
#include "exports.h"
/*****************************************************************************/
-/* Code */
+/* Data */
/*****************************************************************************/
+/* Structure for parsing segment based expression trees */
+typedef struct SegExprDesc SegExprDesc;
+struct SegExprDesc {
+ long Val; /* The offset value */
+ int TooComplex; /* Expression too complex */
+ Segment* Seg; /* Segment reference if any */
+};
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+ExprNode* NewExprNode (ObjData* O, unsigned char Op);
+/* Create a new expression node */
+
void FreeExpr (ExprNode* Root);
/* Free the expression tree, Root is pointing to. */
int IsConstExpr (ExprNode* Root);
/* Return true if the given expression is a constant expression, that is, one
- * with no references to external symbols.
- */
+** with no references to external symbols.
+*/
Import* GetExprImport (ExprNode* Expr);
/* Get the import data structure for a symbol expression node */
/* Get the exported symbol for a symbol expression node */
Section* GetExprSection (ExprNode* Expr);
-/* Get the segment for a segment expression node */
+/* Get the segment for a section expression node */
long GetExprVal (ExprNode* Expr);
/* Get the value of a constant expression */
+void GetSegExprVal (ExprNode* Expr, SegExprDesc* D);
+/* Check if the given expression consists of a segment reference and only
+** constant values, additions and subtractions. If anything else is found,
+** set D->TooComplex to true. The function will initialize D.
+*/
+
ExprNode* LiteralExpr (long Val, ObjData* O);
/* Return an expression tree that encodes the given literal value */
-ExprNode* MemExpr (Memory* Mem, long Offs, ObjData* O);
+ExprNode* MemoryExpr (MemoryArea* Mem, long Offs, ObjData* O);
/* Return an expression tree that encodes an offset into the memory area */
-void DumpExpr (const ExprNode* Expr);
-/* Dump an expression tree to stdout */
+ExprNode* SegmentExpr (Segment* Seg, long Offs, ObjData* O);
+/* Return an expression tree that encodes an offset into a segment */
+
+ExprNode* SectionExpr (Section* Sec, long Offs, ObjData* O);
+/* Return an expression tree that encodes an offset into a section */
ExprNode* ReadExpr (FILE* F, ObjData* O);
/* Read an expression from the given file */
/* End of expr.h */
#endif
-
-
-