llvm-project

Форк
0
/
Strings.cpp 
78 строк · 2.3 Кб
1
//===- Strings.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 "lld/Common/Strings.h"
10
#include "lld/Common/ErrorHandler.h"
11
#include "lld/Common/LLVM.h"
12
#include "llvm/ADT/StringExtras.h"
13
#include "llvm/Support/FileSystem.h"
14
#include "llvm/Support/GlobPattern.h"
15
#include <algorithm>
16
#include <mutex>
17
#include <vector>
18

19
using namespace llvm;
20
using namespace lld;
21

22
SingleStringMatcher::SingleStringMatcher(StringRef Pattern) {
23
  if (Pattern.size() > 2 && Pattern.starts_with("\"") &&
24
      Pattern.ends_with("\"")) {
25
    ExactMatch = true;
26
    ExactPattern = Pattern.substr(1, Pattern.size() - 2);
27
  } else {
28
    Expected<GlobPattern> Glob = GlobPattern::create(Pattern);
29
    if (!Glob) {
30
      error(toString(Glob.takeError()) + ": " + Pattern);
31
      return;
32
    }
33
    ExactMatch = false;
34
    GlobPatternMatcher = *Glob;
35
  }
36
}
37

38
bool SingleStringMatcher::match(StringRef s) const {
39
  return ExactMatch ? (ExactPattern == s) : GlobPatternMatcher.match(s);
40
}
41

42
bool StringMatcher::match(StringRef s) const {
43
  for (const SingleStringMatcher &pat : patterns)
44
    if (pat.match(s))
45
      return true;
46
  return false;
47
}
48

49
// Converts a hex string (e.g. "deadbeef") to a vector.
50
SmallVector<uint8_t, 0> lld::parseHex(StringRef s) {
51
  SmallVector<uint8_t, 0> hex;
52
  while (!s.empty()) {
53
    StringRef b = s.substr(0, 2);
54
    s = s.substr(2);
55
    uint8_t h;
56
    if (!to_integer(b, h, 16)) {
57
      error("not a hexadecimal value: " + b);
58
      return {};
59
    }
60
    hex.push_back(h);
61
  }
62
  return hex;
63
}
64

65
// Returns true if S is valid as a C language identifier.
66
bool lld::isValidCIdentifier(StringRef s) {
67
  return !s.empty() && !isDigit(s[0]) &&
68
         llvm::all_of(s, [](char c) { return isAlnum(c) || c == '_'; });
69
}
70

71
// Write the contents of the a buffer to a file
72
void lld::saveBuffer(StringRef buffer, const Twine &path) {
73
  std::error_code ec;
74
  raw_fd_ostream os(path.str(), ec, sys::fs::OpenFlags::OF_None);
75
  if (ec)
76
    error("cannot create " + path + ": " + ec.message());
77
  os << buffer;
78
}
79

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.