]> git.sur5r.net Git - cc65/commitdiff
Changed file type and search path handling
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 2 Jun 2003 13:37:05 +0000 (13:37 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 2 Jun 2003 13:37:05 +0000 (13:37 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2185 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/main.c
src/ld65/objfile.c

index f6073c8ffaae4fd4cfc355dd31ba154b9f8cf240..0024fef17e8373180edac705a96a8032ad4cd321 100644 (file)
@@ -40,6 +40,7 @@
 
 /* common */
 #include "cmdline.h"
+#include "filetype.h"
 #include "libdefs.h"
 #include "objdefs.h"
 #include "print.h"
@@ -73,8 +74,6 @@
 
 static unsigned                ObjFiles   = 0; /* Count of object files linked */
 static unsigned                LibFiles   = 0; /* Count of library files linked */
-static const char*     LibPath    = 0; /* Search path for modules */
-static unsigned                LibPathLen = 0; /* Length of LibPath */
 
 
 
@@ -108,9 +107,11 @@ static void Usage (void)
                     "  --config name\t\tUse linker config file\n"
              "  --dump-config name\tDump a builtin configuration\n"
             "  --help\t\tHelp (this text)\n"
+             "  --lib file\t\tLink this library\n"
              "  --lib-path path\tSpecify a library search path\n"
             "  --mapfile name\tCreate a map file\n"
              "  --module-id id\tSpecify a module id\n"
+             "  --obj file\t\tLink this object file\n"
              "  --obj-path path\tSpecify an object file search path\n"
                     "  --start-addr addr\tSet the default start address\n"
                     "  --target sys\t\tSet the target system\n"
@@ -147,78 +148,75 @@ static unsigned long CvtNumber (const char* Arg, const char* Number)
 
 
 
-static int HasPath (const char* Name)
-/* Check if the given Name has a path component */
+static void LinkFile (const char* Name, FILETYPE Type)
+/* Handle one file */
 {
-    return strchr (Name, '/') != 0 || strchr (Name, '\\') != 0;
-}
+    char*         PathName;
+    FILE*         F;
+    unsigned long Magic;
 
 
+    /* If we don't know the file type, determine it from the extension */
+    if (Type == FILETYPE_UNKNOWN) {
+        Type = GetFileType (Name);
+    }
 
-static void LinkFile (const char* Name)
-/* Handle one file */
-{
-    unsigned long Magic;
-    unsigned Len;
-    char* NewName = 0;
+    /* For known file types, search the file in the directory list */
+    switch (Type) {
 
-    /* Try to open the file */
-    FILE* F = fopen (Name, "rb");
-    if (F == 0) {
-       /* We couldn't open the file. If the name doesn't have a path, and we
-        * have a search path given, try the name with the search path
-        * prepended.
-        */
-       if (LibPathLen > 0 && !HasPath (Name)) {
-           /* Allocate memory. Account for the trailing zero, and for a
-            * path separator character eventually needed.
-            */
-           Len = LibPathLen;
-           NewName = xmalloc (strlen (Name) + Len + 2);
-           /* Build the new name */
-           memcpy (NewName, LibPath, Len);
-           if (NewName [Len-1] != '/' && NewName [Len-1] != '\\') {
-               /* We need an additional path separator */
-               NewName [Len++] = '/';
-           }
-           strcpy (NewName + Len, Name);
+        case FILETYPE_LIB:
+            PathName = SearchFile (Name, SEARCH_LIB);
+            break;
 
-           /* Now try to open the new file */
-           F = fopen (NewName, "rb");
-       }
+        case FILETYPE_OBJ:
+            PathName = SearchFile (Name, SEARCH_OBJ);
+            break;
 
-       if (F == 0) {
-           Error ("Cannot open `%s': %s", Name, strerror (errno));
-       }
+        default:
+            PathName = xstrdup (Name);   /* Use the name as is */
+            break;
+    }
+
+    /* We must have a valid name now */
+    if (PathName == 0) {
+        Error ("Input file `%s' not found", Name);
+    }
+
+    /* Try to open the file */
+    F = fopen (PathName, "rb");
+    if (F == 0) {
+        Error ("Cannot open `%s': %s", PathName, strerror (errno));
     }
 
     /* Read the magic word */
     Magic = Read32 (F);
 
-    /* Do we know this type of file? */
+    /* Check the magic for known file types. The handling is somewhat weird
+     * since we may have given a file with a ".lib" extension, which was
+     * searched and found in a directory for library files, but we now find
+     * out (by looking at the magic) that it's indeed an object file. We just
+     * ignore the problem and hope no one will notice...
+     */
     switch (Magic) {
 
-       case OBJ_MAGIC:
-           ObjAdd (F, Name);
-           ++ObjFiles;
-           break;
+               case OBJ_MAGIC:
+                   ObjAdd (F, PathName);
+                   ++ObjFiles;
+                   break;
 
-       case LIB_MAGIC:
-           LibAdd (F, Name);
-           ++LibFiles;
-           break;
+               case LIB_MAGIC:
+                   LibAdd (F, PathName);
+                   ++LibFiles;
+                   break;
 
-       default:
+               default:
            fclose (F);
-           Error ("File `%s' has unknown type", Name);
+           Error ("File `%s' has unknown type", PathName);
 
     }
 
-    /* If we have allocated memory, free it here. Note: Memory will not always
-     * be freed if we run into an error, but that's no problem. Adding more
-     * code to work around it will use more memory than the chunk that's lost.
-     */
-    xfree (NewName);
+    /* Free allocated memory. */
+    xfree (PathName);
 }
 
 
@@ -234,10 +232,19 @@ static void OptCfgPath (const char* Opt attribute ((unused)), const char* Arg)
 static void OptConfig (const char* Opt attribute ((unused)), const char* Arg)
 /* Define the config file */
 {
+    char* PathName;
+
     if (CfgAvail ()) {
        Error ("Cannot use -C/-t twice");
     }
-    CfgSetName (Arg);
+    /* Search for the file */
+    PathName = SearchFile (Arg, SEARCH_CFG);
+    if (PathName == 0) {
+        Error ("Cannot find config file `%s'", Arg);
+    } else {
+        CfgSetName (PathName);
+        xfree (PathName);
+    }
 }
 
 
@@ -275,6 +282,14 @@ static void OptHelp (const char* Opt attribute ((unused)),
 
 
 
+static void OptLib (const char* Opt attribute ((unused)), const char* Arg)
+/* Link a library */
+{
+    LinkFile (Arg, FILETYPE_LIB);
+}
+
+
+
 static void OptLibPath (const char* Opt attribute ((unused)), const char* Arg)
 /* Specify a library file search path */
 {
@@ -303,6 +318,14 @@ static void OptModuleId (const char* Opt, const char* Arg)
 
 
 
+static void OptObj (const char* Opt attribute ((unused)), const char* Arg)
+/* Link an object file */
+{
+    LinkFile (Arg, FILETYPE_OBJ);
+}
+
+
+
 static void OptObjPath (const char* Opt attribute ((unused)), const char* Arg)
 /* Specify an object file search path */
 {
@@ -362,9 +385,11 @@ int main (int argc, char* argv [])
        { "--dbgfile",          1,      OptDbgFile              },
                { "--dump-config",      1,      OptDumpConfig           },
        { "--help",             0,      OptHelp                 },
+        { "--lib",              1,      OptLib                  },
                { "--lib-path",         1,      OptLibPath              },
        { "--mapfile",          1,      OptMapFile              },
                { "--module-id",        1,      OptModuleId             },
+        { "--obj",              1,      OptObj                  },
                { "--obj-path",         1,      OptObjPath              },
        { "--start-addr",       1,      OptStartAddr            },
        { "--target",           1,      OptTarget               },
@@ -376,17 +401,8 @@ int main (int argc, char* argv [])
     /* Initialize the cmdline module */
     InitCmdLine (&argc, &argv, "ld65");
 
-    /* Evaluate the CC65_LIB environment variable */
-    LibPath = getenv ("CC65_LIB");
-    if (LibPath == 0) {
-       /* Use some default path */
-#ifdef CC65_LIB
-       LibPath = CC65_LIB;
-#else
-       LibPath = "/usr/lib/cc65/lib/";
-#endif
-    }
-    LibPathLen = strlen (LibPath);
+    /* Initialize the input file search paths */
+    InitSearchPaths ();
 
     /* Check the parameters */
     I = 1;
@@ -462,7 +478,7 @@ int main (int argc, char* argv [])
        } else {
 
            /* A filename */
-           LinkFile (Arg);
+           LinkFile (Arg, FILETYPE_UNKNOWN);
 
        }
 
index 899a612e4cd8f1fc5b28298d8eb4a4e6f0f92eb6..89875fd797b5634e30384e02d8a021e2d9b26728 100644 (file)
@@ -40,6 +40,7 @@
 #include <sys/stat.h>
 
 /* common */
+#include "fname.h"
 #include "xmalloc.h"
 
 /* ld65 */
@@ -65,14 +66,7 @@ static const char* GetModule (const char* Name)
 /* Get a module name from the file name */
 {
     /* Make a module name from the file name */
-    const char* Module = Name + strlen (Name);
-    while (Module > Name) {
-       --Module;
-       if (*Module == '/' || *Module == '\\') {
-           ++Module;
-           break;
-       }
-    }
+    const char* Module = FindName (Name);
     if (*Module == 0) {
        Error ("Cannot make module name from `%s'", Name);
     }