1*4fcfc199SEugene Zelenko //===- Formatters.cpp -----------------------------------------------------===//
25ce0f4a9SZachary Turner //
35ce0f4a9SZachary Turner //                     The LLVM Compiler Infrastructure
45ce0f4a9SZachary Turner //
55ce0f4a9SZachary Turner // This file is distributed under the University of Illinois Open Source
65ce0f4a9SZachary Turner // License. See LICENSE.TXT for details.
75ce0f4a9SZachary Turner //
85ce0f4a9SZachary Turner //===----------------------------------------------------------------------===//
95ce0f4a9SZachary Turner 
105ce0f4a9SZachary Turner #include "llvm/DebugInfo/CodeView/Formatters.h"
11*4fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h"
12*4fcfc199SEugene Zelenko #include "llvm/Support/raw_ostream.h"
13*4fcfc199SEugene Zelenko #include <algorithm>
14*4fcfc199SEugene Zelenko #include <cassert>
155ce0f4a9SZachary Turner 
165ce0f4a9SZachary Turner using namespace llvm;
175ce0f4a9SZachary Turner using namespace llvm::codeview;
185ce0f4a9SZachary Turner using namespace llvm::codeview::detail;
195ce0f4a9SZachary Turner 
205ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(StringRef Guid)
215ce0f4a9SZachary Turner     : FormatAdapter(makeArrayRef(Guid.bytes_begin(), Guid.bytes_end())) {}
225ce0f4a9SZachary Turner 
235ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(ArrayRef<uint8_t> Guid)
245ce0f4a9SZachary Turner     : FormatAdapter(std::move(Guid)) {}
255ce0f4a9SZachary Turner 
26*4fcfc199SEugene Zelenko void GuidAdapter::format(raw_ostream &Stream, StringRef Style) {
275ce0f4a9SZachary Turner   static const char *Lookup = "0123456789ABCDEF";
285ce0f4a9SZachary Turner 
295ce0f4a9SZachary Turner   assert(Item.size() == 16 && "Expected 16-byte GUID");
305ce0f4a9SZachary Turner   Stream << "{";
315ce0f4a9SZachary Turner   for (int i = 0; i < 16;) {
325ce0f4a9SZachary Turner     uint8_t Byte = Item[i];
335ce0f4a9SZachary Turner     uint8_t HighNibble = (Byte >> 4) & 0xF;
345ce0f4a9SZachary Turner     uint8_t LowNibble = Byte & 0xF;
355ce0f4a9SZachary Turner     Stream << Lookup[HighNibble] << Lookup[LowNibble];
365ce0f4a9SZachary Turner     ++i;
375ce0f4a9SZachary Turner     if (i >= 4 && i <= 10 && i % 2 == 0)
385ce0f4a9SZachary Turner       Stream << "-";
395ce0f4a9SZachary Turner   }
405ce0f4a9SZachary Turner   Stream << "}";
415ce0f4a9SZachary Turner }
42