/*****************************************************************************/
/* */
-/* exports.c */
+/* exports.c */
/* */
-/* Duplicate export checking for the ar65 archiver */
+/* Duplicate export checking for the ar65 archiver */
/* */
/* */
/* */
-/* (C) 1998-2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (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 */
+ 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 */
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;
-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;
/* 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;
}
-
-
-