xref: /netbsd-src/external/bsd/elftosb/dist/common/Blob.cpp (revision 993229b6fea628ff8b1fa09146c80b0cfb2768eb)
1 /*
2  * File:	Blob.cpp
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 
8 #include "Blob.h"
9 #include <stdexcept>
10 #include <stdlib.h>
11 #include <string.h>
12 
Blob()13 Blob::Blob()
14 :	m_data(0),
15 	m_length(0)
16 {
17 }
18 
19 //! Makes a local copy of the \a data argument.
20 //!
Blob(const uint8_t * data,unsigned length)21 Blob::Blob(const uint8_t * data, unsigned length)
22 :	m_data(0),
23 	m_length(length)
24 {
25 	m_data = reinterpret_cast<uint8_t*>(malloc(length));
26 	memcpy(m_data, data, length);
27 }
28 
29 //! Makes a local copy of the data owned by \a other.
30 //!
Blob(const Blob & other)31 Blob::Blob(const Blob & other)
32 :	m_data(0),
33 	m_length(other.m_length)
34 {
35 	m_data = reinterpret_cast<uint8_t *>(malloc(m_length));
36 	memcpy(m_data, other.m_data, m_length);
37 }
38 
39 //! Disposes of the binary data associated with this object.
~Blob()40 Blob::~Blob()
41 {
42 	if (m_data)
43 	{
44 		free(m_data);
45 	}
46 }
47 
48 //! Copies \a data onto the blob's data. The blob does not assume ownership
49 //! of \a data.
50 //!
51 //! \param data Pointer to a buffer containing the data which will be copied
52 //!		into the blob.
53 //! \param length Number of bytes pointed to by \a data.
setData(const uint8_t * data,unsigned length)54 void Blob::setData(const uint8_t * data, unsigned length)
55 {
56 	setLength(length);
57 	memcpy(m_data, data, length);
58 }
59 
60 //! Sets the #m_length member variable to \a length and resizes #m_data to
61 //! the new length. The contents of #m_data past any previous contents are undefined.
62 //! If the new \a length is 0 then the data will be freed and a subsequent call
63 //! to getData() will return NULL.
64 //!
65 //! \param length New length of the blob's data in bytes.
setLength(unsigned length)66 void Blob::setLength(unsigned length)
67 {
68 	if (length == 0)
69 	{
70 		clear();
71 		return;
72 	}
73 
74 	// Allocate new block.
75 	if (!m_data)
76 	{
77 		m_data = reinterpret_cast<uint8_t*>(malloc(length));
78 		if (!m_data)
79 		{
80 			throw std::runtime_error("failed to allocate memory");
81 		}
82 	}
83 	// Reallocate previous block.
84 	else
85 	{
86 		void * newBlob = realloc(m_data, length);
87 		if (!newBlob)
88 		{
89 			throw std::runtime_error("failed to reallocate memory");
90 		}
91 		m_data = reinterpret_cast<uint8_t*>(newBlob);
92 	}
93 
94 	// Set length.
95 	m_length = length;
96 }
97 
append(const uint8_t * newData,unsigned newDataLength)98 void Blob::append(const uint8_t * newData, unsigned newDataLength)
99 {
100 	unsigned oldLength = m_length;
101 
102 	setLength(m_length + newDataLength);
103 
104 	memcpy(m_data + oldLength, newData, newDataLength);
105 }
106 
clear()107 void Blob::clear()
108 {
109 	if (m_data)
110 	{
111 		free(m_data);
112 		m_data = NULL;
113 	}
114 
115 	m_length = 0;
116 }
117 
relinquish()118 void Blob::relinquish()
119 {
120 	m_data = NULL;
121 	m_length = 0;
122 }
123 
124