1 //===- YAML.cpp - YAMLIO utilities for object files -----------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines utility classes for handling the YAML representation of
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ObjectYAML/YAML.h"
15 #include "llvm/ADT/StringExtras.h"
16 #include "llvm/Support/raw_ostream.h"
22 void yaml::ScalarTraits
<yaml::BinaryRef
>::output(
23 const yaml::BinaryRef
&Val
, void *, raw_ostream
&Out
) {
27 StringRef
yaml::ScalarTraits
<yaml::BinaryRef
>::input(StringRef Scalar
, void *,
28 yaml::BinaryRef
&Val
) {
29 if (Scalar
.size() % 2 != 0)
30 return "BinaryRef hex string must contain an even number of nybbles.";
31 // TODO: Can we improve YAMLIO to permit a more accurate diagnostic here?
32 // (e.g. a caret pointing to the offending character).
33 for (unsigned I
= 0, N
= Scalar
.size(); I
!= N
; ++I
)
34 if (!llvm::isHexDigit(Scalar
[I
]))
35 return "BinaryRef hex string must contain only hex digits.";
36 Val
= yaml::BinaryRef(Scalar
);
40 void yaml::BinaryRef::writeAsBinary(raw_ostream
&OS
) const {
41 if (!DataIsHexString
) {
42 OS
.write((const char *)Data
.data(), Data
.size());
45 for (unsigned I
= 0, N
= Data
.size(); I
!= N
; I
+= 2) {
46 uint8_t Byte
= llvm::hexDigitValue(Data
[I
]);
48 Byte
|= llvm::hexDigitValue(Data
[I
+ 1]);
53 void yaml::BinaryRef::writeAsHex(raw_ostream
&OS
) const {
54 if (binary_size() == 0)
56 if (DataIsHexString
) {
57 OS
.write((const char *)Data
.data(), Data
.size());
60 for (uint8_t Byte
: Data
)
61 OS
<< hexdigit(Byte
>> 4) << hexdigit(Byte
& 0xf);