From: <bi...@us...> - 2008-02-04 01:25:03
|
Revision: 2335 http://oorexx.svn.sourceforge.net/oorexx/?rev=2335&view=rev Author: bigrixx Date: 2008-02-03 17:25:09 -0800 (Sun, 03 Feb 2008) Log Message: ----------- improved file search algorithm Modified Paths: -------------- sandbox/rick/opt/kernel/platform/windows/FileSystem.cpp sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.cpp sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.hpp Modified: sandbox/rick/opt/kernel/platform/windows/FileSystem.cpp =================================================================== --- sandbox/rick/opt/kernel/platform/windows/FileSystem.cpp 2008-02-03 21:00:26 UTC (rev 2334) +++ sandbox/rick/opt/kernel/platform/windows/FileSystem.cpp 2008-02-04 01:25:09 UTC (rev 2335) @@ -49,6 +49,7 @@ #include "RexxNativeAPI.h" #include "ActivityManager.hpp" #include "ProtectedObject.hpp" +#include "SysInterpreterInstance.hpp" #include <string.h> #include <io.h> #include <fcntl.h> @@ -62,9 +63,6 @@ #define WANT_GETLONGPATHNAME_WRAPPER /* NT and Windows 95 */ #include <NewAPIs.h> -RexxString * LocateProgram(RexxString *, const char *[], int); -bool SearchFileName(const char *, char *); -void GetLongName(char *, DWORD); bool FindFirstFile(const char *Name); FILE * SysBinaryFilemode(FILE *, bool); int SysFFlush(FILE *); @@ -196,12 +194,14 @@ const char *parentDir = _parentDir == OREF_NULL ? NULL : _parentDir->getStringData(); const char *parentExtension = _parentExtension == OREF_NULL ? NULL : _parentExtension->getStringData(); + SysSearchPath searchPath(parentDir, parentExtension); + // if the file already has an extension, this dramatically reduces the number // of searches we need to make. if (hasExtension(name)) { - if (searchName(name, parentDir, NULL, resolvedName)) + if (searchName(name, searchPath.path, NULL, resolvedName)) { return new_string(resolvedName); } @@ -211,7 +211,7 @@ // if we have a parent extension provided, use that in preference to any default searches if (parentExtension != NULL) { - if (searchName(name, parentDir, parentExtension, resolvedName)) + if (searchName(name, searchPath.path, parentExtension, resolvedName)) { return new_string(resolvedName); } @@ -224,7 +224,7 @@ { RexxString *ext = (RexxString *)searchExtensions->get(i); - if (searchName(name, parentDir, ext->getStringData(), resolvedName)) + if (searchName(name, searchPath.path, ext->getStringData(), resolvedName)) { return new_string(resolvedName); } @@ -279,7 +279,7 @@ * @return true if the file was located. A true returns indicates the * resolved file name has been placed in the provided buffer. */ -bool SysInterpreterInstance::searchName(const char *name, const char *directory, const char *extension, char *resolvedName) +bool SysInterpreterInstance::searchName(const char *name, const char *path, const char *extension, char *resolvedName) { UnsafeBlock releaser; // this is for building a temporary name @@ -298,34 +298,10 @@ return true; } - - // if we have a directory, then use that directory as a search path first - if (directory != OREF_NULL ) + if (searchPath(name, path, extension, resolvedName)) { - if (searchPath(name, directory, extension, resolvedName)) - { - return true; - } - } - - - // if the instance was created with an extension path, search it first - if (instance->searchPath != OREF_NULL ) - { - if (searchPath(name, instance->searchPath()->getStringData(), extension, resolvedName)) - { - return true; - } - } - - - // now do the default search path - if (searchPath(name, NULL, extension, resolved)) - { return true; } - - return false; } @@ -386,7 +362,7 @@ unsigned int errorMode = SetErrorMode(SEM_FAILCRITICALERRORS); LPTSTR ppszFilePart=NULL; // file name only in buffer - if (SearchPath((LPCTSTR)NULL, (LPCTSTR)name, (LPCTSTR)extension, CCHMAXPATH, (LPTSTR)reslvedlName, &ppszFilePart)) + if (SearchPath((LPCTSTR)path, (LPCTSTR)name, (LPCTSTR)extension, CCHMAXPATH, (LPTSTR)resolvedlName, &ppszFilePart)) { DWORD fileAttrib = GetFileAttributes((LPTSTR)fullName); @@ -439,123 +415,7 @@ return --Scan; /* return extension position */ } -/*********************************************************************/ -/* */ -/* FUNCTION : LocateProgram */ -/* */ -/* DESCRIPTION : Finds out if file name is minimally correct. Finds */ -/* out if file exists. If it exists, then produce */ -/* fullpath name. */ -/* */ -/*********************************************************************/ -RexxString * LocateProgram( - RexxString * InName, /* name of rexx proc to check */ - const char *Extensions[], /* array of extensions to check */ - int ExtensionCount ) /* count of extensions */ -{ - char TempName[CCHMAXPATH + 2]; /* temporary name buffer */ - char FullName[CCHMAXPATH + 2]; /* temporary name buffer */ - const char *Name; /* ASCII-Z version of the name */ - const char *Extension; /* start of file extension */ - RexxString * Result; /* returned name */ - int i; /* loop counter */ - size_t ExtensionSpace; /* room for an extension */ - // retrofit by IH - bool Found; /* found the file */ - - { - UnsafeBlock releaser; - - Name = InName->getStringData(); /* point to the string data */ - Found = false; /* no name found yet */ - Extension = SysFileExtension(Name); /* locate the file extension start */ - - if (!Extension) { /* have an extension? */ - /* get space left for an extension */ - ExtensionSpace = sizeof(TempName) - strlen(Name); - /* loop through the extensions list */ - for (i = 0; !Found && i < ExtensionCount; i++) { - /* copy over the name */ - strncpy(TempName, Name, sizeof(TempName)); - /* copy over the extension */ - strncat(TempName, Extensions[i], ExtensionSpace); - /* check this version of the name */ - Found = SearchFileName(TempName, FullName); - } - } - if (!Found) /* not found? try without extensions*/ - /* check on the "raw" name last */ - Found = SearchFileName(Name, FullName); - } - if (Found) /* got one? */ - /* get as a string object */ - Result = new_string(FullName); - else - Result = OREF_NULL; /* this wasn't found */ - return Result; /* return the name */ -} - -/*********************************************************************/ -/* */ -/* FUNCTION : SearchFileName */ -/* */ -/* DESCRIPTION : Search for a given filename, returning the fully */ -/* resolved name if it is found. */ -/* */ -/*********************************************************************/ - -bool SearchFileName( - const char *Name, /* name of rexx proc to check */ - char *FullName ) /* fully resolved name */ -{ - size_t NameLength; /* length of name */ - - DWORD dwFileAttrib; // file attributes - LPTSTR ppszFilePart=NULL; // file name only in buffer - unsigned int errorMode; - - NameLength = strlen(Name); /* get length of incoming name */ - - /* if name is too small or big */ - if (NameLength < 1 || NameLength > CCHMAXPATH) - return false; /* then Not a rexx proc name */ - /* now try for original name */ - errorMode = SetErrorMode(SEM_FAILCRITICALERRORS); - if (GetFullPathName(Name, CCHMAXPATH, (LPTSTR)FullName, &ppszFilePart)) { - /* make sure it really exists */ - // make sure it's not a directory - if (-1 != (dwFileAttrib=GetFileAttributes((LPTSTR)FullName)) - && (dwFileAttrib != FILE_ATTRIBUTE_DIRECTORY)) - { - /* got it! get its case-preserved long file name */ - GetLongName(FullName, CCHMAXPATH); - SetErrorMode(errorMode); - return true; - } - } - /* try searching the path */ - if ( SearchPath(NULL, // search default order - (LPCTSTR)Name, // @ of filename - NULL, // @ of extension, no default - CCHMAXPATH, // len of buffer - (LPTSTR)FullName, // buffer for found - &ppszFilePart) ) - // make sure it's not a directory - if (-1 != (dwFileAttrib=GetFileAttributes((LPTSTR)FullName)) - && (dwFileAttrib != FILE_ATTRIBUTE_DIRECTORY)) - { - /* got it! get its case-preserved long file name */ - GetLongName(FullName, CCHMAXPATH); - SetErrorMode(errorMode); - return true; - } - - SetErrorMode(errorMode); - return false; /* not found */ -} - - /** * Get the actual name value of a located file, in the exact case * used on the harddrive. Modified: sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.cpp =================================================================== --- sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.cpp 2008-02-03 21:00:26 UTC (rev 2334) +++ sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.cpp 2008-02-04 01:25:09 UTC (rev 2335) @@ -40,6 +40,7 @@ /* */ /******************************************************************************/ +#include "RexxCore.h" #include "InterpreterInstance.hpp" @@ -54,3 +55,43 @@ { instance = i; } + + +SysSearchPath::SysSearchPath(const char *parentDir, const char *extensionPath) +{ + char temp[4]; // this is just a temp buffer to check component sizes + + size_t pathSize = GetEnvironmentVariable("PATH", temp, sizeof(temp)); + size_t parentSize = parentDir == NULL ? 0 : strlen(parentDir); + size_t extensionSize = extensionPath == NULL ? 0 : strlen(extensionPath); + + + // enough room for separators and a terminating null + char *path = SysAllocateResultMemory(pathSize + parentSize + extensionSize + 8); + *path = '\0'; // add a null character so strcat can work + if (parentDir != NULL) + { + strcpy(path, parentDir); + strcat(path, ";"); + } + + // add on the current directory + strcat(path, ".;"); + + if (extensionPath != NULL) + { + strcat(path, extensionPath); + strcat(path, ";"); + } + + GetEnvironmentVariable("PATH", path + strlen(path), pathSize + 1); +} + + +/** + * Deconstructor for releasing storage used by the constructed path. + */ +SysSearchPath::~SysSearchPath() +{ + SysReleaseResultMemory(path); +} Modified: sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.hpp =================================================================== --- sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.hpp 2008-02-03 21:00:26 UTC (rev 2334) +++ sandbox/rick/opt/kernel/platform/windows/SysInterpreterInstance.hpp 2008-02-04 01:25:09 UTC (rev 2335) @@ -54,4 +54,13 @@ }; +class SysSearchPath +{ + SysSearchPath(const char *parent, const char *extension); + ~SysSearchPath(); + + const char *path; // the constructed path +}; + + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |