]> git.sur5r.net Git - cc65/blobdiff - src/ld65/asserts.c
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / ld65 / asserts.c
index 14da94c3edc9a8f86e3fe2b9dbde81b132521489..f84bdf3f48b71ce0c0bd07af509c8caab828370c 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003-2008, Ullrich von Bassewitz                                      */
+/* (C) 2003-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -34,7 +34,7 @@
 
 
 /* common */
-#include "assertdefs.h"
+#include "assertion.h"
 #include "coll.h"
 #include "xmalloc.h"
 
 #include "error.h"
 #include "expr.h"
 #include "fileio.h"
+#include "lineinfo.h"
 #include "objdata.h"
 #include "spool.h"
 
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
+/* Assertion struct decl */
+struct Assertion {
+    Collection          LineInfos;      /* File position of assertion */
+    ExprNode*           Expr;           /* Expression to evaluate */
+    AssertAction        Action;         /* What to do */
+    unsigned            Msg;            /* Message to print */
+    ObjData*            Obj;            /* Object file containing the assertion */
+};
+
 /* List with all assertions */
 static Collection Assertions = STATIC_COLLECTION_INITIALIZER;
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -72,10 +82,11 @@ Assertion* ReadAssertion (FILE* F, struct ObjData* O)
     Assertion* A = xmalloc (sizeof (Assertion));
 
     /* Read the fields from the file */
-    A->Expr = ReadExpr (F, O);
-    A->Action = ReadVar (F);
-    A->Msg = MakeGlobalStringId (O, ReadVar (F));
-    ReadFilePos (F, &A->Pos);
+    A->LineInfos = EmptyCollection;
+    A->Expr      = ReadExpr (F, O);
+    A->Action    = (AssertAction) ReadVar (F);
+    A->Msg       = MakeGlobalStringId (O, ReadVar (F));
+    ReadLineInfoList (F, O, &A->LineInfos);
 
     /* Set remaining fields */
     A->Obj = O;
@@ -97,33 +108,50 @@ void CheckAssertions (void)
     /* Walk over all assertions */
     for (I = 0; I < CollCount (&Assertions); ++I) {
 
+        const LineInfo* LI;
+        const char* Module;
+        unsigned Line;
+
         /* Get the assertion */
         Assertion* A = CollAtUnchecked (&Assertions, I);
 
+        /* Ignore assertions that shouldn't be handled at link time */
+        if (!AssertAtLinkTime (A->Action)) {
+            continue;
+        }
+
+        /* Retrieve the relevant line info for this assertion */
+        LI = CollConstAt (&A->LineInfos, 0);
+
+        /* Get file name and line number from the source */
+        Module = GetSourceName (LI);
+        Line   = GetSourceLine (LI);
+
         /* If the expression is not constant, we're not able to handle it */
         if (!IsConstExpr (A->Expr)) {
-            Warning ("Cannot evaluate assertion in module `%s', line %lu",
-                     GetSourceFileName (A->Obj, A->Pos.Name), A->Pos.Line);
+            Warning ("Cannot evaluate assertion in module `%s', line %u",
+                     Module, Line);
         } else if (GetExprVal (A->Expr) == 0) {
 
             /* Assertion failed */
-            const char* Module  = GetSourceFileName (A->Obj, A->Pos.Name);
             const char* Message = GetString (A->Msg);
 
             switch (A->Action) {
 
                 case ASSERT_ACT_WARN:
-                    Warning ("%s(%lu): %s", Module, A->Pos.Line, Message);
+                case ASSERT_ACT_LDWARN:
+                    Warning ("%s(%u): %s", Module, Line, Message);
                     break;
 
                 case ASSERT_ACT_ERROR:
-                    Error ("%s(%lu): %s", Module, A->Pos.Line, Message);
+                case ASSERT_ACT_LDERROR:
+                    Error ("%s(%u): %s", Module, Line, Message);
                     break;
 
                 default:
                     Internal ("Invalid assertion action (%u) in module `%s', "
-                              "line %lu (file corrupt?)",
-                              A->Action, Module, A->Pos.Line);
+                              "line %u (file corrupt?)",
+                              A->Action, Module, Line);
                     break;
             }
         }