;
32 const char*S = Str.begin(), *End = Str.end();
51 unsignedFileSize = FE.
getSize();
52 if(FileSize <=
sizeof(
HMapHeader))
return nullptr;
57std::nullopt,
false);
58 if(!FileBuffer || !*FileBuffer)
63 returnstd::unique_ptr<HeaderMap>(
new HeaderMap(std::move(*FileBuffer), NeedsByteSwap));
67 bool&NeedsByteSwap) {
70 const char*FileStart =
File.getBufferStart();
79NeedsByteSwap =
false;
82NeedsByteSwap =
true;
92NeedsByteSwap ? llvm::byteswap(Header->
NumBuckets) : Header->NumBuckets;
93 if(!llvm::isPowerOf2_32(NumBuckets))
95 if(
File.getBufferSize() <
110 returnFileBuffer->getBufferIdentifier();
113unsignedHeaderMapImpl::getEndianAdjustedWord(
unsigned X)
const{
114 if(!NeedsBSwap)
return X;
115 returnllvm::byteswap<uint32_t>(
X);
120const HMapHeader&HeaderMapImpl::getHeader()
const{
122 return*
reinterpret_cast<const HMapHeader*
>(FileBuffer->getBufferStart());
128HMapBucketHeaderMapImpl::getBucket(
unsignedBucketNo)
const{
129assert(FileBuffer->getBufferSize() >=
131 "Expected bucket to be in range");
137 reinterpret_cast<const HMapBucket*
>(FileBuffer->getBufferStart() +
139 const HMapBucket*BucketPtr = BucketArray+BucketNo;
142 Result.Key = getEndianAdjustedWord(BucketPtr->
Key);
143 Result.Prefix = getEndianAdjustedWord(BucketPtr->
Prefix);
144 Result.Suffix = getEndianAdjustedWord(BucketPtr->
Suffix);
148std::optional<StringRef> HeaderMapImpl::getString(
unsignedStrTabIdx)
const{
150StrTabIdx += getEndianAdjustedWord(getHeader().StringsOffset);
153 if(StrTabIdx >= FileBuffer->getBufferSize())
156 const char*
Data= FileBuffer->getBufferStart() + StrTabIdx;
157 unsignedMaxLen = FileBuffer->getBufferSize() - StrTabIdx;
158 unsignedLen = strnlen(
Data, MaxLen);
161 if(Len == MaxLen &&
Data[Len - 1])
164 returnStringRef(
Data, Len);
174 unsignedNumBuckets = getEndianAdjustedWord(Hdr.
NumBuckets);
176llvm::dbgs() <<
"Header Map "<<
getFileName() <<
":\n "<< NumBuckets
177<<
", "<< getEndianAdjustedWord(Hdr.
NumEntries) <<
"\n";
179 autogetStringOrInvalid = [
this](
unsigned Id) -> StringRef {
180 if(std::optional<StringRef> S = getString(
Id))
185 for(
unsignedi = 0; i != NumBuckets; ++i) {
189StringRef Key = getStringOrInvalid(B.
Key);
190StringRef Prefix = getStringOrInvalid(B.
Prefix);
191StringRef Suffix = getStringOrInvalid(B.
Suffix);
192llvm::dbgs() <<
" "<< i <<
". "<< Key <<
" -> '"<< Prefix <<
"' '" 200 unsignedNumBuckets = getEndianAdjustedWord(Hdr.
NumBuckets);
203assert(llvm::isPowerOf2_32(NumBuckets) &&
"Expected power of 2");
207 HMapBucketB = getBucket(Bucket & (NumBuckets-1));
211std::optional<StringRef> Key = getString(B.
Key);
212 if(LLVM_UNLIKELY(!Key))
214 if(!
Filename.equals_insensitive(*Key))
219std::optional<StringRef> Prefix = getString(B.
Prefix);
220std::optional<StringRef> Suffix = getString(B.
Suffix);
223 if(LLVM_LIKELY(Prefix && Suffix)) {
224DestPath.append(Prefix->begin(), Prefix->end());
225DestPath.append(Suffix->begin(), Suffix->end());
227 returnStringRef(DestPath.begin(), DestPath.size());
232 if(!ReverseMap.empty())
233 returnReverseMap.lookup(DestPath);
236 unsignedNumBuckets = getEndianAdjustedWord(Hdr.
NumBuckets);
238 for(
unsignedi = 0; i != NumBuckets; ++i) {
243std::optional<StringRef> Key = getString(B.
Key);
244std::optional<StringRef> Prefix = getString(B.
Prefix);
245std::optional<StringRef> Suffix = getString(B.
Suffix);
246 if(LLVM_LIKELY(Key && Prefix && Suffix)) {
248Buf.append(Prefix->begin(), Prefix->end());
249Buf.append(Suffix->begin(), Suffix->end());
250StringRef
Value(Buf.begin(), Buf.size());
251ReverseMap[
Value] = *Key;
253 if(DestPath ==
Value)
Defines the clang::FileManager interface and associated types.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Implements support for file system lookup, file system caching, and directory search management.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
The JSON file list parser is used to communicate input to InstallAPI.
LLVM_READONLY char toLowercase(char c)
Converts the given ASCII character to its lowercase equivalent.
@ Result
The result type of a method or function.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4