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