]> git.sur5r.net Git - cc65/blobdiff - src/ca65/filetab.c
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / ca65 / filetab.c
index 3f7b415e3b0b6e940dd854648cd5693b7510dede..bf5b32503c14a71a247ced711db841323c9319fa 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                filetab.h                                 */
+/*                                 filetab.h                                 */
 /*                                                                           */
-/*                        Input file table for ca65                         */
+/*                         Input file table for ca65                         */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
@@ -33,7 +33,9 @@
 
 
 
+#include <stdio.h>
 #include <string.h>
+#include <errno.h>
 
 /* common */
 #include "check.h"
@@ -44,6 +46,7 @@
 /* ca65 */
 #include "error.h"
 #include "filetab.h"
+#include "global.h"
 #include "objfile.h"
 #include "spool.h"
 
 static unsigned HT_GenHash (const void* Key);
 /* Generate the hash over a key. */
 
-static const void* HT_GetKey (void* Entry);
+static const void* HT_GetKey (const void* Entry);
 /* Given a pointer to the user entry data, return a pointer to the key. */
 
-static HashNode* HT_GetHashNode (void* Entry);
-/* Given a pointer to the user entry data, return a pointer to the hash node */
-
 static int HT_Compare (const void* Key1, const void* Key2);
 /* Compare two keys. The function must return a value less than zero if
  * Key1 is smaller than Key2, zero if both are equal, and a value greater
@@ -73,7 +73,7 @@ static int HT_Compare (const void* Key1, const void* Key2);
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
@@ -87,9 +87,10 @@ typedef struct FileEntry FileEntry;
 struct FileEntry {
     HashNode            Node;
     unsigned            Name;           /* File name */
-    unsigned           Index;          /* Index of entry */
-    unsigned long      Size;           /* Size of file */
-    unsigned long      MTime;          /* Time of last modification */
+    unsigned            Index;          /* Index of entry */
+    FileType            Type;           /* Type of file */
+    unsigned long       Size;           /* Size of file */
+    unsigned long       MTime;          /* Time of last modification */
 };
 
 /* Array of all entries, listed by index */
@@ -99,7 +100,6 @@ static Collection FileTab = STATIC_COLLECTION_INITIALIZER;
 static const HashFunctions HashFunc = {
     HT_GenHash,
     HT_GetKey,
-    HT_GetHashNode,
     HT_Compare
 };
 
@@ -122,7 +122,7 @@ static unsigned HT_GenHash (const void* Key)
 
 
 
