diff options
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/default-file-system.cpp | 23 | ||||
| -rw-r--r-- | source/slang/default-file-system.h | 10 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 7 |
3 files changed, 36 insertions, 4 deletions
diff --git a/source/slang/default-file-system.cpp b/source/slang/default-file-system.cpp index be171d37c..f9c66b7d7 100644 --- a/source/slang/default-file-system.cpp +++ b/source/slang/default-file-system.cpp @@ -51,10 +51,16 @@ SlangResult DefaultFileSystem::calcRelativePath(SlangPathType fromPathType, cons return SLANG_OK; } +SlangResult SLANG_MCALL DefaultFileSystem::getPathType( + const char* path, + SlangPathType* pathTypeOut) +{ + return Path::GetPathType(path, pathTypeOut); +} + SlangResult DefaultFileSystem::loadFile(char const* path, ISlangBlob** outBlob) { - // Default implementation that uses the `core` - // libraries facilities for talking to the OS filesystem. + // Default implementation that uses the `core` libraries facilities for talking to the OS filesystem. // // TODO: we might want to conditionally compile these in, so that // a user could create a build of Slang that doesn't include any OS @@ -93,7 +99,7 @@ SlangResult WrapFileSystem::loadFile(char const* path, ISlangBlob** outBlob) SlangResult WrapFileSystem::getCanoncialPath(const char* path, ISlangBlob** canonicalPathOut) { - // This isn't a very good 'canonical path' because the same file might be referenced + // This isn't a very good 'canonical path' because the same file might be referenced // multiple ways - for example by using relative paths. // But it's simple and matches slangs previous behavior. String canonicalPath(path); @@ -107,4 +113,15 @@ SlangResult WrapFileSystem::calcRelativePath(SlangPathType fromPathType, const c return DefaultFileSystem::getSingleton()->calcRelativePath(fromPathType, fromPath, path, pathOut); } +SlangResult WrapFileSystem::getPathType(const char* path, SlangPathType* pathTypeOut) +{ + // TODO: + // This might be undesirable in the longer term because it means that ISlangFileSystem will not be used + // to test file existence - but the file system will be. + // + // It would probably be better to use some kind of cache that uses 'loadFile' to load files, but also + // to test for existence. + return DefaultFileSystem::getSingleton()->getPathType(path, pathTypeOut); +} + }
\ No newline at end of file diff --git a/source/slang/default-file-system.h b/source/slang/default-file-system.h index 62d7cbfc5..47644f5ad 100644 --- a/source/slang/default-file-system.h +++ b/source/slang/default-file-system.h @@ -33,11 +33,15 @@ public: const char* path, ISlangBlob** pathOut) SLANG_OVERRIDE; + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getPathType( + const char* path, + SlangPathType* pathTypeOut) SLANG_OVERRIDE; + /// Get a default instance static ISlangFileSystemExt* getSingleton() { return &s_singleton; } private: - /// Make so not constructable + /// Make so not constructible DefaultFileSystem() {} ISlangUnknown* getInterface(const Guid& guid); @@ -75,6 +79,10 @@ public: const char* path, ISlangBlob** pathOut) SLANG_OVERRIDE; + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getPathType( + const char* path, + SlangPathType* pathTypeOut) SLANG_OVERRIDE; + /// Ctor WrapFileSystem(ISlangFileSystem* fileSystem): m_fileSystem(fileSystem) diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 5461afbf7..996f8e32f 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -118,6 +118,13 @@ struct IncludeHandlerImpl : IncludeHandler return SLANG_FAIL; } + SlangPathType pathType; + SLANG_RETURN_ON_FAIL(fileSystemExt->getPathType(relPath.begin(), &pathType)); + if (pathType != SLANG_PATH_TYPE_FILE) + { + return SLANG_E_NOT_FOUND; + } + // Get the canonical path ComPtr<ISlangBlob> canonicalPathBlob; SLANG_RETURN_ON_FAIL(fileSystemExt->getCanoncialPath(relPath.begin(), canonicalPathBlob.writeRef())); |
