mirror of
https://github.com/cc65/cc65.git
synced 2024-12-26 08:32:00 +00:00
Change the implementation of the file table. It may now grow to an arbitrary
size. It is also possible to search in the table by name, which will be needed later to add line debug information. git-svn-id: svn://svn.cc65.org/cc65/trunk@262 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
097a01094e
commit
bb115c8ae2
@ -186,6 +186,7 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap)
|
||||
"Counter underflow",
|
||||
"Undefined label",
|
||||
"Open `%s´",
|
||||
"File name `%s' not found in file table",
|
||||
};
|
||||
|
||||
fprintf (stderr, "%s(%lu): Error #%u: ",
|
||||
|
@ -38,7 +38,8 @@
|
||||
|
||||
|
||||
|
||||
#include "scanner.h"
|
||||
/* common */
|
||||
#include "filepos.h"
|
||||
|
||||
|
||||
|
||||
@ -126,6 +127,7 @@ enum Errors {
|
||||
ERR_COUNTER_UNDERFLOW,
|
||||
ERR_UNDEFINED_LABEL,
|
||||
ERR_OPEN_STMT,
|
||||
ERR_FILENAME_NOT_FOUND,
|
||||
ERR_COUNT /* Error count */
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
/* common */
|
||||
#include "check.h"
|
||||
#include "hashstr.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
/* ca65 */
|
||||
@ -50,13 +51,24 @@
|
||||
|
||||
|
||||
|
||||
/* List of input files */
|
||||
static struct {
|
||||
unsigned long MTime; /* Time of last modification */
|
||||
/* An entry in the file table */
|
||||
typedef struct FileEntry FileEntry;
|
||||
struct FileEntry {
|
||||
FileEntry* Next; /* Next in hash list */
|
||||
unsigned Index; /* Index of entry */
|
||||
unsigned long Size; /* Size of file */
|
||||
const char* Name; /* Name of file */
|
||||
} Files [MAX_INPUT_FILES];
|
||||
unsigned long MTime; /* Time of last modification */
|
||||
char Name[1]; /* Name, dynamically allocated */
|
||||
};
|
||||
|
||||
/* Array of all entries, listed by index */
|
||||
static FileEntry** FileTab = 0;
|
||||
static unsigned FileCount = 0;
|
||||
static unsigned FileMax = 0;
|
||||
|
||||
/* Hash table, hashed by name */
|
||||
#define HASHTAB_SIZE 31
|
||||
static FileEntry* HashTab[HASHTAB_SIZE];
|
||||
|
||||
|
||||
|
||||
@ -66,6 +78,52 @@ static unsigned FileCount = 0;
|
||||
|
||||
|
||||
|
||||
static FileEntry* NewFileEntry (const char* Name, unsigned long Size, unsigned long MTime)
|
||||
/* Create a new FileEntry, insert it into the tables and return it */
|
||||
{
|
||||
/* Get the length of the name */
|
||||
unsigned Len = strlen (Name);
|
||||
|
||||
/* Get the hash over the name */
|
||||
unsigned Hash = HashStr (Name) % HASHTAB_SIZE;
|
||||
|
||||
/* Allocate memory for the entry */
|
||||
FileEntry* F = xmalloc (sizeof (FileEntry) + Len);
|
||||
|
||||
/* Initialize the fields */
|
||||
F->Index = FileCount+1;
|
||||
F->Size = Size;
|
||||
F->MTime = MTime;
|
||||
memcpy (F->Name, Name, Len+1);
|
||||
|
||||
/* Count the entries and grow the file table if needed */
|
||||
if (FileCount >= FileMax) {
|
||||
/* We need to grow the table. Create a new one. */
|
||||
unsigned NewFileMax = (FileMax == 0)? 32 : FileMax * 2;
|
||||
FileEntry** NewFileTab = xmalloc (sizeof (FileEntry*) * NewFileMax);
|
||||
|
||||
/* Copy the old entries */
|
||||
memcpy (NewFileTab, FileTab, sizeof (FileEntry*) * FileCount);
|
||||
|
||||
/* Use the new table */
|
||||
xfree (FileTab);
|
||||
FileTab = NewFileTab;
|
||||
FileMax = NewFileMax;
|
||||
}
|
||||
|
||||
/* Insert the file into the file table */
|
||||
FileTab [FileCount++] = F;
|
||||
|
||||
/* Insert the entry into the hash table */
|
||||
F->Next = HashTab[Hash];
|
||||
HashTab[Hash] = F;
|
||||
|
||||
/* Return the new entry */
|
||||
return F;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char* GetFileName (unsigned Name)
|
||||
/* Get the name of a file where the name index is known */
|
||||
{
|
||||
@ -79,33 +137,50 @@ const char* GetFileName (unsigned Name)
|
||||
/* No files defined until now */
|
||||
return "(outside file scope)";
|
||||
} else {
|
||||
return Files [0].Name;
|
||||
return FileTab [0]->Name;
|
||||
}
|
||||
} else {
|
||||
return Files [Name-1].Name;
|
||||
return FileTab [Name-1]->Name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned GetFileIndex (const char* Name)
|
||||
/* Return the file index for the given file name. */
|
||||
{
|
||||
/* Get the hash over the name */
|
||||
unsigned Hash = HashStr (Name) % HASHTAB_SIZE;
|
||||
|
||||
/* Search the linear hash list */
|
||||
FileEntry* F = HashTab[Hash];
|
||||
while (F) {
|
||||
/* Is it this one? */
|
||||
if (strcmp (Name, F->Name) == 0) {
|
||||
/* Found, return the index */
|
||||
return F->Index;
|
||||
}
|
||||
/* No, check next */
|
||||
F = F->Next;
|
||||
}
|
||||
|
||||
/* Not found, use main file */
|
||||
Error (ERR_FILENAME_NOT_FOUND, Name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned AddFile (const char* Name, unsigned long Size, unsigned long MTime)
|
||||
/* Add a new file to the list of input files. Return the index of the file in
|
||||
* the table.
|
||||
*/
|
||||
{
|
||||
/* Check for a table overflow */
|
||||
if (FileCount >= MAX_INPUT_FILES) {
|
||||
/* Table overflow */
|
||||
Fatal (FAT_MAX_INPUT_FILES);
|
||||
}
|
||||
/* Create a new file entry and insert it into the tables */
|
||||
FileEntry* F = NewFileEntry (Name, Size, MTime);
|
||||
|
||||
/* Add the file to the table */
|
||||
Files [FileCount].Name = xstrdup (Name);
|
||||
Files [FileCount].Size = Size;
|
||||
Files [FileCount].MTime = MTime;
|
||||
|
||||
/* One more file */
|
||||
return ++FileCount;
|
||||
/* Return the index */
|
||||
return F->Index;
|
||||
}
|
||||
|
||||
|
||||
@ -123,9 +198,12 @@ void WriteFiles (void)
|
||||
|
||||
/* Write the file data */
|
||||
for (I = 0; I < FileCount; ++I) {
|
||||
ObjWrite32 (Files [I].MTime);
|
||||
ObjWrite32 (Files [I].Size);
|
||||
ObjWriteStr (Files [I].Name);
|
||||
/* Get a pointer to the entry */
|
||||
FileEntry* F = FileTab[I];
|
||||
/* Write the fields */
|
||||
ObjWrite32 (F->MTime);
|
||||
ObjWrite32 (F->Size);
|
||||
ObjWriteStr (F->Name);
|
||||
}
|
||||
|
||||
/* Done writing files */
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "error.h"
|
||||
#include "expr.h"
|
||||
#include "objfile.h"
|
||||
#include "scanner.h"
|
||||
#include "symtab.h"
|
||||
|
||||
|
||||
|
@ -40,8 +40,10 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../common/exprdefs.h"
|
||||
/* common */
|
||||
#include "exprdefs.h"
|
||||
|
||||
/* ca65 */
|
||||
#include "symentry.h"
|
||||
|
||||
|
||||
@ -143,3 +145,4 @@ void WriteDbgSyms (void);
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -38,6 +38,10 @@
|
||||
|
||||
|
||||
|
||||
#include "scanner.h"
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Data */
|
||||
/*****************************************************************************/
|
||||
|
Loading…
Reference in New Issue
Block a user