X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fincpath.c;h=937a0d9bf64d80ef0eeda5bf6b4e6090d14d6be3;hb=9b7c16ec4cbb5282642c377272224e3fc825f860;hp=0d2110d6aafe12b84eef1db624a8052337e27bf2;hpb=9aa85743ba769c056bc36e8214dc65c15ac5c45a;p=cc65 diff --git a/src/cc65/incpath.c b/src/cc65/incpath.c index 0d2110d6a..937a0d9bf 100644 --- a/src/cc65/incpath.c +++ b/src/cc65/incpath.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -33,142 +33,24 @@ -#include -#include -#include -#if defined(_MSC_VER) -/* Microsoft compiler */ -# include -#else -/* Anyone else */ -# include -#endif - /* common */ -#include "xmalloc.h" +#include "searchpath.h" /* cc65 */ #include "incpath.h" -/*****************************************************************************/ -/* Data */ -/*****************************************************************************/ - - - -static char* SysIncludePath = 0; -static char* UserIncludePath = 0; - - - /*****************************************************************************/ /* Code */ /*****************************************************************************/ -static char* Add (char* Orig, const char* New) -/* Create a new path from Orig and New, delete Orig, return the result */ -{ - 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 = (char*) xmalloc (OrigLen + NewLen + 2); - - /* Copy the strings */ - memcpy (NewPath, Orig, OrigLen); - memcpy (NewPath+OrigLen, New, NewLen); - NewPath [OrigLen+NewLen+0] = ';'; - NewPath [OrigLen+NewLen+1] = '\0'; - - /* 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 AddIncludePath (const char* NewPath, unsigned Where) /* Add a new include path to the existing one */ { - /* Allow a NULL path */ - if (NewPath) { - if (Where & INC_SYS) { - SysIncludePath = Add (SysIncludePath, NewPath); - } - if (Where & INC_USER) { - UserIncludePath = Add (UserIncludePath, NewPath); - } - } + AddSearchPath (NewPath, Where); } @@ -178,15 +60,15 @@ char* FindInclude (const char* Name, unsigned Where) * the complete path, if found, return 0 otherwise. */ { - if (Where & INC_SYS) { - /* Search in the system include directories */ - return Find (SysIncludePath, Name); - } - if (Where & INC_USER) { - /* Search in the user include directories */ - return Find (UserIncludePath, Name); - } - return 0; + return SearchFile (Name, Where); +} + + + +void ForgetAllIncludePaths (void) +/* Remove all include search paths. */ +{ + ForgetAllSearchPaths (INC_SYS | INC_USER); } @@ -194,20 +76,19 @@ char* FindInclude (const char* Name, unsigned Where) void InitIncludePaths (void) /* Initialize the include path search list */ { - const char* Path; - /* Add some standard paths to the include search path */ - AddIncludePath ("", INC_USER); /* Current directory */ - AddIncludePath ("include", INC_SYS); + AddSearchPath ("", INC_USER); /* Current directory */ + + /* Add some compiled in search paths if defined at compile time */ #ifdef CC65_INC - AddIncludePath (CC65_INC, INC_SYS); -#else - AddIncludePath ("/usr/lib/cc65/include", INC_SYS); + AddSearchPath (CC65_INC, INC_SYS); #endif - Path = getenv ("CC65_INC"); - if (Path) { - AddIncludePath (Path, INC_SYS | INC_USER); - } + + /* Add specific paths from the environment */ + AddSearchPathFromEnv ("CC65_INC", INC_SYS | INC_USER); + + /* Add paths relative to a main directory defined in an env var */ + AddSubSearchPathFromEnv ("CC65_HOME", "include", INC_SYS); }