/* */
/* searchpath.h */
/* */
-/* Search path path handling for ld65 */
+/* Handling of search paths */
/* */
/* */
/* */
-/* (C) 2000-2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2000-2013, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-/* 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. */
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
-/* Maximum number of search paths */
-#define MAX_SEARCH_PATHS 8
+/* Convert argument to C string */
+#define _STRINGIZE(arg) #arg
+#define STRINGIZE(arg) _STRINGIZE(arg)
+
+/* A search path is a pointer to the list */
+typedef struct Collection SearchPath;
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
-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 (SearchPath* P, const char* EnvVar);
+/* Add a search path from an environment variable to the end of an existing
+ * list.
+ */
+
+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 AddSubSearchPathFromWinBin (SearchPath* P, const char* SubDir);
+/* Windows only:
+ * Add a search path from the running binary, adding a subdirectory to
+ * the parent directory of the directory containing the binary.
+ */
+
+int PushSearchPath (SearchPath* P, const char* NewPath);
+/* Add a new search path to the head of an existing search path list, provided
+ * that it's not already there. If the path is already at the first position,
+ * return zero, otherwise return a non zero value.
+ */
-void AddSearchPathFromEnv (const char* EnvVar, unsigned Where);
-/* Add a search from an environment variable */
+void PopSearchPath (SearchPath* P);
+/* Remove a search path from the head of an existing search path 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.
*/