From fda9a3b49a6e7d4ee9560e3f4077d7ed57738dfa Mon Sep 17 00:00:00 2001 From: cuz Date: Wed, 28 May 2003 21:11:47 +0000 Subject: [PATCH] Moved most of cc65/incpath to a common searchpath module git-svn-id: svn://svn.cc65.org/cc65/trunk@2174 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/common/make/gcc.mak | 1 + src/common/make/watcom.mak | 1 + src/common/searchpath.c | 196 +++++++++++++++++++++++++++++++++++++ src/common/searchpath.h | 80 +++++++++++++++ 4 files changed, 278 insertions(+) create mode 100644 src/common/searchpath.c create mode 100644 src/common/searchpath.h diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index 3d24b788b..9fac62f1f 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -23,6 +23,7 @@ OBJS = abend.o \ hashstr.o \ matchpat.o \ print.o \ + searchpath.o \ segdefs.o \ segnames.o \ strbuf.o \ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index 04d05d911..400ebc643 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -55,6 +55,7 @@ OBJS = abend.obj \ hashstr.obj \ matchpat.obj \ print.obj \ + searchpath.obj \ segdefs.obj \ segnames.obj \ strbuf.obj \ diff --git a/src/common/searchpath.c b/src/common/searchpath.c new file mode 100644 index 000000000..734b0834c --- /dev/null +++ b/src/common/searchpath.c @@ -0,0 +1,196 @@ +/*****************************************************************************/ +/* */ +/* searchpath.h */ +/* */ +/* Search path path handling for ld65 */ +/* */ +/* */ +/* */ +/* (C) 2000-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include +#include +#if defined(_MSC_VER) +/* Microsoft compiler */ +# include +#else +/* Anyone else */ +# include +#endif + +/* common */ +#include "searchpath.h" +#include "xmalloc.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +static char* SearchPaths[MAX_SEARCH_PATHS]; + + + +/*****************************************************************************/ +/* 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 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) { + unsigned Mask = (0x01U << I); + if (Where & Mask) { + SearchPaths[I] = Add (SearchPaths[I], NewPath); + } + ++I; + } + } +} + + + +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) { + unsigned Mask = (0x01U << I); + if (Where & Mask) { + char* Path = Find (SearchPaths[I], Name); + if (Path) { + /* Found the file */ + return Path; + } + } + ++I; + } + return 0; +} + + + diff --git a/src/common/searchpath.h b/src/common/searchpath.h new file mode 100644 index 000000000..a59ac7d86 --- /dev/null +++ b/src/common/searchpath.h @@ -0,0 +1,80 @@ +/*****************************************************************************/ +/* */ +/* searchpath.h */ +/* */ +/* Search path path handling for ld65 */ +/* */ +/* */ +/* */ +/* (C) 2000-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* 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. + */ + + + +#ifndef SEARCHPATH_H +#define SEARCHPATH_H + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* Maximum number of search paths */ +#define MAX_SEARCH_PATHS 8 + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void AddSearchPath (const char* NewPath, unsigned Where); +/* Add a new search path to the existing one */ + +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. + */ + + + +/* End of searchpath.h */ +#endif + + +