From 9a6f97cfe15ebd721868e1b2025224aa75ac4e48 Mon Sep 17 00:00:00 2001 From: uz Date: Fri, 28 May 2010 11:56:01 +0000 Subject: [PATCH] PushSearchPath will add the path only if it's not already there. git-svn-id: svn://svn.cc65.org/cc65/trunk@4672 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/common/searchpath.c | 24 +++++++++++++++++++----- src/common/searchpath.h | 7 +++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/common/searchpath.c b/src/common/searchpath.c index a91383460..217502299 100644 --- a/src/common/searchpath.c +++ b/src/common/searchpath.c @@ -156,11 +156,25 @@ void AddSubSearchPathFromEnv (SearchPath* P, const char* EnvVar, const char* Sub -void PushSearchPath (SearchPath* P, const char* NewPath) -/* Add a new search path to the head of an existing search path list */ -{ - /* Insert a clean copy of the path at position 0 */ - CollInsert (P, CleanupPath (NewPath), 0); +int PushSearchPath (SearchPath* P, const char* NewPath) +/* Add a new search path to the head of an existing search path list, provided + * that it's not already there. If the path is already at the first position, + * return zero, otherwise return a non zero value. + */ +{ + /* Generate a clean copy of NewPath */ + char* Path = CleanupPath (NewPath); + + /* If we have paths, check if Path is already at position zero */ + if (CollCount (P) > 0 && strcmp (CollConstAt (P, 0), Path) == 0) { + /* Match. Delete the copy and return to the caller */ + xfree (Path); + return 0; + } + + /* Insert a clean copy of the path at position 0, return success */ + CollInsert (P, Path, 0); + return 1; } diff --git a/src/common/searchpath.h b/src/common/searchpath.h index 6c4745e59..f9f870563 100644 --- a/src/common/searchpath.h +++ b/src/common/searchpath.h @@ -75,8 +75,11 @@ void AddSubSearchPathFromEnv (SearchPath* P, const char* EnvVar, const char* Sub * the environment variable value. */ -void PushSearchPath (SearchPath* P, const char* NewPath); -/* Add a new search path to the head of an existing search path list */ +int PushSearchPath (SearchPath* P, const char* NewPath); +/* Add a new search path to the head of an existing search path list, provided + * that it's not already there. If the path is already at the first position, + * return zero, otherwise return a non zero value. + */ void PopSearchPath (SearchPath* P); /* Remove a search path from the head of an existing search path list */ -- 2.39.5