summaryrefslogtreecommitdiffstats
path: root/source/core/slang-io.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2018-10-22 20:48:59 -0400
committerTim Foley <tfoleyNV@users.noreply.github.com>2018-10-22 17:48:59 -0700
commit2700a89f8c80620f1d523563cc80ec0da39e9761 (patch)
tree375f29ffcc5ad4e0ced42b51f1cc214f7b37374a /source/core/slang-io.cpp
parentcda9c3b1a712715209a3f4ba155c1425898334cb (diff)
Fix problem with __import not working (#688)
* Added getPathType to ISlangFileSystemExt. This is needed so that when searching for a file it's existance can be tested without loading the file. On some platforms a getCanonicalPath can do this - but depending on how getCanonicalPath is implemented, it may not do. This test is made after the relative path is produced before finding the canonical path. * Test for importing along search path. * Added comment to explain the issue around WrapFileSystem impl of getPathType. * Make search path use / not \
Diffstat (limited to 'source/core/slang-io.cpp')
-rw-r--r--source/core/slang-io.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/source/core/slang-io.cpp b/source/core/slang-io.cpp
index ab093f577..2b443a62b 100644
--- a/source/core/slang-io.cpp
+++ b/source/core/slang-io.cpp
@@ -132,6 +132,49 @@ namespace Slang
#endif
}
+ /* static */SlangResult Path::GetPathType(const String & path, SlangPathType* pathTypeOut)
+ {
+#ifdef _WIN32
+ // https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx
+ struct _stat32 statVar;
+ if (::_wstat32(String(path).ToWString(), &statVar) == 0)
+ {
+ if (statVar.st_mode & _S_IFDIR)
+ {
+ *pathTypeOut = SLANG_PATH_TYPE_DIRECTORY;
+ return SLANG_OK;
+ }
+ else if (statVar.st_mode & _S_IFREG)
+ {
+ *pathTypeOut = SLANG_PATH_TYPE_FILE;
+ return SLANG_OK;
+ }
+ return SLANG_FAIL;
+ }
+
+ return SLANG_E_NOT_FOUND;
+#else
+ struct stat statVar;
+ if (::stat(path.Buffer(), &statVar) == 0)
+ {
+ if (S_ISDIR(statVar.st_mode))
+ {
+ *pathTypeOut = SLANG_PATH_TYPE_DIRECTORY;
+ return SLANG_OK;
+ }
+ if (S_ISREG(statVar.st_mode))
+ {
+ *pathTypeOut = SLANG_PATH_TYPE_FILE;
+ return SLANG_OK;
+ }
+ return SLANG_FAIL;
+ }
+
+ return SLANG_E_NOT_FOUND;
+#endif
+ }
+
+
/* static */SlangResult Path::GetCanonical(const String & path, String & canonicalPathOut)
{
#if defined(_WIN32)