]> git.sur5r.net Git - cc65/commitdiff
Restructured search path handling.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 9 May 2010 10:54:15 +0000 (10:54 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 9 May 2010 10:54:15 +0000 (10:54 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4662 b7a2c559-68d2-44c3-8de9-860c34a00d81

20 files changed:
src/ca65/incpath.c
src/ca65/incpath.h
src/ca65/main.c
src/ca65/pseudo.c
src/ca65/scanner.c
src/cc65/incpath.c
src/cc65/incpath.h
src/cc65/input.c
src/cc65/input.h
src/cc65/main.c
src/cc65/preproc.c
src/common/searchpath.c
src/common/searchpath.h
src/ld65/filepath.c
src/ld65/filepath.h
src/ld65/main.c
src/sim65/chippath.c
src/sim65/chippath.h
src/sim65/main.c
src/sim65/scanner.c

index def4102ced83c0636b3d783b5ac44083befcc1ba..59749d8d234ad59dee2699e78c748f077fb304a2 100644 (file)
 
 
 
-/* common */
-#include "searchpath.h"
-
 /* ca65 */
 #include "incpath.h"
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
 
-void AddIncludePath (const char* NewPath, unsigned Where)
-/* Add a new include path to the existing one */
-{
-    AddSearchPath (NewPath, Where);
-}
+SearchPath*     IncSearchPath;          /* Standard include path */
+SearchPath*     BinSearchPath;          /* Binary include path */
 
 
 
-char* FindInclude (const char* Name, unsigned Where)
-/* Find an include file. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
-{
-    /* Search in the include directories */
-    return SearchFile (Name, Where);
-}
+/*****************************************************************************/
+/*                                          Code                                    */
+/*****************************************************************************/
 
 
 
 void ForgetAllIncludePaths (void)
 /* Remove all include search paths. */
 {
-    ForgetAllSearchPaths (INC_STD | INC_BIN);
+    ForgetSearchPath (IncSearchPath);
+    ForgetSearchPath (BinSearchPath);
 }
 
 
@@ -77,20 +67,24 @@ void ForgetAllIncludePaths (void)
 void InitIncludePaths (void)
 /* Initialize the include path search list */
 {
-    /* Add some standard paths to the include search path */
-    AddSearchPath ("", INC_STD);               /* Current directory */
-    AddSearchPath ("", INC_BIN);
+    /* Create the search path lists */
+    IncSearchPath = NewSearchPath ();
+    BinSearchPath = NewSearchPath ();
+
+    /* Add the current directory to the search paths */
+    AddSearchPath (IncSearchPath, "");
+    AddSearchPath (BinSearchPath, "");
 
     /* Add some compiled in search paths if defined at compile time */
 #ifdef CA65_INC
-    AddSearchPath (CA65_INC, INC_STD);
+    AddSearchPath (IncSearchPath, CA65_INC);
 #endif
 
     /* Add specific paths from the environment */
-    AddSearchPathFromEnv ("CA65_INC", INC_STD);
+    AddSearchPathFromEnv (IncSearchPath, "CA65_INC");
 
     /* Add paths relative to a main directory defined in an env var */
-    AddSubSearchPathFromEnv ("CC65_HOME", "asminc", INC_STD);
+    AddSubSearchPathFromEnv (IncSearchPath, "CC65_HOME", "asminc");
 }
 
 
index 82cd0d2e29f6a538eecc6421eff4fc5c6c5d95cc..b2484cc96fee5b2ed663ded5a761a3ddb7ad4e91 100644 (file)
 
 
 
+/* common */
+#include "searchpath.h"
+
+
+
 /*****************************************************************************/
 /*                                  Data                                    */
 /*****************************************************************************/
 
 
 
-#define INC_STD         0x0001U         /* Add to standard include path */
-#define INC_BIN         0x0002U         /* Add to binary include path */
+extern SearchPath*      IncSearchPath;          /* Standard include path */
+extern SearchPath*      BinSearchPath;          /* Binary include path */
 
 
 
 
 
 
-void AddIncludePath (const char* NewPath, unsigned Where);
-/* Add a new include path to the existing one */
-
-char* FindInclude (const char* Name, unsigned Where);
-/* Find an include file. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
-
 void ForgetAllIncludePaths (void);
 /* Remove all include search paths. */
 
index aaf0bd80223caf2907da52f172afe56c609bfd64..b552e8363fc5c5cb86a2f3a52b19a08db3998432 100644 (file)
@@ -360,8 +360,8 @@ static void OptAutoImport (const char* Opt attribute ((unused)),
 
 static void OptBinIncludeDir (const char* Opt attribute ((unused)), const char* Arg)
 /* Add an include search path for binaries */
-{
-    AddIncludePath (Arg, INC_BIN);
+{                        
+    AddSearchPath (BinSearchPath, Arg);
 }
 
 
@@ -450,7 +450,7 @@ static void OptIgnoreCase (const char* Opt attribute ((unused)),
 static void OptIncludeDir (const char* Opt attribute ((unused)), const char* Arg)
 /* Add an include search path */
 {
-    AddIncludePath (Arg, INC_STD);
+    AddSearchPath (IncSearchPath, Arg);
 }
 
 
@@ -1025,8 +1025,8 @@ int main (int argc, char* argv [])
         SegDump ();
     }
 
-    /* If we didn't have any errors, create the object, listing and 
-     * dependency files 
+    /* If we didn't have any errors, create the object, listing and
+     * dependency files
      */
     if (ErrorCount == 0) {
        CreateObjFile ();
index 07001b3050b88443e1d5ec4d0fdde841dedbdb43..239075f1b981e4504f59feb0ff2a05307e1b71fe 100644 (file)
@@ -1122,7 +1122,7 @@ static void DoIncBin (void)
     if (F == 0) {
 
                /* Search for the file in the binary include directory */
-       char* PathName = FindInclude (SB_GetConstBuf (&Name), INC_BIN);
+       char* PathName = SearchFile (BinSearchPath, SB_GetConstBuf (&Name));
                if (PathName == 0 || (F = fopen (PathName, "rb")) == 0) {
            /* Not found or cannot open, print an error and bail out */
                    ErrorSkip ("Cannot open include file `%m%p': %s", &Name, strerror (errno));
@@ -1148,7 +1148,7 @@ static void DoIncBin (void)
      * while it was open. Since mtime and size are only used to check
      * if a file has changed in the debugger, we will ignore this problem
      * here.
-     */               
+     */
     SB_Terminate (&Name);
     if (stat (SB_GetConstBuf (&Name), &StatBuf) != 0) {
         Fatal ("Cannot stat input file `%m%p': %s", &Name, strerror (errno));
index 90ee9fee71f00879bc1a526586b97d539fe68500..102590abcc8deea50673f5d957249d9aefdbb24e 100644 (file)
@@ -456,7 +456,7 @@ int NewInputFile (const char* Name)
                /* We are on include level. Search for the file in the include
         * directories.
         */
-       PathName = FindInclude (Name, INC_STD);
+       PathName = SearchFile (IncSearchPath, Name);
                if (PathName == 0 || (F = fopen (PathName, "r")) == 0) {
            /* Not found or cannot open, print an error and bail out */
            Error ("Cannot open include file `%s': %s", Name, strerror (errno));
index 937a0d9bf64d80ef0eeda5bf6b4e6090d14d6be3..fdbca2a078e4b768334bca85e16d998a9f99aea0 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2009, Ullrich von Bassewitz                                      */
+/* (C) 2000-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 
 
 
-/* common */
-#include "searchpath.h"
-
 /* cc65 */
 #include "incpath.h"
 
 
 
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                                          Data                                    */
 /*****************************************************************************/
 
 
 
-void AddIncludePath (const char* NewPath, unsigned Where)
-/* Add a new include path to the existing one */
-{
-    AddSearchPath (NewPath, Where);
-}
+SearchPath*     SysIncSearchPath;       /* System include path */
+SearchPath*     UsrIncSearchPath;       /* User include path */
 
 
 
-char* FindInclude (const char* Name, unsigned Where)
-/* Find an include file. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
-{
-    return SearchFile (Name, Where);
-}
+/*****************************************************************************/
+/*                                  Code                                    */
+/*****************************************************************************/
 
 
 
 void ForgetAllIncludePaths (void)
 /* Remove all include search paths. */
 {
-    ForgetAllSearchPaths (INC_SYS | INC_USER);
+    ForgetSearchPath (SysIncSearchPath);
+    ForgetSearchPath (UsrIncSearchPath);
 }
 
 
@@ -76,19 +67,24 @@ void ForgetAllIncludePaths (void)
 void InitIncludePaths (void)
 /* Initialize the include path search list */
 {
-    /* Add some standard paths to the include search path */
-    AddSearchPath ("", INC_USER);              /* Current directory */
+    /* Create the search path lists */
+    SysIncSearchPath = NewSearchPath ();
+    UsrIncSearchPath = NewSearchPath ();
+
+    /* Add the current path to the user search path list */
+    AddSearchPath (UsrIncSearchPath, "");
 
     /* Add some compiled in search paths if defined at compile time */
 #ifdef CC65_INC
-    AddSearchPath (CC65_INC, INC_SYS);
+    AddSearchPath (SysIncSearchPath, CC65_INC);
 #endif
 
     /* Add specific paths from the environment */
-    AddSearchPathFromEnv ("CC65_INC", INC_SYS | INC_USER);
+    AddSearchPathFromEnv (SysIncSearchPath, "CC65_INC");
+    AddSearchPathFromEnv (UsrIncSearchPath, "CC65_INC");
 
     /* Add paths relative to a main directory defined in an env var */
-    AddSubSearchPathFromEnv ("CC65_HOME", "include", INC_SYS);
+    AddSubSearchPathFromEnv (SysIncSearchPath, "CC65_HOME", "include");
 }
 
 
index 26ab52f45a7388a119e0865983386c2a77df69c6..dba920f6d64341129b589eb4704a66541dc955f1 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2009, Ullrich von Bassewitz                                      */
+/* (C) 2000-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 
 
 
+/* common */
+#include "searchpath.h"
+
+
+
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                          Data                                    */
 /*****************************************************************************/
 
 
 
-#define INC_SYS                0x0001          /* Add to system include path */
-#define INC_USER       0x0002          /* Add to user include path */
+extern SearchPath*      SysIncSearchPath;       /* System include path */
+extern SearchPath*      UsrIncSearchPath;       /* User include path */
 
 
 
 
 
 
-void AddIncludePath (const char* NewPath, unsigned Where);
-/* Add a new include path to the existing one */
-
-char* FindInclude (const char* Name, unsigned Where);
-/* Find an include file. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
-
 void ForgetAllIncludePaths (void);
 /* Remove all include search paths. */
 
index 7b6f808d6ec84a2496078465ab4c582b780543d0..46d3809692220567953219458ddc51b0a4c8e8ac 100644 (file)
 
 
 
-/* An enum that describes different types of input files. The members are
- * choosen so that it is possible to combine them to bitsets
- */
-typedef enum {
-    IT_MAIN     = 0x01,         /* Main input file */
-    IT_SYSINC   = 0x02,         /* System include file (using <>) */
-    IT_USERINC  = 0x04,         /* User include file (using "") */
-} InputType;
-
 /* The current input line */
 StrBuf* Line;
 
@@ -263,7 +254,7 @@ void OpenMainFile (const char* Name)
 
 
 
-void OpenIncludeFile (const char* Name, unsigned DirSpec)
+void OpenIncludeFile (const char* Name, InputType IT)
 /* Open an include file and insert it into the tables. */
 {
     char*  N;
@@ -277,7 +268,7 @@ void OpenIncludeFile (const char* Name, unsigned DirSpec)
     }
 
     /* Search for the file */
-    N = FindInclude (Name, DirSpec);
+    N = SearchFile ((IT == IT_SYSINC)? SysIncSearchPath : UsrIncSearchPath, Name);
     if (N == 0) {
        PPError ("Include file `%s' not found", Name);
        return;
@@ -288,7 +279,7 @@ void OpenIncludeFile (const char* Name, unsigned DirSpec)
      */
     IF = FindFile (N);
     if (IF == 0) {
-       IF = NewIFile (N, (DirSpec == INC_SYS)? IT_SYSINC : IT_USERINC);
+       IF = NewIFile (N, IT);
     }
 
     /* We don't need N any longer, since we may now use IF->Name */
@@ -590,7 +581,7 @@ static void CreateDepFile (const char* Name, InputType Types)
 /* Create a dependency file with the given name and place dependencies for
  * all files with the given types there.
  */
-{      
+{
     const char* Target;
 
     /* Open the file */
@@ -631,11 +622,11 @@ void CreateDependencies (void)
 {
     if (SB_NotEmpty (&DepName)) {
         CreateDepFile (SB_GetConstBuf (&DepName),
-                       IT_MAIN | IT_USERINC);
+                       IT_MAIN | IT_USRINC);
     }
     if (SB_NotEmpty (&FullDepName)) {
         CreateDepFile (SB_GetConstBuf (&FullDepName),
-                       IT_MAIN | IT_SYSINC | IT_USERINC);
+                       IT_MAIN | IT_SYSINC | IT_USRINC);
     }
 }
 
index 27ccce77aeec53ec8a89405b4dad677270c80c3d..dfa0ad03b92eaabd56bfa7b863fde985cc1682cc 100644 (file)
 
 
 
+/* An enum that describes different types of input files. The members are
+ * choosen so that it is possible to combine them to bitsets
+ */
+typedef enum {
+    IT_MAIN     = 0x01,         /* Main input file */
+    IT_SYSINC   = 0x02,         /* System include file (using <>) */
+    IT_USRINC  = 0x04,          /* User include file (using "") */
+} InputType;
+
 /* Forward for an IFile structure */
 struct IFile;
 
@@ -72,7 +81,7 @@ extern char NextC;
 void OpenMainFile (const char* Name);
 /* Open the main file. Will call Fatal() in case of failures. */
 
-void OpenIncludeFile (const char* Name, unsigned DirSpec);
+void OpenIncludeFile (const char* Name, InputType IT);
 /* Open an include file and insert it into the tables. */
 
 void NextChar (void);
index 63081855acd8257985bd33cfc7a068fc00eda797..692b7fe7a2f7fa0f7f91ae955e13df1b16e1cda7 100644 (file)
@@ -543,8 +543,9 @@ static void OptHelp (const char* Opt attribute ((unused)),
 
 static void OptIncludeDir (const char* Opt attribute ((unused)), const char* Arg)
 /* Add an include search path */
-{
-    AddIncludePath (Arg, INC_SYS | INC_USER);
+{                        
+    AddSearchPath (SysIncSearchPath, Arg);
+    AddSearchPath (UsrIncSearchPath, Arg);
 }
 
 
index 4fcdb40d25084526d77d5b507bdfbdc1f2f6b564..8edeacdd79bb20ab8761b88f402feb3445358986 100644 (file)
@@ -1112,7 +1112,7 @@ static void DoInclude (void)
 /* Open an include file. */
 {
     char       RTerm;
-    unsigned   DirSpec;
+    InputType   IT;
     StrBuf      Filename = STATIC_STRBUF_INITIALIZER;
 
 
@@ -1129,12 +1129,12 @@ static void DoInclude (void)
 
                case '\"':
                    RTerm   = '\"';
-                   DirSpec = INC_USER;
+                   IT = IT_USRINC;
                    break;
 
                case '<':
                    RTerm   = '>';
-                   DirSpec = INC_SYS;
+                   IT = IT_SYSINC;
                    break;
 
                default:
@@ -1153,7 +1153,7 @@ static void DoInclude (void)
     /* Check if we got a terminator */
     if (CurC == RTerm) {
         /* Open the include file */
-        OpenIncludeFile (SB_GetConstBuf (&Filename), DirSpec);
+        OpenIncludeFile (SB_GetConstBuf (&Filename), IT);
     } else if (CurC == '\0') {
                /* No terminator found */
                PPError ("#include expects \"FILENAME\" or <FILENAME>");
index d71326b8b170e14151b98b062d87b4493952d52e..c44a9c9a80449fed740c6afaa24b9b30c0e626bf 100644 (file)
@@ -2,7 +2,7 @@
 /*                                                                           */
 /*                               searchpath.h                                */
 /*                                                                           */
-/*                    Search path path handling for ld65                     */
+/*                         Handling of search paths                          */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                  Code                                    */
 /*****************************************************************************/
 
 
 
-/* A search path list is a collection containing path elements. We have
- * several of those.
- */
-static Collection SearchPaths[MAX_SEARCH_PATHS] = {
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-    STATIC_COLLECTION_INITIALIZER,
-};
-
-
-
-/*****************************************************************************/
-/*                                  Code                                    */
-/*****************************************************************************/
-
-
-
-static void Add (Collection* Paths, const char* New)
+static void Add (SearchPath* P, const char* New)
 /* Cleanup a new search path and add it to the list */
 {
     unsigned NewLen;
@@ -101,73 +79,41 @@ static void Add (Collection* Paths, const char* New)
     NewPath [NewLen] = '\0';
 
     /* Add the path to the collection */
-    CollAppend (Paths, NewPath);
+    CollAppend (P, NewPath);
 }
 
 
 
-static char* Find (const Collection* PathList, const char* File)
-/* Search for a file in a list of directories. If found, return the complete
- * name including the path in a malloced data area, if not found, return 0.
- */
-{               
-    char* Name = 0;
-    StrBuf PathName = AUTO_STRBUF_INITIALIZER;
-
-    /* Start the search */
-    unsigned I;
-    for (I = 0; I < CollCount (PathList); ++I) {
-
-        /* Copy the next path element into the buffer */
-        SB_CopyStr (&PathName, CollConstAt (PathList, I));
-
-       /* Add a path separator and the filename */
-               if (SB_NotEmpty (&PathName)) {
-           SB_AppendChar (&PathName, '/');
-       }
-       SB_AppendStr (&PathName, File);
-       SB_Terminate (&PathName);
-
-       /* Check if this file exists */
-               if (access (SB_GetBuf (&PathName), 0) == 0) {
-           /* The file exists, we're done */
-           Name = xstrdup (SB_GetBuf (&PathName));
-            break;
-       }
-    }
-
-    /* Cleanup and return the result of the search */
-    SB_Done (&PathName);
-    return Name;
+SearchPath* NewSearchPath (void)
+/* Create a new, empty search path list */
+{
+    return NewCollection ();
 }
 
 
 
-void AddSearchPath (const char* NewPath, unsigned Where)
-/* Add a new search path to the existing one */
+void AddSearchPath (SearchPath* P, const char* NewPath)
+/* Add a new search path to the end of an existing list */
 {
     /* Allow a NULL path */
     if (NewPath) {
-        unsigned I;
-        for (I = 0; I < MAX_SEARCH_PATHS; ++I) {
-            if (Where & (0x01U << I)) {
-                Add (&SearchPaths[I], NewPath);
-            }
-        }
+        Add (P, NewPath);
     }
 }
 
 
 
-void AddSearchPathFromEnv (const char* EnvVar, unsigned Where)
-/* Add a search path from an environment variable */
+void AddSearchPathFromEnv (SearchPath* P, const char* EnvVar)
+/* Add a search path from an environment variable to the end of an existing
+ * list.
+ */
 {
-    AddSearchPath (getenv (EnvVar), Where);
+    AddSearchPath (P, getenv (EnvVar));
 }
 
 
 
-void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned Where)
+void AddSubSearchPathFromEnv (SearchPath* P, const char* EnvVar, const char* SubDir)
 /* Add a search path from an environment variable, adding a subdirectory to
  * the environment variable value.
  */
@@ -190,14 +136,12 @@ void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned W
        }
     }
 
-    /* Add the subdirectory */
+    /* Add the subdirectory and terminate the string */
     SB_AppendStr (&Dir, SubDir);
-
-    /* Terminate the string */
     SB_Terminate (&Dir);
 
     /* Add the search path */
-    AddSearchPath (SB_GetConstBuf (&Dir), Where);
+    AddSearchPath (P, SB_GetConstBuf (&Dir));
 
     /* Free the temp buffer */
     SB_Done (&Dir);
@@ -205,40 +149,51 @@ void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned W
 
 
 
-void ForgetAllSearchPaths (unsigned Where)
-/* Forget all search paths in the given lists. */
+void ForgetSearchPath (SearchPath* P)
+/* Forget all search paths in the given list */
 {
     unsigned I;
-    for (I = 0; I < MAX_SEARCH_PATHS; ++I) {
-        if (Where & (0x01U << I)) {
-            unsigned J;
-            Collection* P = &SearchPaths[I];
-            for (J = 0; J < CollCount (P); ++J) {
-                xfree (CollAt (P, J));
-            }
-            CollDeleteAll (P);
-        }
+    for (I = 0; I < CollCount (P); ++I) {
+        xfree (CollAt (P, I));
     }
+    CollDeleteAll (P);
 }
 
 
 
-char* SearchFile (const char* Name, unsigned Where)
+char* SearchFile (const SearchPath* P, const char* File)
 /* Search for a file in a list of directories. Return a pointer to a malloced
  * area that contains the complete path, if found, return 0 otherwise.
  */
 {
+    char* Name = 0;
+    StrBuf PathName = AUTO_STRBUF_INITIALIZER;
+
+    /* Start the search */
     unsigned I;
-    for (I = 0; I < MAX_SEARCH_PATHS; ++I) {
-        if (Where & (0x01U << I)) {
-            char* Path = Find (&SearchPaths[I], Name);
-            if (Path) {
-                /* Found the file */
-                return Path;
-            }
-        }
+    for (I = 0; I < CollCount (P); ++I) {
+
+        /* Copy the next path element into the buffer */
+        SB_CopyStr (&PathName, CollConstAt (P, I));
+
+       /* Add a path separator and the filename */
+               if (SB_NotEmpty (&PathName)) {
+           SB_AppendChar (&PathName, '/');
+       }
+       SB_AppendStr (&PathName, File);
+       SB_Terminate (&PathName);
+
+       /* Check if this file exists */
+               if (access (SB_GetBuf (&PathName), 0) == 0) {
+           /* The file exists, we're done */
+           Name = xstrdup (SB_GetBuf (&PathName));
+            break;
+       }
     }
-    return 0;
+
+    /* Cleanup and return the result of the search */
+    SB_Done (&PathName);
+    return Name;
 }
 
 
index 181560f4caa5812228117cf6de4e91c085415171..fa833d1390bc385327056eff8bd6472018e9c259 100644 (file)
@@ -2,11 +2,11 @@
 /*                                                                           */
 /*                               searchpath.h                                */
 /*                                                                           */
-/*                    Search path path handling for ld65                     */
+/*                         Handling of search paths                          */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2009, Ullrich von Bassewitz                                      */
+/* (C) 2000-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 
 
 
-/* Exports facilities to search files in a list of directories. 8 of these
- * lists are managed, and each list can contain an arbitrary number of
- * directories. The "Where" argument is actually a bitset, specifying which
- * of the search lists should be used when adding paths or searching files.
- */
+/* Exports facilities to search files in a list of directories. */
 
 
 
@@ -52,8 +48,8 @@
 
 
 
-/* Maximum number of search paths */
-#define MAX_SEARCH_PATHS        8
+/* A search path is a pointer to the list */
+typedef struct Collection SearchPath;
 
 
 
 
 
 
-void AddSearchPath (const char* NewPath, unsigned Where);
-/* Add a new search path to the existing one */
+SearchPath* NewSearchPath (void);
+/* Create a new, empty search path list */
+
+void AddSearchPath (SearchPath* P, const char* NewPath);
+/* Add a new search path to the end of an existing list */
 
-void AddSearchPathFromEnv (const char* EnvVar, unsigned Where);
-/* Add a search path from an environment variable */
+void AddSearchPathFromEnv (SearchPath* P, const char* EnvVar);
+/* Add a search path from an environment variable to the end of an existing
+ * list.
+ */
 
-void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned Where);
+void AddSubSearchPathFromEnv (SearchPath* P, const char* EnvVar, const char* SubDir);
 /* Add a search path from an environment variable, adding a subdirectory to
  * the environment variable value.
  */
 
-void ForgetAllSearchPaths (unsigned Where);
-/* Forget all search paths in the given lists. */
+void ForgetSearchPath (SearchPath* P);
+/* Forget all search paths in the given list */
 
-char* SearchFile (const char* Name, unsigned Where);
+char* SearchFile (const SearchPath* P, const char* File);
 /* Search for a file in a list of directories. Return a pointer to a malloced
  * area that contains the complete path, if found, return 0 otherwise.
  */
index 7cbc24ac1c6ae7d39214faaca0ffea3d59d43a5e..aa7d547e275f50f441e2020ff40acbe5f088a3af 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003-2009, Ullrich von Bassewitz                                      */
+/* (C) 2003-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 
 
 
-/* common */
-#include "searchpath.h"
-
 /* ld65 */
 #include "filepath.h"
 
 
 
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+SearchPath*      LibSearchPath;         /* Library path */
+SearchPath*      ObjSearchPath;         /* Object file path */
+SearchPath*      CfgSearchPath;         /* Config file path */
+
+
+
 /*****************************************************************************/
 /*                                  Code                                    */
 /*****************************************************************************/
 void InitSearchPaths (void)
 /* Initialize the path search list */
 {
+    /* Create the search path lists */
+    LibSearchPath = NewSearchPath ();
+    ObjSearchPath = NewSearchPath ();
+    CfgSearchPath = NewSearchPath ();
+
     /* Always search all stuff in the current directory */
-    AddSearchPath ("", SEARCH_LIB | SEARCH_OBJ | SEARCH_CFG);
+    AddSearchPath (LibSearchPath, "");
+    AddSearchPath (ObjSearchPath, "");
+    AddSearchPath (CfgSearchPath, "");
 
     /* Add some compiled in search paths if defined at compile time */
 #if defined(LD65_LIB)
-    AddSearchPath (LD65_LIB, SEARCH_LIB);
+    AddSearchPath (LibSearchPath, LD65_LIB);
 #endif
 #if defined(LD65_OBJ)
-    AddSearchPath (LD65_OBJ, SEARCH_OBJ);
+    AddSearchPath (ObjSearchPath, LD65_OBJ);
 #endif
 #if defined(LD65_CFG)
-    AddSearchPath (LD65_CFG, SEARCH_CFG);
+    AddSearchPath (CfgSearchPath, LD65_CFG);
 #endif
 
     /* Add specific paths from the environment */
-    AddSearchPathFromEnv ("LD65_CFG", SEARCH_CFG);
-    AddSearchPathFromEnv ("LD65_LIB", SEARCH_LIB);
-    AddSearchPathFromEnv ("LD65_OBJ", SEARCH_OBJ);
+    AddSearchPathFromEnv (LibSearchPath, "LD65_LIB");
+    AddSearchPathFromEnv (ObjSearchPath, "LD65_OBJ");
+    AddSearchPathFromEnv (CfgSearchPath, "LD65_CFG");
 
     /* Add paths relative to a main directory defined in an env var */
-    AddSubSearchPathFromEnv ("CC65_HOME", "cfg", SEARCH_CFG);
-    AddSubSearchPathFromEnv ("CC65_HOME", "lib", SEARCH_LIB);
-    AddSubSearchPathFromEnv ("CC65_HOME", "obj", SEARCH_OBJ);
+    AddSubSearchPathFromEnv (LibSearchPath, "CC65_HOME", "lib");
+    AddSubSearchPathFromEnv (ObjSearchPath, "CC65_HOME", "obj");
+    AddSubSearchPathFromEnv (CfgSearchPath, "CC65_HOME", "cfg");
 }
 
 
index f1a501c1a19204c89f4a8e2caa132bf46333cf38..45d9a90c75489f88a8b3ca854850c7b6232d6d8c 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003      Ullrich von Bassewitz                                       */
-/*               Römerstrasse 52                                             */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2003-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -37,7 +37,7 @@
 #define FILEPATH_H
 
 
-                       
+
 /* common */
 #include "searchpath.h"
 
@@ -49,9 +49,9 @@
 
 
 
-#define SEARCH_LIB      0x0001U         /* Library path */
-#define SEARCH_OBJ      0x0002U         /* Object file path */
-#define SEARCH_CFG      0x0004U         /* Config file path */
+extern SearchPath*      LibSearchPath;          /* Library path */
+extern SearchPath*      ObjSearchPath;          /* Object file path */
+extern SearchPath*      CfgSearchPath;          /* Config file path */
 
 
 
index 4b7a5353f718b6b7eb13077f6fe2890a0a074e9d..10fff402e6c05a0d484397405ca2996453822e1f 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                          */
 /*                                                                          */
 /*                                                                          */
-/* (C) 1998-2009, Ullrich von Bassewitz                                      */
+/* (C) 1998-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -177,11 +177,11 @@ static void LinkFile (const char* Name, FILETYPE Type)
     switch (Type) {
 
         case FILETYPE_LIB:
-            PathName = SearchFile (Name, SEARCH_LIB);
+            PathName = SearchFile (LibSearchPath, Name);
             break;
 
         case FILETYPE_OBJ:
-            PathName = SearchFile (Name, SEARCH_OBJ);
+            PathName = SearchFile (ObjSearchPath, Name);
             break;
 
         default:
@@ -282,7 +282,7 @@ static void DefineSymbol (const char* Def)
 static void OptCfgPath (const char* Opt attribute ((unused)), const char* Arg)
 /* Specify a config file search path */
 {
-    AddSearchPath (Arg, SEARCH_CFG);
+    AddSearchPath (CfgSearchPath, Arg);
 }
 
 
@@ -296,7 +296,7 @@ static void OptConfig (const char* Opt attribute ((unused)), const char* Arg)
        Error ("Cannot use -C/-t twice");
     }
     /* Search for the file */
-    PathName = SearchFile (Arg, SEARCH_CFG);
+    PathName = SearchFile (CfgSearchPath, Arg);
     if (PathName == 0) {
         Error ("Cannot find config file `%s'", Arg);
     } else {
@@ -405,7 +405,7 @@ static void OptLib (const char* Opt attribute ((unused)), const char* Arg)
 static void OptLibPath (const char* Opt attribute ((unused)), const char* Arg)
 /* Specify a library file search path */
 {
-    AddSearchPath (Arg, SEARCH_LIB);
+    AddSearchPath (LibSearchPath, Arg);
 }
 
 
@@ -441,7 +441,7 @@ static void OptObj (const char* Opt attribute ((unused)), const char* Arg)
 static void OptObjPath (const char* Opt attribute ((unused)), const char* Arg)
 /* Specify an object file search path */
 {
-    AddSearchPath (Arg, SEARCH_OBJ);
+    AddSearchPath (ObjSearchPath, Arg);
 }
 
 
index f39431fcdfc2f05060e0e8980a14771b4c091832..d3befeeea1ec503a7bb42e2736b85d95c4b00022 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2002 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 2000-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #  include <unistd.h>
 #endif
 
-/* common */
-#include "xmalloc.h"
-
 /* sim65 */
 #include "chippath.h"
 
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                          Data                                    */
 /*****************************************************************************/
 
 
 
-static char* ChipPath  = 0;
+SearchPath*     ChipSearchPath;         /* Search paths for chip libs */
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                          Code                                    */
 /*****************************************************************************/
 
 
 
-static char* Add (char* Orig, const char* New)
-/* Create a new path from Orig and New, delete Orig, return the result */
+void InitChipPaths (void)
+/* Initialize the chip search path list */
 {
-    unsigned OrigLen, NewLen;
-    char* NewPath;
-
-    /* Get the length of the original string */
-    OrigLen = Orig? strlen (Orig) : 0;
-
-    /* Get the length of the new path */
-    NewLen = strlen (New);
-
-    /* Check for a trailing path separator and remove it */
-    if (NewLen > 0 && (New [NewLen-1] == '\\' || New [NewLen-1] == '/')) {
-       --NewLen;
-    }
-
-    /* Allocate memory for the new string */
-    NewPath = xmalloc (OrigLen + NewLen + 2);
+    /* Create the search path list */
+    ChipSearchPath = NewSearchPath ();
 
-    /* Copy the strings */
-    memcpy (NewPath, Orig, OrigLen);
-    memcpy (NewPath+OrigLen, New, NewLen);
-    NewPath [OrigLen+NewLen+0] = ';';
-    NewPath [OrigLen+NewLen+1] = '\0';
+    /* Add the current directory to the search path */
+    AddSearchPath (ChipSearchPath, "");
 
-    /* Delete the original path */
-    xfree (Orig);
-
-    /* Return the new path */
-    return NewPath;
 }
 
 
 
-static char* Find (const char* Path, const char* File)
-/* Search for a file in a list of directories. If found, return the complete
- * name including the path in a malloced data area, if not found, return 0.
- */
-{
-    const char* P;
-    int Max;
-    char PathName [FILENAME_MAX];
-
-    /* Initialize variables */
-    Max = sizeof (PathName) - strlen (File) - 2;
-    if (Max < 0) {
-       return 0;
-    }
-    P = Path;
-
-    /* Handle a NULL pointer as replacement for an empty string */
-    if (P == 0) {
-       P = "";
-    }
-
-    /* Start the search */
-    while (*P) {
-        /* Copy the next path element into the buffer */
-       int Count = 0;
-       while (*P != '\0' && *P != ';' && Count < Max) {
-           PathName [Count++] = *P++;
-       }
-
-       /* Add a path separator and the filename */
-       if (Count) {
-           PathName [Count++] = '/';
-       }
-       strcpy (PathName + Count, File);
-
-       /* Check if this file exists */
-       if (access (PathName, 0) == 0) {
-           /* The file exists */
-           return xstrdup (PathName);
-       }
-
-       /* Skip a list separator if we have one */
-       if (*P == ';') {
-           ++P;
-       }
-    }
-
-    /* Not found */
-    return 0;
-}
-
-
-
-void AddChipPath (const char* NewPath)
-/* Add a search path for chips */
-{
-    /* Allow a NULL path */
-    if (NewPath) {
-       ChipPath = Add (ChipPath, NewPath);
-    }
-}
-
-
-
-char* FindChipLib (const char* LibName)
-/* Find a chip library. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
-{
-    /* Search in the include directories */
-    return Find (ChipPath, LibName);
-}
-
 
 
index 82560bb21e56eb5c80c64b2d82e2c410c2f371f9..1bc864a5a86d6883cf59c05d334c642fe1024f76 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2002 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* (C) 2000-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 
 
+/* common */
+#include "searchpath.h"
+
+
+
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                          Data                                    */
 /*****************************************************************************/
 
 
 
-void AddChipPath (const char* NewPath);
-/* Add a search path for chips */
+extern SearchPath*      ChipSearchPath; /* Search paths for chip libs */
+
+
+
+/*****************************************************************************/
+/*                                          Code                                    */
+/*****************************************************************************/
+
+
 
-char* FindChipLib (const char* LibName);
-/* Find a chip library. Return a pointer to a malloced area that contains
- * the complete path, if found, return 0 otherwise.
- */
+void InitChipPaths (void);
+/* Initialize the chip search path list */
 
 
 
index fe8fa2994f628b1bdf01d89380bb782cb0f4b642..cddad788724834f19321bf5bdff860f40c21a8c5 100644 (file)
@@ -233,6 +233,9 @@ int main (int argc, char* argv[])
     /* Initialize the cmdline module */
     InitCmdLine (&argc, &argv, "sim65");
 
+    /* Initialize the chip library search paths */
+    InitChipPaths ();
+
     /* Parse the command line */
     I = 1;
     while (I < ArgCount) {
index eb94e3a68af4f53e285b024073293b73c726bc52..3e6ab739f6e4dcc5524050fbda22b769da2a2a7c 100644 (file)
@@ -305,7 +305,7 @@ void CfgConsume (cfgtok_t T, const char* Msg)
 /* Skip a token, print an error message if not found */
 {
     if (CfgTok != T) {
-               CfgError (Msg);
+               CfgError ("%s", Msg);
     }
     CfgNextTok ();
 }