Restructured search path handling.
git-svn-id: svn://svn.cc65.org/cc65/trunk@4662 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
/* */
|
||||
/* searchpath.h */
|
||||
/* */
|
||||
/* Search path path handling for ld65 */
|
||||
/* Handling of search paths */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
@@ -52,34 +52,12 @@
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* 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,25 +79,102 @@ 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.
|
||||
SearchPath* NewSearchPath (void)
|
||||
/* Create a new, empty search path list */
|
||||
{
|
||||
return NewCollection ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
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) {
|
||||
Add (P, NewPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddSearchPathFromEnv (SearchPath* P, const char* EnvVar)
|
||||
/* Add a search path from an environment variable to the end of an existing
|
||||
* list.
|
||||
*/
|
||||
{
|
||||
{
|
||||
AddSearchPath (P, getenv (EnvVar));
|
||||
}
|
||||
|
||||
|
||||
|
||||
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.
|
||||
*/
|
||||
{
|
||||
StrBuf Dir = AUTO_STRBUF_INITIALIZER;
|
||||
|
||||
const char* EnvVal = getenv (EnvVar);
|
||||
if (EnvVal == 0) {
|
||||
/* Not found */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Copy the environment variable to the buffer */
|
||||
SB_CopyStr (&Dir, EnvVal);
|
||||
|
||||
/* Add a path separator if necessary */
|
||||
if (SB_NotEmpty (&Dir)) {
|
||||
if (SB_LookAtLast (&Dir) != '\\' && SB_LookAtLast (&Dir) != '/') {
|
||||
SB_AppendChar (&Dir, '/');
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the subdirectory and terminate the string */
|
||||
SB_AppendStr (&Dir, SubDir);
|
||||
SB_Terminate (&Dir);
|
||||
|
||||
/* Add the search path */
|
||||
AddSearchPath (P, SB_GetConstBuf (&Dir));
|
||||
|
||||
/* Free the temp buffer */
|
||||
SB_Done (&Dir);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ForgetSearchPath (SearchPath* P)
|
||||
/* Forget all search paths in the given list */
|
||||
{
|
||||
unsigned I;
|
||||
for (I = 0; I < CollCount (P); ++I) {
|
||||
xfree (CollAt (P, I));
|
||||
}
|
||||
CollDeleteAll (P);
|
||||
}
|
||||
|
||||
|
||||
|
||||
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 < CollCount (PathList); ++I) {
|
||||
for (I = 0; I < CollCount (P); ++I) {
|
||||
|
||||
/* Copy the next path element into the buffer */
|
||||
SB_CopyStr (&PathName, CollConstAt (PathList, I));
|
||||
SB_CopyStr (&PathName, CollConstAt (P, I));
|
||||
|
||||
/* Add a path separator and the filename */
|
||||
if (SB_NotEmpty (&PathName)) {
|
||||
@@ -143,103 +198,3 @@ static char* Find (const Collection* PathList, const char* File)
|
||||
|
||||
|
||||
|
||||
void AddSearchPath (const char* NewPath, unsigned Where)
|
||||
/* Add a new search path to the existing one */
|
||||
{
|
||||
/* Allow a NULL path */
|
||||
if (NewPath) {
|
||||
unsigned I;
|
||||
for (I = 0; I < MAX_SEARCH_PATHS; ++I) {
|
||||
if (Where & (0x01U << I)) {
|
||||
Add (&SearchPaths[I], NewPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddSearchPathFromEnv (const char* EnvVar, unsigned Where)
|
||||
/* Add a search path from an environment variable */
|
||||
{
|
||||
AddSearchPath (getenv (EnvVar), Where);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned Where)
|
||||
/* Add a search path from an environment variable, adding a subdirectory to
|
||||
* the environment variable value.
|
||||
*/
|
||||
{
|
||||
StrBuf Dir = AUTO_STRBUF_INITIALIZER;
|
||||
|
||||
const char* EnvVal = getenv (EnvVar);
|
||||
if (EnvVal == 0) {
|
||||
/* Not found */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Copy the environment variable to the buffer */
|
||||
SB_CopyStr (&Dir, EnvVal);
|
||||
|
||||
/* Add a path separator if necessary */
|
||||
if (SB_NotEmpty (&Dir)) {
|
||||
if (SB_LookAtLast (&Dir) != '\\' && SB_LookAtLast (&Dir) != '/') {
|
||||
SB_AppendChar (&Dir, '/');
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the subdirectory */
|
||||
SB_AppendStr (&Dir, SubDir);
|
||||
|
||||
/* Terminate the string */
|
||||
SB_Terminate (&Dir);
|
||||
|
||||
/* Add the search path */
|
||||
AddSearchPath (SB_GetConstBuf (&Dir), Where);
|
||||
|
||||
/* Free the temp buffer */
|
||||
SB_Done (&Dir);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ForgetAllSearchPaths (unsigned Where)
|
||||
/* Forget all search paths in the given lists. */
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
char* SearchFile (const char* Name, unsigned Where)
|
||||
/* 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.
|
||||
*/
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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 */
|
||||
@@ -33,11 +33,7 @@
|
||||
|
||||
|
||||
|
||||
/* 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;
|
||||
|
||||
|
||||
|
||||
@@ -63,21 +59,26 @@
|
||||
|
||||
|
||||
|
||||
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 AddSearchPathFromEnv (const char* EnvVar, unsigned Where);
|
||||
/* Add a search path from an environment variable */
|
||||
void AddSearchPath (SearchPath* P, const char* NewPath);
|
||||
/* Add a new search path to the end of an existing list */
|
||||
|
||||
void AddSubSearchPathFromEnv (const char* EnvVar, const char* SubDir, unsigned Where);
|
||||
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 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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user