blob: 0826b21a9b9e24932373c041af70a147ae54765d [file] [log] [blame]
Zachary Turner6ba65de2016-04-29 17:22:58 +00001//===- ByteStream.cpp - Reads stream data from a byte sequence ------------===//
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#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
11#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
12
13using namespace llvm;
Zachary Turner2f09b502016-04-29 17:28:47 +000014using namespace llvm::pdb;
Zachary Turner6ba65de2016-04-29 17:22:58 +000015
16ByteStream::ByteStream() : Owned(false) {}
17
18ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) : Owned(false) {
19 initialize(Bytes);
20}
21
22ByteStream::ByteStream(uint32_t Length) : Owned(false) { initialize(Length); }
23
24ByteStream::~ByteStream() { reset(); }
25
26void ByteStream::reset() {
27 if (Owned)
28 delete[] Data.data();
29 Owned = false;
30 Data = MutableArrayRef<uint8_t>();
31}
32
33void ByteStream::initialize(MutableArrayRef<uint8_t> Bytes) {
34 reset();
35 Data = Bytes;
36 Owned = false;
37}
38
39void ByteStream::initialize(uint32_t Length) {
40 reset();
41 Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
42 Owned = true;
43}
44
45std::error_code ByteStream::initialize(StreamReader &Reader, uint32_t Length) {
46 initialize(Length);
47 std::error_code EC = Reader.readBytes(Data);
48 if (EC)
49 reset();
50 return EC;
51}
52
53std::error_code ByteStream::readBytes(uint32_t Offset,
54 MutableArrayRef<uint8_t> Buffer) const {
55 if (Data.size() < Buffer.size() + Offset)
56 return std::make_error_code(std::errc::bad_address);
57 ::memcpy(Buffer.data(), Data.data() + Offset, Buffer.size());
58 return std::error_code();
59}
60
Zachary Turnerf5c59652016-05-03 00:28:21 +000061std::error_code ByteStream::getArrayRef(uint32_t Offset,
62 ArrayRef<uint8_t> &Buffer,
63 uint32_t Length) const {
64 if (Data.size() < Length + Offset)
65 return std::make_error_code(std::errc::bad_address);
66 Buffer = Data.slice(Offset, Length);
67 return std::error_code();
68}
69
Zachary Turner6ba65de2016-04-29 17:22:58 +000070uint32_t ByteStream::getLength() const { return Data.size(); }
Zachary Turner0eace0b2016-05-02 18:09:14 +000071
72StringRef ByteStream::str() const {
73 const char *CharData = reinterpret_cast<const char *>(Data.data());
74 return StringRef(CharData, Data.size());
75}