mirror of
https://github.com/cc65/cc65.git
synced 2024-11-17 09:07:32 +00:00
Simplify things using collections. Some more generic overhaul.
git-svn-id: svn://svn.cc65.org/cc65/trunk@4940 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
a9990fbcf3
commit
5d7001dc93
@ -1,15 +1,15 @@
|
||||
/*****************************************************************************/
|
||||
/* */
|
||||
/* exports.c */
|
||||
/* exports.c */
|
||||
/* */
|
||||
/* Duplicate export checking for the ar65 archiver */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
||||
/* Römerstraße 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* (C) 1998-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -47,16 +47,16 @@
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Data */
|
||||
/* Data */
|
||||
/*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
/* A hash table entry */
|
||||
typedef struct HashEntry HashEntry;
|
||||
typedef struct HashEntry HashEntry;
|
||||
struct HashEntry {
|
||||
HashEntry* Next; /* Next in list */
|
||||
unsigned Module; /* Module index */
|
||||
HashEntry* Next; /* Next in list */
|
||||
const ObjData* Module; /* Pointer to object module */
|
||||
char Name [1]; /* Name of identifier */
|
||||
};
|
||||
|
||||
@ -67,12 +67,12 @@ 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 */
|
||||
@ -91,7 +91,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;
|
||||
@ -114,7 +114,7 @@ void ExpInsert (const char* Name, unsigned Module)
|
||||
/* Duplicate entry */
|
||||
Warning ("External symbol `%s' in module `%s' is duplicated in "
|
||||
"module `%s'",
|
||||
Name, GetObjName (L->Module), GetObjName (Module));
|
||||
Name, L->Name, Module->Name);
|
||||
}
|
||||
if (L->Next == 0) {
|
||||
break;
|
||||
@ -127,9 +127,9 @@ void ExpInsert (const char* Name, unsigned Module)
|
||||
|
||||
|
||||
|
||||
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 */
|
||||
@ -144,7 +144,7 @@ int ExpFind (const char* Name)
|
||||
}
|
||||
|
||||
/* Not found */
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 1998 Ullrich von Bassewitz */
|
||||
/* Wacholderweg 14 */
|
||||
/* D-70597 Stuttgart */
|
||||
/* EMail: uz@musoftware.de */
|
||||
/* (C) 1998-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -39,17 +39,27 @@
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Code */
|
||||
/* Forwards */
|
||||
/*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
void ExpInsert (const char* Name, unsigned Module);
|
||||
struct ObjData;
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Code */
|
||||
/*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
void ExpInsert (const char* Name, const struct ObjData* Module);
|
||||
/* Insert an exported identifier and check if it's already in the list */
|
||||
|
||||
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 struct 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.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -38,9 +38,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
/* common */
|
||||
#include "bitops.h"
|
||||
#include "exprdefs.h"
|
||||
#include "filepos.h"
|
||||
#include "libdefs.h"
|
||||
#include "print.h"
|
||||
#include "symdefs.h"
|
||||
@ -179,7 +177,7 @@ static void WriteHeader (void)
|
||||
|
||||
|
||||
|
||||
static void WriteIndexEntry (ObjData* O)
|
||||
static void WriteIndexEntry (const ObjData* O)
|
||||
/* Write one index entry */
|
||||
{
|
||||
unsigned I;
|
||||
@ -211,7 +209,7 @@ static void WriteIndexEntry (ObjData* O)
|
||||
static void WriteIndex (void)
|
||||
/* Write the index of a library file */
|
||||
{
|
||||
ObjData* O;
|
||||
unsigned I;
|
||||
|
||||
/* Sync I/O in case the last operation was a read */
|
||||
fseek (NewLib, 0, SEEK_CUR);
|
||||
@ -220,13 +218,11 @@ static void WriteIndex (void)
|
||||
Header.IndexOffs = ftell (NewLib);
|
||||
|
||||
/* Write the object file count */
|
||||
WriteVar (NewLib, ObjCount);
|
||||
WriteVar (NewLib, CollCount (&ObjPool));
|
||||
|
||||
/* Write the object files */
|
||||
O = ObjRoot;
|
||||
while (O) {
|
||||
WriteIndexEntry (O);
|
||||
O = O->Next;
|
||||
for (I = 0; I < CollCount (&ObjPool); ++I) {
|
||||
WriteIndexEntry (CollConstAt (&ObjPool, I));
|
||||
}
|
||||
}
|
||||
|
||||
@ -438,7 +434,7 @@ static void LibCheckExports (ObjData* O)
|
||||
|
||||
/* Insert the name into the hash table */
|
||||
Print (stdout, 1, " %s\n", Name);
|
||||
ExpInsert (Name, O->Index);
|
||||
ExpInsert (Name, O);
|
||||
}
|
||||
}
|
||||
|
||||
@ -456,17 +452,14 @@ void LibClose (void)
|
||||
unsigned char Buf [4096];
|
||||
size_t Count;
|
||||
|
||||
/* Index the object files and make an array containing the objects */
|
||||
MakeObjPool ();
|
||||
|
||||
/* Walk through the object file list, inserting exports into the
|
||||
* export list checking for duplicates. Copy any data that is still
|
||||
* in the old library into the new one.
|
||||
*/
|
||||
for (I = 0; I < ObjCount; ++I) {
|
||||
* export list checking for duplicates. Copy any data that is still
|
||||
* in the old library into the new one.
|
||||
*/
|
||||
for (I = 0; I < CollCount (&ObjPool); ++I) {
|
||||
|
||||
/* Get a pointer to the object */
|
||||
ObjData* O = ObjPool [I];
|
||||
ObjData* O = CollAt (&ObjPool, I);
|
||||
|
||||
/* Check exports, make global export table */
|
||||
LibCheckExports (O);
|
||||
|
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 1998 Ullrich von Bassewitz */
|
||||
/* Wacholderweg 14 */
|
||||
/* D-70597 Stuttgart */
|
||||
/* EMail: uz@musoftware.de */
|
||||
/* (C) 1998-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -36,10 +36,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* ar65 */
|
||||
#include "error.h"
|
||||
#include "objdata.h"
|
||||
#include "library.h"
|
||||
#include "list.h"
|
||||
#include "objdata.h"
|
||||
|
||||
|
||||
|
||||
@ -52,7 +53,8 @@
|
||||
void ListObjFiles (int argc, char* argv [])
|
||||
/* List modules in a library */
|
||||
{
|
||||
ObjData* O;
|
||||
unsigned I;
|
||||
const ObjData* O;
|
||||
|
||||
/* Check the argument count */
|
||||
if (argc <= 0) {
|
||||
@ -66,10 +68,14 @@ void ListObjFiles (int argc, char* argv [])
|
||||
LibOpen (argv [0], 1, 0);
|
||||
|
||||
/* List the modules */
|
||||
O = ObjRoot;
|
||||
while (O) {
|
||||
for (I = 0; I < CollCount (&ObjPool); ++I) {
|
||||
|
||||
/* Get the entry */
|
||||
O = CollConstAt (&ObjPool, I);
|
||||
|
||||
/* Print the name */
|
||||
printf ("%s\n", O->Name);
|
||||
O = O->Next;
|
||||
|
||||
}
|
||||
|
||||
/* Create a new library file and close the old one */
|
||||
|
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
||||
/* Römerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* (C) 1998-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -51,11 +51,8 @@
|
||||
|
||||
|
||||
|
||||
/* Object data list management */
|
||||
unsigned ObjCount = 0; /* Count of object files in the list */
|
||||
ObjData* ObjRoot = 0; /* List of object files */
|
||||
ObjData* ObjLast = 0; /* Last entry in list */
|
||||
ObjData** ObjPool = 0; /* Object files as array */
|
||||
/* Collection with object files */
|
||||
Collection ObjPool = STATIC_COLLECTION_INITIALIZER;
|
||||
|
||||
|
||||
|
||||
@ -72,9 +69,7 @@ ObjData* NewObjData (void)
|
||||
ObjData* O = xmalloc (sizeof (ObjData));
|
||||
|
||||
/* Initialize the data */
|
||||
O->Next = 0;
|
||||
O->Name = 0;
|
||||
O->Index = ~0;
|
||||
O->Flags = 0;
|
||||
O->MTime = 0;
|
||||
O->Start = 0;
|
||||
@ -86,17 +81,8 @@ ObjData* NewObjData (void)
|
||||
O->ExportSize = 0;
|
||||
O->Exports = 0;
|
||||
|
||||
/* Link it into the list */
|
||||
if (ObjLast) {
|
||||
ObjLast->Next = O;
|
||||
ObjLast = O;
|
||||
} else {
|
||||
/* First entry */
|
||||
ObjRoot = ObjLast = O;
|
||||
}
|
||||
|
||||
/* One object file more now */
|
||||
++ObjCount;
|
||||
/* Add it to the list */
|
||||
CollAppend (&ObjPool, O);
|
||||
|
||||
/* Return the new entry */
|
||||
return O;
|
||||
@ -126,13 +112,18 @@ ObjData* FindObjData (const char* Module)
|
||||
* module is not in the list.
|
||||
*/
|
||||
{
|
||||
unsigned I;
|
||||
|
||||
/* Hmm. Maybe we should hash the module names? */
|
||||
ObjData* O = ObjRoot;
|
||||
while (O) {
|
||||
for (I = 0; I < CollCount (&ObjPool); ++I) {
|
||||
|
||||
/* Get this object file */
|
||||
ObjData* O = CollAtUnchecked (&ObjPool, I);
|
||||
|
||||
/* Did we find it? */
|
||||
if (strcmp (O->Name, Module) == 0) {
|
||||
return O;
|
||||
}
|
||||
O = O->Next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -142,31 +133,22 @@ ObjData* FindObjData (const char* Module)
|
||||
void DelObjData (const char* Module)
|
||||
/* Delete the object module from the list */
|
||||
{
|
||||
ObjData* O = ObjRoot;
|
||||
ObjData* Last = 0;
|
||||
while (O) {
|
||||
if (strcmp (O->Name, Module) == 0) {
|
||||
/* Found the module, remove it from the list */
|
||||
if (Last == 0) {
|
||||
/* This was the first entry in the list */
|
||||
ObjRoot = O->Next;
|
||||
} else {
|
||||
Last->Next = O->Next;
|
||||
}
|
||||
if (ObjLast == O) {
|
||||
/* O was the last object in the list */
|
||||
ObjLast = Last;
|
||||
}
|
||||
--ObjCount;
|
||||
unsigned I;
|
||||
for (I = 0; I < CollCount (&ObjPool); ++I) {
|
||||
|
||||
/* Get this object file */
|
||||
ObjData* O = CollAtUnchecked (&ObjPool, I);
|
||||
|
||||
/* Did we find it? */
|
||||
if (strcmp (O->Name, Module) == 0) {
|
||||
|
||||
/* Free the entry */
|
||||
CollDelete (&ObjPool, I);
|
||||
FreeObjData (O);
|
||||
|
||||
/* Done */
|
||||
return;
|
||||
}
|
||||
Last = O;
|
||||
O = O->Next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Not found! */
|
||||
@ -175,52 +157,12 @@ void DelObjData (const char* Module)
|
||||
|
||||
|
||||
|
||||
void MakeObjPool (void)
|
||||
/* Allocate memory, index the entries and make the ObjPool valid */
|
||||
{
|
||||
ObjData* O;
|
||||
unsigned Index;
|
||||
|
||||
/* Allocate memory for the pool */
|
||||
ObjPool = xmalloc (ObjCount * sizeof (ObjData*));
|
||||
|
||||
/* Setup the pointers and index the objects */
|
||||
Index = 0;
|
||||
O = ObjRoot;
|
||||
while (O) {
|
||||
|
||||
/* Safety */
|
||||
CHECK (Index < ObjCount);
|
||||
|
||||
/* Set the Index */
|
||||
O->Index = Index;
|
||||
|
||||
/* Set the pool pointer */
|
||||
ObjPool [Index] = O;
|
||||
|
||||
/* Next object */
|
||||
++Index;
|
||||
O = O->Next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char* GetObjName (unsigned Index)
|
||||
/* Get the name of a module by index */
|
||||
{
|
||||
PRECONDITION (ObjPool != 0 && Index < ObjCount && ObjPool [Index] != 0);
|
||||
return ObjPool [Index]->Name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char* GetObjString (const ObjData* O, unsigned Index)
|
||||
/* Get a string from the string pool of an object file */
|
||||
{
|
||||
if (Index >= O->StringCount) {
|
||||
Error ("Invalid string index (%u) in module `%s'",
|
||||
Index, GetObjName (O->Index));
|
||||
Index, O->Name);
|
||||
}
|
||||
return O->Strings[Index];
|
||||
}
|
||||
|
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
||||
/* Römerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* (C) 1998-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -38,6 +38,11 @@
|
||||
|
||||
|
||||
|
||||
/* common */
|
||||
#include "coll.h"
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Data */
|
||||
/*****************************************************************************/
|
||||
@ -52,9 +57,7 @@
|
||||
/* Internal structure holding object file data */
|
||||
typedef struct ObjData ObjData;
|
||||
struct ObjData {
|
||||
ObjData* Next; /* Linked list of all objects */
|
||||
char* Name; /* Module name */
|
||||
unsigned Index; /* Module index */
|
||||
unsigned Flags;
|
||||
unsigned long MTime; /* Modifiation time of object file */
|
||||
unsigned long Start; /* Start offset of data in library */
|
||||
@ -69,11 +72,8 @@ struct ObjData {
|
||||
|
||||
|
||||
|
||||
/* Object data list management */
|
||||
extern unsigned ObjCount; /* Count of files in the list */
|
||||
extern ObjData* ObjRoot; /* List of object files */
|
||||
extern ObjData* ObjLast; /* Last entry in list */
|
||||
extern ObjData** ObjPool; /* Object files as array */
|
||||
/* Collection with object files */
|
||||
extern Collection ObjPool;
|
||||
|
||||
|
||||
|
||||
@ -97,12 +97,6 @@ ObjData* FindObjData (const char* Module);
|
||||
void DelObjData (const char* Module);
|
||||
/* Delete the object module from the list */
|
||||
|
||||
void MakeObjPool (void);
|
||||
/* Allocate memory, index the entries and make the ObjPool valid */
|
||||
|
||||
const char* GetObjName (unsigned Index);
|
||||
/* Get the name of a module by index */
|
||||
|
||||
const char* GetObjString (const ObjData* O, unsigned Index);
|
||||
/* Get a string from the string pool of an object file */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user