Line data Source code
1 : //===- YAML.cpp - YAMLIO utilities for object files -----------------------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file defines utility classes for handling the YAML representation of
11 : // object files.
12 : //
13 : //===----------------------------------------------------------------------===//
14 :
15 : #include "llvm/ObjectYAML/YAML.h"
16 : #include "llvm/ADT/StringExtras.h"
17 : #include "llvm/Support/raw_ostream.h"
18 : #include <cctype>
19 : #include <cstdint>
20 :
21 : using namespace llvm;
22 :
23 661 : void yaml::ScalarTraits<yaml::BinaryRef>::output(
24 : const yaml::BinaryRef &Val, void *, raw_ostream &Out) {
25 661 : Val.writeAsHex(Out);
26 661 : }
27 :
28 827 : StringRef yaml::ScalarTraits<yaml::BinaryRef>::input(StringRef Scalar, void *,
29 : yaml::BinaryRef &Val) {
30 827 : if (Scalar.size() % 2 != 0)
31 0 : return "BinaryRef hex string must contain an even number of nybbles.";
32 : // TODO: Can we improve YAMLIO to permit a more accurate diagnostic here?
33 : // (e.g. a caret pointing to the offending character).
34 164713 : for (unsigned I = 0, N = Scalar.size(); I != N; ++I)
35 327772 : if (!isxdigit(Scalar[I]))
36 0 : return "BinaryRef hex string must contain only hex digits.";
37 827 : Val = yaml::BinaryRef(Scalar);
38 827 : return {};
39 : }
40 :
41 975 : void yaml::BinaryRef::writeAsBinary(raw_ostream &OS) const {
42 975 : if (!DataIsHexString) {
43 102 : OS.write((const char *)Data.data(), Data.size());
44 102 : return;
45 : }
46 82581 : for (unsigned I = 0, N = Data.size(); I != N; I += 2) {
47 : uint8_t Byte;
48 163416 : StringRef((const char *)&Data[I], 2).getAsInteger(16, Byte);
49 81708 : OS.write(Byte);
50 : }
51 : }
52 :
53 661 : void yaml::BinaryRef::writeAsHex(raw_ostream &OS) const {
54 661 : if (binary_size() == 0)
55 : return;
56 619 : if (DataIsHexString) {
57 0 : OS.write((const char *)Data.data(), Data.size());
58 0 : return;
59 : }
60 73282 : for (uint8_t Byte : Data)
61 72663 : OS << hexdigit(Byte >> 4) << hexdigit(Byte & 0xf);
62 : }
|