]> git.sur5r.net Git - cc65/commitdiff
Check for macro redefinitions that are not identical and flag them as an
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 10 Oct 2000 21:20:34 +0000 (21:20 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 10 Oct 2000 21:20:34 +0000 (21:20 +0000)
error.

git-svn-id: svn://svn.cc65.org/cc65/trunk@357 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/error.c
src/cc65/error.h
src/cc65/macrotab.c
src/cc65/macrotab.h
src/cc65/optimize.c
src/cc65/preproc.c

index 221a4649c0a5a33a7450dc1811fa1e9f2d8a22d5..8fdea906830a1af29dd99daa7a88ae18b858eb53 100644 (file)
@@ -94,6 +94,7 @@ static char* ErrMsg [ERR_COUNT-1] = {
     "Too few arguments in function call",
     "Macro argument count mismatch",
     "Duplicate macro parameter: %s",
+    "Macro redefinition is not identical",
     "Variable identifier expected",
     "Integer expression expected",
     "Constant expression expected",
index 326ce37be7a850e8e246e9c463adf9b1bf76a032..c44518300e00ee2c874a2b9203af409d18021513 100644 (file)
@@ -70,7 +70,7 @@ enum Warnings {
 };
 
 /* Error numbers */
-enum Errors {
+enum Errors {  
     ERR_NONE,                          /* No error */
     ERR_INVALID_CHAR,
     ERR_UNEXPECTED_NEWLINE,
@@ -94,6 +94,7 @@ enum Errors {
     ERR_TOO_FEW_FUNC_ARGS,
     ERR_MACRO_ARGCOUNT,
     ERR_DUPLICATE_MACRO_ARG,
+    ERR_MACRO_REDEF,
     ERR_VAR_IDENT_EXPECTED,
     ERR_INT_EXPR_EXPECTED,
     ERR_CONST_EXPR_EXPECTED,
index 632142c76d8a67542d1f8c46f95148666539c3ec..c616d9bbe39a20f54c16833458a6c292616a7e62 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
-#include "../common/hashstr.h"
-#include "../common/xmalloc.h"
-
+/* common */
+#include "hashstr.h"
+#include "xmalloc.h"
+         
+/* cc65 */
 #include "error.h"
 #include "macrotab.h"
 
@@ -304,6 +306,29 @@ void AddMacroArg (Macro* M, const char* Arg)
 
 
 
+int MacroCmp (const Macro* M1, const Macro* M2)
+/* Compare two macros and return zero if both are identical. */
+{          
+    int I;
+
+    /* Argument count must be identical */
+    if (M1->ArgCount != M2->ArgCount) {
+       return 1;
+    }
+
+    /* Compare the arguments */
+    for (I = 0; I < M1->ArgCount; ++I) {
+       if (strcmp (M1->FormalArgs[I], M2->FormalArgs[I]) != 0) {
+           return 1;
+       }
+    }
+
+    /* Compare the replacement */
+    return strcmp (M1->Replacement, M2->Replacement);
+}
+
+
+
 void PrintMacroStats (FILE* F)
 /* Print macro statistics to the given text file. */
 {
index 3f5bbaba6959bf548eb09a05b00057225004fc8f..37470217132123af3e38a8d26c048f0f69c9655f 100644 (file)
@@ -109,6 +109,9 @@ const char* FindMacroArg (Macro* M, const char* Arg);
 void AddMacroArg (Macro* M, const char* Arg);
 /* Add a formal macro argument. */
 
+int MacroCmp (const Macro* M1, const Macro* M2);
+/* Compare two macros and return zero if both are identical. */
+
 void PrintMacroStats (FILE* F);
 /* Print macro statistics to the given text file. */
 
index 3b98d64f5d69bc3d183c4ef8f32cfe405a19e187..c9890a2441f6d601e0a2faff96b7a4568656b456 100644 (file)
@@ -42,6 +42,7 @@
 #include "attrib.h"
 #include "check.h"
 #include "xmalloc.h"
+#include "xsprintf.h"
 
 /* cc65 */
 #include "asmlabel.h"
index 321b3b1756082756b40c2e65e69088bcf1deeb70..e884f49acc2d760e03b9aa85d58973e52ba72ba2 100644 (file)
@@ -355,6 +355,7 @@ static void addmac (void)
     ident      Ident;
     char       Buf[LINESIZE];
     Macro*     M;
+    Macro*     Existing;
 
     /* Read the macro name */
     SkipBlank ();
@@ -362,6 +363,9 @@ static void addmac (void)
        return;
     }
 
+    /* Get an existing macro definition with this name */
+    Existing = FindMacro (Ident);
+
     /* Create a new macro definition */
     M = NewMacro (Ident);
 
@@ -411,6 +415,15 @@ static void addmac (void)
 
     /* Create a copy of the replacement */
     M->Replacement = xstrdup (Buf);
+
+    /* If we have an existing macro, check if the redefinition is identical.
+     * Print a diagnostic if not.
+     */
+    if (Existing) {
+       if (MacroCmp (M, Existing) != 0) {
+           PPError (ERR_MACRO_REDEF);
+       }
+    }
 }