-static const void* HT_GetKey (void* Entry)
+static const void* HT_GetKey (const void* Entry)
 /* Given a pointer to the user entry data, return a pointer to the index */
 {
     return &((FileEntry*) Entry)->Name;
@@ -130,14 +130,6 @@ static const void* HT_GetKey (void* Entry)
 
 
 
-static HashNode* HT_GetHashNode (void* Entry)
-/* Given a pointer to the user entry data, return a pointer to the hash node */
-{
-    return &((FileEntry*) Entry)->Node;
-}
-
-
-
 static int HT_Compare (const void* Key1, const void* Key2)
 /* Compare two keys. The function must return a value less than zero if
  * Key1 is smaller than Key2, zero if both are equal, and a value greater
@@ -150,29 +142,31 @@ static int HT_Compare (const void* Key1, const void* Key2)
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
 
-static FileEntry* NewFileEntry (unsigned Name, unsigned long Size, unsigned long MTime)
+static FileEntry* NewFileEntry (unsigned Name, FileType Type,
+                                unsigned long Size, unsigned long MTime)
 /* Create a new FileEntry, insert it into the tables and return it */
 {
     /* Allocate memory for the entry */
     FileEntry* F = xmalloc (sizeof (FileEntry));
 
     /* Initialize the fields */
-    InitHashNode (&F->Node, F);
+    InitHashNode (&F->Node);
     F->Name     = Name;
-    F->Index   = CollCount (&FileTab) + 1;     /* First file has index #1 */
-    F->Size    = Size;
-    F->MTime   = MTime;
+    F->Index    = CollCount (&FileTab) + 1;     /* First file has index #1 */
+    F->Type     = Type;
+    F->Size     = Size;
+    F->MTime    = MTime;
 
     /* Insert the file into the file table */
     CollAppend (&FileTab, F);
 
     /* Insert the entry into the hash table */
-    HT_Insert (&HashTab, &F->Node);
+    HT_Insert (&HashTab, F);
 
     /* Return the new entry */
     return F;
@@ -183,21 +177,21 @@ static FileEntry* NewFileEntry (unsigned Name, unsigned long Size, unsigned long
 const StrBuf* GetFileName (unsigned Name)
 /* Get the name of a file where the name index is known */
 {
-    static StrBuf ErrorMsg = LIT_STRBUF_INITIALIZER ("(outside file scope)");
+    static const StrBuf ErrorMsg = LIT_STRBUF_INITIALIZER ("(outside file scope)");
 
     const FileEntry* F;
 
     if (Name == 0) {
-       /* Name was defined outside any file scope, use the name of the first
-        * file instead. Errors are then reported with a file position of
-        * line zero in the first file.
-        */
-       if (CollCount (&FileTab) == 0) {
-           /* No files defined until now */
+        /* Name was defined outside any file scope, use the name of the first
+         * file instead. Errors are then reported with a file position of
+         * line zero in the first file.
+         */
+        if (CollCount (&FileTab) == 0) {
+            /* No files defined until now */
             return &ErrorMsg;
-       } else {
+        } else {
             F = CollConstAt (&FileTab, 0);
-       }
+        }
     } else {
         F = CollConstAt (&FileTab, Name-1);
     }
@@ -213,7 +207,7 @@ unsigned GetFileIndex (const StrBuf* Name)
     unsigned NameIdx = GetStrBufId (Name);
 
     /* Search in the hash table for the name */
-    FileEntry* F = HT_FindEntry (&HashTab, &NameIdx);
+    const FileEntry* F = HT_Find (&HashTab, &NameIdx);
 
     /* If we don't have this index, print a diagnostic and use the main file */
     if (F == 0) {
@@ -226,13 +220,14 @@ unsigned GetFileIndex (const StrBuf* Name)
 
 
 
-unsigned AddFile (const StrBuf* Name, unsigned long Size, unsigned long MTime)
+unsigned AddFile (const StrBuf* Name, FileType Type,
+                  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.
  */
 {
     /* Create a new file entry and insert it into the tables */
-    FileEntry* F = NewFileEntry (GetStrBufId (Name), Size, MTime);
+    FileEntry* F = NewFileEntry (GetStrBufId (Name), Type, Size, MTime);
 
     /* Return the index */
     return F->Index;
@@ -253,12 +248,12 @@ void WriteFiles (void)
 
     /* Write the file data */
     for (I = 0; I < CollCount (&FileTab); ++I) {
-       /* Get a pointer to the entry */
-       const FileEntry* F = CollConstAt (&FileTab, I);
-       /* Write the fields */
-       ObjWriteVar (F->Name);
-       ObjWrite32 (F->MTime);
-       ObjWrite32 (F->Size);
+        /* Get a pointer to the entry */
+        const FileEntry* F = CollConstAt (&FileTab, I);
+        /* Write the fields */
+        ObjWriteVar (F->Name);
+        ObjWrite32 (F->MTime);
+        ObjWriteVar (F->Size);
     }
 
     /* Done writing files */
@@ -267,4 +262,79 @@ void WriteFiles (void)
 
 
 
+static void WriteDep (FILE* F, FileType Types)
+/* Helper function. Writes all file names that match Types to the output */
+{
+    unsigned I;
+
+    /* Loop over all files */
+    for (I = 0; I < CollCount (&FileTab); ++I) {
+
+        const StrBuf* Filename;
+
+        /* Get the next input file */
+        const FileEntry* E = (const FileEntry*) CollAt (&FileTab, I);
+
+        /* Ignore it if it is not of the correct type */
+        if ((E->Type & Types) == 0) {
+            continue;
+        }
+
+        /* If this is not the first file, add a space */
+        if (I > 0) {
+            fputc (' ', F);
+        }
+
+        /* Print the dependency */
+        Filename = GetStrBuf (E->Name);
+        fprintf (F, "%*s", SB_GetLen (Filename), SB_GetConstBuf (Filename));
+    }
+}
+
+
+
+static void CreateDepFile (const char* Name, FileType Types)
+/* Create a dependency file with the given name and place dependencies for
+ * all files with the given types there.
+ */
+{
+    /* Open the file */
+    FILE* F = fopen (Name, "w");
+    if (F == 0) {
+        Fatal ("Cannot open dependency file `%s': %s", Name, strerror (errno));
+    }
+
+    /* Print the output file followed by a tab char */
+    fprintf (F, "%s:\t", OutFile);
+
+    /* Write out the dependencies for the output file */
+    WriteDep (F, Types);
+    fputs ("\n\n", F);
+
+    /* Write out a phony dependency for the included files */
+    WriteDep (F, Types);
+    fputs (":\n\n", F);
+
+    /* Close the file, check for errors */
+    if (fclose (F) != 0) {
+        remove (Name);
+        Fatal ("Cannot write to dependeny file (disk full?)");
+    }
+}
+
+
+
+void CreateDependencies (void)
+/* Create dependency files requested by the user */
+{
+    if (SB_NotEmpty (&DepName)) {
+        CreateDepFile (SB_GetConstBuf (&DepName),
+                       FT_MAIN | FT_INCLUDE | FT_BINARY);
+    }
+    if (SB_NotEmpty (&FullDepName)) {
+        CreateDepFile (SB_GetConstBuf (&FullDepName),
+                       FT_MAIN | FT_INCLUDE | FT_BINARY | FT_DBGINFO);
+    }
+}
+