1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- WildcardPattern.cpp ------------------------------------------------===//
2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//                     The MCLinker Project
4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source
6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details.
7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/WildcardPattern.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/raw_ostream.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/ManagedStatic.h>
15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert>
16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestypedef GCFactory<WildcardPattern, MCLD_SYMBOLS_PER_INPUT>
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    WildcardPatternFactory;
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<WildcardPatternFactory> g_WildcardPatternFactory;
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// WildcardPattern
25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
2637b74a387bb3993387029859c2d9d051c41c724eStephen HinesWildcardPattern::WildcardPattern() : m_bIsPrefix(false) {
27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWildcardPattern::WildcardPattern(const std::string& pPattern,
30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                 SortPolicy pPolicy)
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : StrToken(StrToken::Wildcard, pPattern), m_SortPolicy(pPolicy) {
32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (pPattern.find_first_of('*') == (pPattern.size() - 1))
33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_bIsPrefix = true;
34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  else
35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_bIsPrefix = false;
36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
3837b74a387bb3993387029859c2d9d051c41c724eStephen HinesWildcardPattern::~WildcardPattern() {
39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesllvm::StringRef WildcardPattern::prefix() const {
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (isPrefix())
43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    return llvm::StringRef(name().c_str(), name().size() - 1);
44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return llvm::StringRef(name());
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWildcardPattern* WildcardPattern::create(const std::string& pPattern,
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                         SortPolicy pPolicy) {
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  WildcardPattern* result = g_WildcardPatternFactory->allocate();
51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  new (result) WildcardPattern(pPattern, pPolicy);
52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result;
53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid WildcardPattern::destroy(WildcardPattern*& pWildcardPattern) {
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_WildcardPatternFactory->destroy(pWildcardPattern);
57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_WildcardPatternFactory->deallocate(pWildcardPattern);
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  pWildcardPattern = NULL;
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid WildcardPattern::clear() {
62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_WildcardPatternFactory->clear();
63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
66