xref: /freebsd-src/contrib/llvm-project/llvm/lib/ObjCopy/CommonConfig.cpp (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
181ad6265SDimitry Andric //===- CommonConfig.cpp ---------------------------------------------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric 
981ad6265SDimitry Andric #include "llvm/ObjCopy/CommonConfig.h"
105f757f3fSDimitry Andric #include "llvm/Support/Errc.h"
1181ad6265SDimitry Andric 
1281ad6265SDimitry Andric namespace llvm {
1381ad6265SDimitry Andric namespace objcopy {
1481ad6265SDimitry Andric 
1581ad6265SDimitry Andric Expected<NameOrPattern>
create(StringRef Pattern,MatchStyle MS,function_ref<Error (Error)> ErrorCallback)1681ad6265SDimitry Andric NameOrPattern::create(StringRef Pattern, MatchStyle MS,
1781ad6265SDimitry Andric                       function_ref<Error(Error)> ErrorCallback) {
1881ad6265SDimitry Andric   switch (MS) {
1981ad6265SDimitry Andric   case MatchStyle::Literal:
2081ad6265SDimitry Andric     return NameOrPattern(Pattern);
2181ad6265SDimitry Andric   case MatchStyle::Wildcard: {
2281ad6265SDimitry Andric     SmallVector<char, 32> Data;
23*7a6dacacSDimitry Andric     bool IsPositiveMatch = !Pattern.consume_front("!");
2481ad6265SDimitry Andric     Expected<GlobPattern> GlobOrErr = GlobPattern::create(Pattern);
2581ad6265SDimitry Andric 
2681ad6265SDimitry Andric     // If we couldn't create it as a glob, report the error, but try again
2781ad6265SDimitry Andric     // with a literal if the error reporting is non-fatal.
2881ad6265SDimitry Andric     if (!GlobOrErr) {
2981ad6265SDimitry Andric       if (Error E = ErrorCallback(GlobOrErr.takeError()))
3081ad6265SDimitry Andric         return std::move(E);
3181ad6265SDimitry Andric       return create(Pattern, MatchStyle::Literal, ErrorCallback);
3281ad6265SDimitry Andric     }
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric     return NameOrPattern(std::make_shared<GlobPattern>(*GlobOrErr),
3581ad6265SDimitry Andric                          IsPositiveMatch);
3681ad6265SDimitry Andric   }
3781ad6265SDimitry Andric   case MatchStyle::Regex: {
385f757f3fSDimitry Andric     Regex RegEx(Pattern);
395f757f3fSDimitry Andric     std::string Err;
405f757f3fSDimitry Andric     if (!RegEx.isValid(Err))
415f757f3fSDimitry Andric       return createStringError(errc::invalid_argument,
425f757f3fSDimitry Andric                                "cannot compile regular expression \'" +
435f757f3fSDimitry Andric                                    Pattern + "\': " + Err);
4481ad6265SDimitry Andric     SmallVector<char, 32> Data;
4581ad6265SDimitry Andric     return NameOrPattern(std::make_shared<Regex>(
4681ad6265SDimitry Andric         ("^" + Pattern.ltrim('^').rtrim('$') + "$").toStringRef(Data)));
4781ad6265SDimitry Andric   }
4881ad6265SDimitry Andric   }
4981ad6265SDimitry Andric   llvm_unreachable("Unhandled llvm.objcopy.MatchStyle enum");
5081ad6265SDimitry Andric }
5181ad6265SDimitry Andric 
5281ad6265SDimitry Andric } // end namespace objcopy
5381ad6265SDimitry Andric } // end namespace llvm
54