X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fincpath.c;h=fdbca2a078e4b768334bca85e16d998a9f99aea0;hb=7aefd9b4e7b67908b7b3c38b6003c7f1a8d3ee2d;hp=0349c253da293475719596579fce00896c7333bc;hpb=114bc5a3706c91758583df69e87507efee23806f;p=cc65 diff --git a/src/cc65/incpath.c b/src/cc65/incpath.c index 0349c253d..fdbca2a07 100644 --- a/src/cc65/incpath.c +++ b/src/cc65/incpath.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 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 */ @@ -33,157 +33,58 @@ -#include -#include -#if defined(_MSC_VER) -/* Microsoft compiler */ -# include -# define R_OK 4 -#else -/* Anyone else */ -# include -#endif - -#include "mem.h" +/* cc65 */ #include "incpath.h" /*****************************************************************************/ -/* Data */ +/* Data */ /*****************************************************************************/ -static char* SysIncludePath = 0; -static char* UserIncludePath = 0; +SearchPath* SysIncSearchPath; /* System include path */ +SearchPath* UsrIncSearchPath; /* User include path */ /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ -static char* Add (char* Orig, const char* New) -/* Create a new path from Orig and New, delete Orig, return the result */ +void ForgetAllIncludePaths (void) +/* Remove all include search paths. */ { - 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); - - /* 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; + ForgetSearchPath (SysIncSearchPath); + ForgetSearchPath (UsrIncSearchPath); } -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. - */ +void InitIncludePaths (void) +/* Initialize the include path search list */ { - 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, R_OK) == 0) { - /* The file exists */ - return xstrdup (PathName); - } - - /* Skip a list separator if we have one */ - if (*P == ';') { - ++P; - } - } - - /* Not found */ - return 0; -} - - + /* Create the search path lists */ + SysIncSearchPath = NewSearchPath (); + UsrIncSearchPath = NewSearchPath (); -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); - } - } -} + /* 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 (SysIncSearchPath, CC65_INC); +#endif + /* Add specific paths from the environment */ + AddSearchPathFromEnv (SysIncSearchPath, "CC65_INC"); + AddSearchPathFromEnv (UsrIncSearchPath, "CC65_INC"); -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. - */ -{ - 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; + /* Add paths relative to a main directory defined in an env var */ + AddSubSearchPathFromEnv (SysIncSearchPath, "CC65_HOME", "include"); }