xref: /src/contrib/llvm-project/llvm/lib/ObjCopy/CommonConfig.cpp (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
1145449b1SDimitry Andric //===- CommonConfig.cpp ---------------------------------------------------===//
2145449b1SDimitry Andric //
3145449b1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4145449b1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5145449b1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6145449b1SDimitry Andric //
7145449b1SDimitry Andric //===----------------------------------------------------------------------===//
8145449b1SDimitry Andric 
9145449b1SDimitry Andric #include "llvm/ObjCopy/CommonConfig.h"
10b1c73532SDimitry Andric #include "llvm/Support/Errc.h"
11145449b1SDimitry Andric 
12145449b1SDimitry Andric namespace llvm {
13145449b1SDimitry Andric namespace objcopy {
14145449b1SDimitry Andric 
15145449b1SDimitry Andric Expected<NameOrPattern>
create(StringRef Pattern,MatchStyle MS,function_ref<Error (Error)> ErrorCallback)16145449b1SDimitry Andric NameOrPattern::create(StringRef Pattern, MatchStyle MS,
17145449b1SDimitry Andric                       function_ref<Error(Error)> ErrorCallback) {
18145449b1SDimitry Andric   switch (MS) {
19145449b1SDimitry Andric   case MatchStyle::Literal:
20145449b1SDimitry Andric     return NameOrPattern(Pattern);
21145449b1SDimitry Andric   case MatchStyle::Wildcard: {
22145449b1SDimitry Andric     SmallVector<char, 32> Data;
234df029ccSDimitry Andric     bool IsPositiveMatch = !Pattern.consume_front("!");
24145449b1SDimitry Andric     Expected<GlobPattern> GlobOrErr = GlobPattern::create(Pattern);
25145449b1SDimitry Andric 
26145449b1SDimitry Andric     // If we couldn't create it as a glob, report the error, but try again
27145449b1SDimitry Andric     // with a literal if the error reporting is non-fatal.
28145449b1SDimitry Andric     if (!GlobOrErr) {
29145449b1SDimitry Andric       if (Error E = ErrorCallback(GlobOrErr.takeError()))
30145449b1SDimitry Andric         return std::move(E);
31145449b1SDimitry Andric       return create(Pattern, MatchStyle::Literal, ErrorCallback);
32145449b1SDimitry Andric     }
33145449b1SDimitry Andric 
34145449b1SDimitry Andric     return NameOrPattern(std::make_shared<GlobPattern>(*GlobOrErr),
35145449b1SDimitry Andric                          IsPositiveMatch);
36145449b1SDimitry Andric   }
37145449b1SDimitry Andric   case MatchStyle::Regex: {
38b1c73532SDimitry Andric     Regex RegEx(Pattern);
39b1c73532SDimitry Andric     std::string Err;
40b1c73532SDimitry Andric     if (!RegEx.isValid(Err))
41b1c73532SDimitry Andric       return createStringError(errc::invalid_argument,
42b1c73532SDimitry Andric                                "cannot compile regular expression \'" +
43b1c73532SDimitry Andric                                    Pattern + "\': " + Err);
44145449b1SDimitry Andric     SmallVector<char, 32> Data;
45145449b1SDimitry Andric     return NameOrPattern(std::make_shared<Regex>(
46145449b1SDimitry Andric         ("^" + Pattern.ltrim('^').rtrim('$') + "$").toStringRef(Data)));
47145449b1SDimitry Andric   }
48145449b1SDimitry Andric   }
49145449b1SDimitry Andric   llvm_unreachable("Unhandled llvm.objcopy.MatchStyle enum");
50145449b1SDimitry Andric }
51145449b1SDimitry Andric 
52145449b1SDimitry Andric } // end namespace objcopy
53145449b1SDimitry Andric } // end namespace llvm
54