]> git.sur5r.net Git - cc65/blobdiff - src/common/exprdefs.c
Only for jumps, the lib uses named asm labels in branches
[cc65] / src / common / exprdefs.c
index d108c35b33c502f34eb0a664fcd56b84f6bb9280..d9a5adf6be1ac9858f555da2084cb8219bf7815f 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                       exprdefs.c                                 */
+/*                                exprdefs.c                                 */
 /*                                                                           */
-/*                       Expression tree definitions                        */
+/*                        Expression tree definitions                        */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 1998-2012, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
 
-static void InternalDumpExpr (const ExprNode* Expr)
+static void InternalDumpExpr (const ExprNode* Expr, const ExprNode* (*ResolveSym) (const struct SymEntry*))
 /* Dump an expression in RPN to stdout */
 {
     if (Expr == 0) {
-       return;
+        return;
     }
-    InternalDumpExpr (Expr->Left);
-    InternalDumpExpr (Expr->Right);
+    InternalDumpExpr (Expr->Left, ResolveSym);
+    InternalDumpExpr (Expr->Right, ResolveSym);
 
     switch (Expr->Op) {
 
-       case EXPR_LITERAL:
-       case EXPR_ULABEL:
-           printf (" $%04lX", Expr->V.Val & 0xFFFF);
-           break;
+        case EXPR_LITERAL:
+        case EXPR_ULABEL:
+            printf (" $%04lX", Expr->V.IVal);
+            break;
 
-       case EXPR_SYMBOL:
-                   printf (" SYM");
-           break;
+        case EXPR_SYMBOL:
+            printf (" SYM(");
+            if (ResolveSym && (Expr = ResolveSym (Expr->V.Sym)) != 0) {
+                InternalDumpExpr (Expr, ResolveSym);
+            }
+            printf (") ");
+            break;
 
-       case EXPR_SECTION:
-           printf (" SEC");
-           break;
+        case EXPR_SECTION:
+            printf (" SEC");
+            break;
 
-       case EXPR_SEGMENT:
-           printf (" SEG");
-           break;
+        case EXPR_SEGMENT:
+            printf (" SEG");
+            break;
 
-               case EXPR_PLUS:
-           printf (" +");
-           break;
+        case EXPR_MEMAREA:
+            printf (" MEM");
+            break;
 
-               case EXPR_MINUS:
-           printf (" -");
-           break;
+        case EXPR_PLUS:
+            printf (" +");
+            break;
 
-               case EXPR_MUL:
-           printf (" *");
-           break;
+        case EXPR_MINUS:
+            printf (" -");
+            break;
 
-               case EXPR_DIV:
-           printf (" /");
-           break;
+        case EXPR_MUL:
+            printf (" *");
+            break;
 
-               case EXPR_MOD:
-           printf (" MOD");
-           break;
+        case EXPR_DIV:
+            printf (" /");
+            break;
 
-       case EXPR_OR:
-           printf (" OR");
-           break;
+        case EXPR_MOD:
+            printf (" MOD");
+            break;
 
-       case EXPR_XOR:
-           printf (" XOR");
-           break;
+        case EXPR_OR:
+            printf (" OR");
+            break;
 
-       case EXPR_AND:
-           printf (" AND");
-           break;
+        case EXPR_XOR:
+            printf (" XOR");
+            break;
 
-       case EXPR_SHL:
-           printf (" SHL");
-           break;
+        case EXPR_AND:
+            printf (" AND");
+            break;
 
-       case EXPR_SHR:
-           printf (" SHR");
-           break;
+        case EXPR_SHL:
+            printf (" SHL");
+            break;
 
-               case EXPR_EQ:
-           printf (" =");
-           break;
+        case EXPR_SHR:
+            printf (" SHR");
+            break;
 
-               case EXPR_NE:
-           printf ("<>");
-           break;
+        case EXPR_EQ:
+            printf (" =");
+            break;
 
-               case EXPR_LT:
-           printf (" <");
-           break;
+        case EXPR_NE:
+            printf ("<>");
+            break;
 
-               case EXPR_GT:
-           printf (" >");
-           break;
+        case EXPR_LT:
+            printf (" <");
+            break;
 
-               case EXPR_LE:
-           printf (" <=");
-           break;
+        case EXPR_GT:
+            printf (" >");
+            break;
 
-               case EXPR_GE:
-           printf (" >=");
-           break;
+        case EXPR_LE:
+            printf (" <=");
+            break;
 
-       case EXPR_BAND:
-           printf (" BOOL_AND");
-           break;
+        case EXPR_GE:
+            printf (" >=");
+            break;
 
-       case EXPR_BOR:
-           printf (" BOOL_OR");
-           break;
+        case EXPR_BOOLAND:
+            printf (" BOOL_AND");
+            break;
 
-       case EXPR_BXOR:
-           printf (" BOOL_XOR");
-           break;
+        case EXPR_BOOLOR:
+            printf (" BOOL_OR");
+            break;
 
-               case EXPR_UNARY_MINUS:
-           printf (" NEG");
-           break;
+        case EXPR_BOOLXOR:
+            printf (" BOOL_XOR");
+            break;
+
+        case EXPR_MAX:
+            printf (" MAX");
+            break;
 
-               case EXPR_NOT:
-           printf (" ~");
-           break;
+        case EXPR_MIN:
+            printf (" MIN");
+            break;
+
+        case EXPR_UNARY_MINUS:
+            printf (" NEG");
+            break;
 
-               case EXPR_SWAP:
-           printf (" SWAP");
-           break;
+        case EXPR_NOT:
+            printf (" ~");
+            break;
+
+        case EXPR_SWAP:
+            printf (" SWAP");
+            break;
+
+        case EXPR_BOOLNOT:
+            printf (" BOOL_NOT");
+            break;
 
-       case EXPR_BNOT:
-           printf (" BOOL_NOT");
-           break;
+        case EXPR_BANK:
+            printf (" BANK");
+            break;
 
-        case EXPR_FORCEWORD:
-            printf (" FORCE_WORD");
+        case EXPR_BYTE0:
+            printf (" BYTE0");
             break;
 
-        case EXPR_FORCEFAR:
-            printf (" FORCE_FAR");
+        case EXPR_BYTE1:
+            printf (" BYTE1");
             break;
 
-               case EXPR_BYTE0:
-           printf (" BYTE0");
-           break;
+        case EXPR_BYTE2:
+            printf (" BYTE2");
+            break;
 
-               case EXPR_BYTE1:
-           printf (" BYTE1");
-           break;
+        case EXPR_BYTE3:
+            printf (" BYTE3");
+            break;
 
-               case EXPR_BYTE2:
-           printf (" BYTE2");
-           break;
+        case EXPR_WORD0:
+            printf (" WORD0");
+            break;
 
-               case EXPR_BYTE3:
-           printf (" BYTE3");
-           break;
+        case EXPR_WORD1:
+            printf (" WORD1");
+            break;
 
-               case EXPR_WORD0:
-           printf (" WORD0");
-           break;
+        case EXPR_FARADDR:
+            printf (" FARADDR");
+            break;
 
-               case EXPR_WORD1:
-           printf (" WORD1");
-           break;
+        case EXPR_DWORD:
+            printf (" DWORD");
+            break;
 
         default:
-                   AbEnd ("Unknown Op type: %u", Expr->Op);
-                          
+            AbEnd ("Unknown Op type: %u", Expr->Op);
+
     }
 }
 
 
 
-void DumpExpr (const ExprNode* Expr)
+void DumpExpr (const ExprNode* Expr, const ExprNode* (*ResolveSym) (const struct SymEntry*))
 /* Dump an expression tree to stdout */
 {
-    InternalDumpExpr (Expr);
+    InternalDumpExpr (Expr, ResolveSym);
     printf ("\n");
 }
-
-
-