]> git.sur5r.net Git - cc65/blobdiff - src/ar65/exports.c
Merge remote-tracking branch 'upstream/master' into a5200
[cc65] / src / ar65 / exports.c
index 34d34227f47e9c007a9a9ffe14e6110d33ba41c3..11589a6218d4a1104cb20fcd1eebc8fff6571792 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                exports.c                                 */
+/*                                 exports.c                                 */
 /*                                                                           */
-/*             Duplicate export checking for the ar65 archiver              */
+/*              Duplicate export checking for the ar65 archiver              */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (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       */
 #include <string.h>
 
 /* common */
-#include "hashstr.h"
+#include "hashfunc.h"
 #include "xmalloc.h"
-         
+
 /* ar65 */
 #include "error.h"
+#include "library.h"
 #include "objdata.h"
 #include "exports.h"
 
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
 /* A hash table entry */
-typedef struct HashEntry_ HashEntry;
-struct HashEntry_ {
-    HashEntry*                 Next;           /* Next in list */
-    unsigned           Module;         /* Module index */
-    char               Name [1];       /* Name of identifier */
+typedef struct HashEntry HashEntry;
+struct HashEntry {
+    HashEntry*          Next;           /* Next in list */
+    const ObjData*      Module;         /* Pointer to object module */
+    char                Name [1];       /* Name of identifier */
 };
 
 /* Hash table */
-#define HASHTAB_SIZE   4783
-static HashEntry*      HashTab [HASHTAB_SIZE];
+#define HASHTAB_SIZE    4783
+static HashEntry*       HashTab [HASHTAB_SIZE];
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
 
-static HashEntry* NewHashEntry (const char* Name, unsigned Module)
+static HashEntry* NewHashEntry (const char* Name, const ObjData* Module)
 /* Create and return a new hash entry */
 {
     /* Get the length of the name */
@@ -82,8 +83,8 @@ static HashEntry* NewHashEntry (const char* Name, unsigned Module)
     HashEntry* H = xmalloc (sizeof (HashEntry) + Len);
 
     /* Initialize the fields and return it */
-    H->Next    = 0;
-    H->Module  = Module;
+    H->Next     = 0;
+    H->Module   = Module;
     memcpy (H->Name, Name, Len);
     H->Name [Len] = '\0';
     return H;
@@ -91,7 +92,7 @@ static HashEntry* NewHashEntry (const char* Name, unsigned Module)
 
 
 
-void ExpInsert (const char* Name, unsigned Module)
+void ExpInsert (const char* Name, const ObjData* Module)
 /* Insert an exported identifier and check if it's already in the list */
 {
     HashEntry* L;
@@ -104,49 +105,45 @@ void ExpInsert (const char* Name, unsigned Module)
 
     /* Search through the list in that slot and print matching duplicates */
     if (HashTab [HashVal] == 0) {
-       /* The slot is empty */
-       HashTab [HashVal] = H;
-       return;
+        /* The slot is empty */
+        HashTab [HashVal] = H;
+        return;
     }
     L = HashTab [HashVal];
     while (1) {
-       if (strcmp (L->Name, Name) == 0) {
-           /* Duplicate entry */
-           Warning ("External symbol `%s' in module `%s' is duplicated in "
-                    "module `%s'",
-                    Name, GetObjName (L->Module), GetObjName (Module));
-       }
-       if (L->Next == 0) {
-           break;
-       } else {
-           L = L->Next;
-       }
+        if (strcmp (L->Name, Name) == 0) {
+            /* Duplicate entry */
+            Warning ("External symbol `%s' in module `%s', library `%s' "
+                     "is duplicated in module `%s'",
+                     Name, L->Name, LibName, Module->Name);
+        }
+        if (L->Next == 0) {
+            break;
+        } else {
+            L = L->Next;
+        }
     }
     L->Next = H;
 }
 
 
 
-int ExpFind (const char* Name)
-/* Check for an identifier in the list. Return -1 if not found, otherwise
- * return the number of the module, that exports the identifer.
+const ObjData* ExpFind (const char* Name)
+/* Check for an identifier in the list. Return NULL if not found, otherwise
+ * return a pointer to the module, that exports the identifer.
  */
 {
     /* Get a pointer to the list with the symbols hash value */
     HashEntry* L = HashTab [HashStr (Name) % HASHTAB_SIZE];
     while (L) {
         /* Search through the list in that slot */
-       if (strcmp (L->Name, Name) == 0) {
-           /* Entry found */
-           return L->Module;
-       }
-       L = L->Next;
+        if (strcmp (L->Name, Name) == 0) {
+            /* Entry found */
+            return L->Module;
+        }
+        L = L->Next;
     }
 
     /* Not found */
-    return -1;
+    return 0;
 }
-
-
-
-