1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#include "include-file-system.h"
#include "../../slang-com-ptr.h"
#include "../core/slang-io.h"
#include "compiler.h"
namespace Slang
{
// Allocate static const storage for the various interface IDs that the Slang API needs to expose
static const Guid IID_ISlangUnknown = SLANG_UUID_ISlangUnknown;
static const Guid IID_ISlangFileSystem = SLANG_UUID_ISlangFileSystem;
static const Guid IID_ISlangFileSystemExt = SLANG_UUID_ISlangFileSystemExt;
/* !!!!!!!!!!!!!!!!!!!!!!!!!! IncludeFileSystem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
/* static */ISlangFileSystemExt* IncludeFileSystem::getDefault()
{
static IncludeFileSystem s_includeFileSystem;
s_includeFileSystem.ensureRef();
return &s_includeFileSystem;
}
ISlangUnknown* IncludeFileSystem::getInterface(const Guid& guid)
{
return (guid == IID_ISlangUnknown || guid == IID_ISlangFileSystem || guid == IID_ISlangFileSystemExt) ? static_cast<ISlangFileSystemExt*>(this) : nullptr;
}
SlangResult IncludeFileSystem::getCanoncialPath(const char* path, ISlangBlob** canonicalPathOut)
{
String canonicalPath;
SLANG_RETURN_ON_FAIL(Path::GetCanonical(path, canonicalPath));
*canonicalPathOut = createStringBlob(canonicalPath).detach();
return SLANG_OK;
}
SlangResult IncludeFileSystem::calcRelativePath(SlangPathType fromPathType, const char* fromPath, const char* path, ISlangBlob** pathOut)
{
String relPath;
switch (fromPathType)
{
case SLANG_PATH_TYPE_FILE:
{
relPath = Path::Combine(Path::GetDirectoryName(fromPath), path);
break;
}
case SLANG_PATH_TYPE_DIRECTORY:
{
relPath = Path::Combine(fromPath, path);
break;
}
}
*pathOut = createStringBlob(relPath).detach();
return SLANG_OK;
}
SlangResult SLANG_MCALL IncludeFileSystem::loadFile(char const* path, ISlangBlob** outBlob)
{
// Otherwise, fall back to a 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
// filesystem calls.
//
if (!File::Exists(path))
{
return SLANG_E_NOT_FOUND;
}
try
{
String sourceString = File::ReadAllText(path);
ComPtr<ISlangBlob> sourceBlob = createStringBlob(sourceString);
*outBlob = sourceBlob.detach();
return SLANG_OK;
}
catch (...)
{
}
return SLANG_E_CANNOT_OPEN;
}
/* !!!!!!!!!!!!!!!!!!!!!!!!!! WrapFileSystem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
SlangResult SLANG_MCALL WrapFileSystem::loadFile(char const* path, ISlangBlob** outBlob)
{
return m_fileSystem->loadFile(path, outBlob);
}
SlangResult WrapFileSystem::getCanoncialPath(const char* path, ISlangBlob** canonicalPathOut)
{
String canonicalPath(path);
*canonicalPathOut = createStringBlob(canonicalPath).detach();
return SLANG_OK;
}
}
|