Restructured search path handling.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4662 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz
2010-05-09 10:54:15 +00:00
parent d95bb2e600
commit 05f7296369
20 changed files with 277 additions and 405 deletions

View File

@@ -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;
}

View 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 */
@@ -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.
*/