static int ED_IsValid (const ExprDesc* D)
-/* Return true if the expression is valid, that is, the TOO_COMPLEX flag is
- * not set
+/* Return true if the expression is valid, that is, neither the ERROR nor the
+ * TOO_COMPLEX flags are set.
*/
{
- return ((D->Flags & ED_TOO_COMPLEX) == 0);
+ return ((D->Flags & (ED_ERROR | ED_TOO_COMPLEX)) == 0);
+}
+
+
+
+static int ED_HasError (const ExprDesc* D)
+/* Return true if the expression has an error. */
+{
+ return ((D->Flags & ED_ERROR) != 0);
}
+static void ED_SetError (ExprDesc* D)
+/* Set the TOO_COMPLEX and ERROR flags for D */
+{
+ D->Flags |= (ED_ERROR | ED_TOO_COMPLEX);
+}
+
+
+
static void ED_UpdateAddrSize (ExprDesc* ED, unsigned char AddrSize)
/* Update the address size of the expression */
{
if (SymHasExpr (Sym)) {
if (SymHasUserMark (Sym)) {
- if (Verbosity > 0) {
- DumpExpr (Expr, SymResolve);
- }
LIError (&Sym->DefLines,
"Circular reference in definition of symbol `%m%p'",
GetSymName (Sym));
- ED_Invalidate (D);
+ ED_SetError (D);
} else {
unsigned char AddrSize;
StudyExprInternal (GetSymExpr (Sym), D);
SymUnmarkUser (Sym);
+ /* If requested and if the expression is valid, dump it */
+ if (Verbosity > 0 && !ED_HasError (D)) {
+ DumpExpr (Expr, SymResolve);
+ }
+
/* If the symbol has an explicit address size, use it. This may
* lead to range errors later (maybe even in the linker stage), if
* the user lied about the address size, but for now we trust him.
if (ED_IsValid (D)) {
if (D->Right == 0) {
Error ("Division by zero");
- ED_Invalidate (D);
+ ED_SetError (D);
} else {
D->Val /= D->Right;
}
if (ED_IsValid (D)) {
if (D->Right == 0) {
Error ("Modulo operation with zero");
- ED_Invalidate (D);
+ ED_SetError (D);
} else {
D->Val %= D->Right;
}
/* */
/* */
/* */
-/* (C) 2003 Ullrich von Bassewitz */
-/* Römerstraße 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2003-2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
#ifndef STUDYEXPR_H
#define STUDYEXPR_H
-
+
/* common */
#include "exprdefs.h"
/* Flags */
#define ED_OK 0x00 /* Nothing special */
#define ED_TOO_COMPLEX 0x01 /* Expression is too complex */
+#define ED_ERROR 0x02 /* Error evaluating the expression */
/* Symbol reference */
typedef struct ED_SymRef ED_SymRef;