1 //===- Strings.cpp -------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "lld/Common/Strings.h"
10 #include "lld/Common/ErrorHandler.h"
11 #include "lld/Common/LLVM.h"
12 #include "llvm/Support/FileSystem.h"
13 #include "llvm/Support/GlobPattern.h"
21 SingleStringMatcher::SingleStringMatcher(StringRef Pattern
) {
22 if (Pattern
.size() > 2 && Pattern
.startswith("\"") &&
23 Pattern
.endswith("\"")) {
25 ExactPattern
= Pattern
.substr(1, Pattern
.size() - 2);
27 Expected
<GlobPattern
> Glob
= GlobPattern::create(Pattern
);
29 error(toString(Glob
.takeError()));
33 GlobPatternMatcher
= *Glob
;
37 bool SingleStringMatcher::match(StringRef s
) const {
38 return ExactMatch
? (ExactPattern
== s
) : GlobPatternMatcher
.match(s
);
41 bool StringMatcher::match(StringRef s
) const {
42 for (const SingleStringMatcher
&pat
: patterns
)
48 // Converts a hex string (e.g. "deadbeef") to a vector.
49 SmallVector
<uint8_t, 0> lld::parseHex(StringRef s
) {
50 SmallVector
<uint8_t, 0> hex
;
52 StringRef b
= s
.substr(0, 2);
55 if (!to_integer(b
, h
, 16)) {
56 error("not a hexadecimal value: " + b
);
64 // Returns true if S is valid as a C language identifier.
65 bool lld::isValidCIdentifier(StringRef s
) {
66 return !s
.empty() && !isDigit(s
[0]) &&
67 llvm::all_of(s
, [](char c
) { return isAlnum(c
) || c
== '_'; });
70 // Write the contents of the a buffer to a file
71 void lld::saveBuffer(StringRef buffer
, const Twine
&path
) {
73 raw_fd_ostream
os(path
.str(), ec
, sys::fs::OpenFlags::OF_None
);
75 error("cannot create " + path
+ ": " + ec
.message());