source: rtems-tools/rtemstoolkit/rld-buffer.cpp @ 3618a62

Last change on this file since 3618a62 was 635a28f, checked in by Chris Johns <chrisj@…>, on Apr 3, 2016 at 5:41:08 AM

rtemstoolkit: Add a buffer helper class to insert and extract data.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 * Copyright (c) 2016, Chris Johns <chrisj@rtems.org>
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <string.h>
18
19#include <rld-buffer.h>
20#include <rtems-utils.h>
21
22namespace rld
23{
24  namespace buffer
25  {
26    buffer::buffer (const size_t size, bool le)
27      : data (0),
28        size (size),
29        le (le),
30        in (0),
31        out (0),
32        level_ (0)
33    {
34      data = new uint8_t[size];
35      clear ();
36    }
37
38    buffer::buffer ()
39      : data (0),
40        size (0),
41        le (true),
42        in (0),
43        out (0),
44        level_ (0)
45    {
46    }
47
48    buffer::buffer (const buffer& orig)
49      : data (0),
50        size (orig.size),
51        le (orig.le),
52        in (orig.in),
53        out (orig.out),
54        level_ (orig.level_)
55    {
56      data = new uint8_t[size];
57      memcpy (data, orig.data, size);
58    }
59
60    buffer::~buffer ()
61    {
62      if (data)
63        delete [] data;
64    }
65
66    void
67    buffer::clear ()
68    {
69      memset (data, 0, size);
70      out = 0;
71      in = 0;
72      level_ = 0;
73    }
74
75    void
76    buffer::write (const void* data_, const size_t length)
77    {
78      if ((out + length) > size)
79        throw rld::error ("Buffer overflow", "buffer:write");
80      memcpy (&data[out], data_, length);
81      out += length;
82      if (out > level_)
83        level_ = out;
84    }
85
86    void
87    buffer::read (void* data_, const size_t length)
88    {
89      if ((in + length) > level_)
90        throw rld::error ("Buffer underflow", "buffer:read");
91      memcpy (data_, &data[in], length);
92      in += length;
93    }
94
95    void
96    buffer::fill (const size_t length, const uint8_t value)
97    {
98      if ((out + length) > size)
99        throw rld::error ("Buffer overflow", "buffer:fill");
100      memset (&data[out], value, length);
101      out += length;
102      if (out > level_)
103        level_ = out;
104    }
105
106    void
107    buffer::set (const size_t out_, const uint8_t value)
108    {
109      if (out_ < out)
110        throw rld::error ("Invalid set out", "buffer:set");
111      fill (out_ - out, value);
112    }
113
114    size_t
115    buffer::level () const
116    {
117      return level_;
118    }
119
120    void
121    buffer::write (files::image& img)
122    {
123      if (out > 0)
124      {
125        img.write (data, level_);
126        clear ();
127      }
128    }
129
130    void
131    buffer::read (files::image& img, size_t length)
132    {
133      if (length > size)
134        throw rld::error ("Invalid length", "buffer:read");
135      if (length == 0)
136        length = size;
137      img.read (data, length);
138      in = 0;
139      out = 0;
140      level_ = length;
141    }
142
143    void
144    buffer::dump ()
145    {
146      rtems::utils::dump (data, level_, 1);
147    }
148
149    buffer& operator<< (buffer& buf, const uint64_t value)
150    {
151      write < uint64_t > (buf, value);
152      return buf;
153    }
154
155    buffer& operator>> (buffer& buf, uint64_t& value)
156    {
157      read < uint64_t > (buf, value);
158      return buf;
159    }
160
161    buffer& operator<< (buffer& buf, const uint32_t value)
162    {
163      write < uint32_t > (buf, value);
164      return buf;
165    }
166
167    buffer& operator>> (buffer& buf, uint32_t& value)
168    {
169      read < uint32_t > (buf, value);
170      return buf;
171    }
172
173    buffer& operator<< (buffer& buf, const uint16_t value)
174    {
175      write < uint16_t > (buf, value);
176      return buf;
177    }
178
179    buffer& operator>> (buffer& buf, uint16_t& value)
180    {
181      read < uint16_t > (buf, value);
182      return buf;
183    }
184
185    buffer& operator<< (buffer& buf, const uint8_t value)
186    {
187      buf.write (&value, 1);
188      return buf;
189    }
190
191    buffer& operator>> (buffer& buf, uint8_t& value)
192    {
193      buf.read (&value, 1);
194      return buf;
195    }
196
197    buffer& operator<< (buffer& buf, const std::string& str)
198    {
199      buf.write (str.c_str (), str.size ());
200      return buf;
201    }
202
203    b_fill fill (const size_t amount, const uint8_t value)
204    {
205      return b_fill (amount, value);
206    }
207
208    b_set set (const size_t level, const uint8_t value)
209    {
210      return b_set (level, value);
211    }
212
213    b_skip skip (const size_t amount)
214    {
215      return b_skip (amount);
216    }
217  }
218}
Note: See TracBrowser for help on using the repository browser.