summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/default-file-system.cpp23
-rw-r--r--source/slang/default-file-system.h10
-rw-r--r--source/slang/slang.cpp7
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()));