Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/ObjCopy/CommonConfig.cpp
35233 views
1
//===- CommonConfig.cpp ---------------------------------------------------===//
2
//
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
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "llvm/ObjCopy/CommonConfig.h"
10
#include "llvm/Support/Errc.h"
11
12
namespace llvm {
13
namespace objcopy {
14
15
Expected<NameOrPattern>
16
NameOrPattern::create(StringRef Pattern, MatchStyle MS,
17
function_ref<Error(Error)> ErrorCallback) {
18
switch (MS) {
19
case MatchStyle::Literal:
20
return NameOrPattern(Pattern);
21
case MatchStyle::Wildcard: {
22
SmallVector<char, 32> Data;
23
bool IsPositiveMatch = !Pattern.consume_front("!");
24
Expected<GlobPattern> GlobOrErr = GlobPattern::create(Pattern);
25
26
// If we couldn't create it as a glob, report the error, but try again
27
// with a literal if the error reporting is non-fatal.
28
if (!GlobOrErr) {
29
if (Error E = ErrorCallback(GlobOrErr.takeError()))
30
return std::move(E);
31
return create(Pattern, MatchStyle::Literal, ErrorCallback);
32
}
33
34
return NameOrPattern(std::make_shared<GlobPattern>(*GlobOrErr),
35
IsPositiveMatch);
36
}
37
case MatchStyle::Regex: {
38
Regex RegEx(Pattern);
39
std::string Err;
40
if (!RegEx.isValid(Err))
41
return createStringError(errc::invalid_argument,
42
"cannot compile regular expression \'" +
43
Pattern + "\': " + Err);
44
SmallVector<char, 32> Data;
45
return NameOrPattern(std::make_shared<Regex>(
46
("^" + Pattern.ltrim('^').rtrim('$') + "$").toStringRef(Data)));
47
}
48
}
49
llvm_unreachable("Unhandled llvm.objcopy.MatchStyle enum");
50
}
51
52
} // end namespace objcopy
53
} // end namespace llvm
54
55