Merge branch 'master' of git.dyninst.org:/pub/dyninst
[dyninst.git] / common / src / Buffer.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30 #include "Buffer.h"
31 #include <stdlib.h>
32
33 using namespace Dyninst;
34
35 const int Buffer::ALLOCATION_UNIT = 256;
36
37 Buffer::Buffer() : buffer_(NULL), size_(0), max_(0), start_(0) {}
38
39 Buffer::Buffer(Address addr, unsigned initial_size) : buffer_(NULL), size_(0), max_(0), start_(0) {
40    initialize(addr, initial_size);
41 };
42
43 Buffer::~Buffer() {
44    assert(buffer_);
45    free(buffer_);
46 };
47
48 void Buffer::initialize(Address a, unsigned s) {
49    assert(buffer_ == NULL);
50    start_ = a;
51    increase_allocation(s);
52 }
53    
54
55 unsigned Buffer::size() const {
56    return size_;
57 };
58 unsigned Buffer::max_size() const {
59    return max_;
60 };
61 bool Buffer::empty() const {
62    return (size_ == 0);
63 };
64
65 void Buffer::increase_allocation(int size) {
66    if (size <= 0) return;
67    // Round size up to the next allocation unit
68    size = ((size / ALLOCATION_UNIT) + 1) * ALLOCATION_UNIT;
69    max_ += size;
70    buffer_ = (unsigned char *)::realloc(buffer_, max_);
71    assert(buffer_);
72 }
73
74 unsigned char *Buffer::cur_ptr() const {
75    return &(buffer_[size_]);
76 }
77
78 Buffer::byte_iterator Buffer::begin() const {
79    return byte_iterator(buffer_);
80 }
81
82 Buffer::byte_iterator Buffer::end() const {
83    return byte_iterator(cur_ptr());
84 }
85
86 namespace Dyninst {
87    template<>
88    void Buffer::copy(unsigned char *begin, unsigned char *end) {
89       unsigned added_size = (long)end - (long)begin;
90       if ((size_ + added_size) > max_) 
91          increase_allocation(added_size);
92       memcpy(cur_ptr(), begin, added_size);
93       size_ += added_size;
94    }
95 }   
96
97 void Buffer::copy(void *buf, unsigned size) {
98    unsigned char *begin = (unsigned char *) buf;
99    unsigned char *end = begin + size;
100
101    copy(begin, end);
102 }
103