X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Finput.c;h=6db7df5f8e508b5661c5838f86797edd13d2f94f;hb=23fbf3ff2a8956483bffaf1943967e04074cf443;hp=0a00e3956c5210314d1d38e65601884c9830c9b1;hpb=544705e6f456abaef98462d78325b4d1907bc6b0;p=cc65 diff --git a/src/cc65/input.c b/src/cc65/input.c index 0a00e3956..6db7df5f8 100644 --- a/src/cc65/input.c +++ b/src/cc65/input.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include /* common */ #include "check.h" @@ -44,9 +46,10 @@ /* cc65 */ #include "asmcode.h" +#include "codegen.h" #include "error.h" -#include "global.h" #include "incpath.h" +#include "lineinfo.h" #include "input.h" @@ -69,20 +72,12 @@ char NextC = '\0'; /* Maximum count of nested includes */ #define MAX_INC_NESTING 16 -/* Struct that describes an input file */ -typedef struct IFile IFile; -struct IFile { - unsigned Index; /* File index */ - unsigned Usage; /* Usage counter */ - char Name[1]; /* Name of file (dynamically allocated) */ -}; - /* Struct that describes an active input file */ typedef struct AFile AFile; struct AFile { unsigned Line; /* Line number for this file */ FILE* F; /* Input file stream */ - const char* Name; /* Points to corresponding IFile name */ + IFile* Input; /* Points to corresponding IFile */ }; /* List of all input files */ @@ -94,7 +89,7 @@ static Collection AFiles = STATIC_COLLECTION_INITIALIZER; /*****************************************************************************/ -/* struct IFile */ +/* struct IFile */ /*****************************************************************************/ @@ -111,6 +106,8 @@ static IFile* NewIFile (const char* Name) /* Initialize the fields */ IF->Index = CollCount (&IFiles) + 1; IF->Usage = 0; + IF->Size = 0; + IF->MTime = 0; memcpy (IF->Name, Name, Len+1); /* Insert the new structure into the IFile collection */ @@ -137,10 +134,26 @@ static AFile* NewAFile (IFile* IF, FILE* F) /* Initialize the fields */ AF->Line = 0; AF->F = F; - AF->Name = IF->Name; + AF->Input = IF; + + /* Increment the usage counter of the corresponding IFile. If this + * is the first use, set the file data and output debug info if + * requested. + */ + if (IF->Usage++ == 0) { - /* Increment the usage counter of the corresponding IFile */ - ++IF->Usage; + /* Get file size and modification time */ + struct stat Buf; + if (fstat (fileno (F), &Buf) != 0) { + /* Error */ + Fatal ("Cannot stat `%s': %s", IF->Name, strerror (errno)); + } + IF->Size = (unsigned long) Buf.st_size; + IF->MTime = (unsigned long) Buf.st_mtime; + + /* Set the debug data */ + g_fileinfo (IF->Name, IF->Size, IF->MTime); + } /* Insert the new structure into the AFile collection */ CollAppend (&AFiles, AF); @@ -379,13 +392,6 @@ int NextLine (void) } line [Len] = '\0'; - /* Output the source line in the generated assembler file - * if requested. - */ - if (AddSource && line[Start] != '\0') { - AddCodeLine ("; %s", line+Start); - } - /* Check if we have a line continuation character at the end. If not, * we're done. */ @@ -399,6 +405,9 @@ int NextLine (void) /* Got a line. Initialize the current and next characters. */ InitLine (line); + /* Create line information for this line */ + UpdateLineInfo (Input->Input, Input->Line, line); + /* Done */ return 1; } @@ -411,7 +420,7 @@ const char* GetCurrentFile (void) unsigned AFileCount = CollCount (&AFiles); if (AFileCount > 0) { const AFile* AF = (const AFile*) CollAt (&AFiles, AFileCount-1); - return AF->Name; + return AF->Input->Name; } else { /* No open file. Use the main file if we have one. */ unsigned IFileCount = CollCount (&IFiles);