Skip to content

Commit e5cebf7

Browse files
committed
Add dummy 2
1 parent 3aad67d commit e5cebf7

File tree

1 file changed

+196
-0
lines changed

1 file changed

+196
-0
lines changed

cores/esp32/dummy2.cpp

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
cbuf.cpp - Circular buffer implementation
3+
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
4+
This file is part of the esp8266 core for Arduino environment.
5+
6+
This library is free software; you can redistribute it and/or
7+
modify it under the terms of the GNU Lesser General Public
8+
License as published by the Free Software Foundation; either
9+
version 2.1 of the License, or (at your option) any later version.
10+
11+
This library is distributed in the hope that it will be useful,
12+
but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
Lesser General Public License for more details.
15+
16+
You should have received a copy of the GNU Lesser General Public
17+
License along with this library; if not, write to the Free Software
18+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
*/
20+
21+
#include "cbuf.h"
22+
23+
cbuf::cbuf(size_t size) :
24+
next(NULL), _size(size+1), _buf(new char[size+1]), _bufend(_buf + size + 1), _begin(_buf), _end(_begin)
25+
{
26+
}
27+
28+
cbuf::~cbuf()
29+
{
30+
delete[] _buf;
31+
}
32+
33+
size_t cbuf::resizeAdd(size_t addSize)
34+
{
35+
return resize(_size + addSize);
36+
}
37+
38+
size_t cbuf::resize(size_t newSize)
39+
{
40+
41+
size_t bytes_available = available();
42+
newSize += 1;
43+
// not lose any data
44+
// if data can be lost use remove or flush before resize
45+
if((newSize < bytes_available) || (newSize == _size)) {
46+
return _size;
47+
}
48+
49+
char *newbuf = new char[newSize];
50+
char *oldbuf = _buf;
51+
52+
if(!newbuf) {
53+
return _size;
54+
}
55+
56+
if(_buf) {
57+
read(newbuf, bytes_available);
58+
memset((newbuf + bytes_available), 0x00, (newSize - bytes_available));
59+
}
60+
61+
_begin = newbuf;
62+
_end = newbuf + bytes_available;
63+
_bufend = newbuf + newSize;
64+
_size = newSize;
65+
66+
_buf = newbuf;
67+
delete[] oldbuf;
68+
69+
return _size;
70+
}
71+
72+
size_t cbuf::available() const
73+
{
74+
if(_end >= _begin) {
75+
return _end - _begin;
76+
}
77+
return _size - (_begin - _end);
78+
}
79+
80+
size_t cbuf::size()
81+
{
82+
return _size;
83+
}
84+
85+
size_t cbuf::room() const
86+
{
87+
if(_end >= _begin) {
88+
return _size - (_end - _begin) - 1;
89+
}
90+
return _begin - _end - 1;
91+
}
92+
93+
int cbuf::peek()
94+
{
95+
if(empty()) {
96+
return -1;
97+
}
98+
99+
return static_cast<int>(*_begin);
100+
}
101+
102+
size_t cbuf::peek(char *dst, size_t size)
103+
{
104+
size_t bytes_available = available();
105+
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
106+
size_t size_read = size_to_read;
107+
char * begin = _begin;
108+
if(_end < _begin && size_to_read > (size_t) (_bufend - _begin)) {
109+
size_t top_size = _bufend - _begin;
110+
memcpy(dst, _begin, top_size);
111+
begin = _buf;
112+
size_to_read -= top_size;
113+
dst += top_size;
114+
}
115+
memcpy(dst, begin, size_to_read);
116+
return size_read;
117+
}
118+
119+
int cbuf::read()
120+
{
121+
if(empty()) {
122+
return -1;
123+
}
124+
125+
char result = *_begin;
126+
_begin = wrap_if_bufend(_begin + 1);
127+
return static_cast<int>(result);
128+
}
129+
130+
size_t cbuf::read(char* dst, size_t size)
131+
{
132+
size_t bytes_available = available();
133+
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
134+
size_t size_read = size_to_read;
135+
if(_end < _begin && size_to_read > (size_t) (_bufend - _begin)) {
136+
size_t top_size = _bufend - _begin;
137+
memcpy(dst, _begin, top_size);
138+
_begin = _buf;
139+
size_to_read -= top_size;
140+
dst += top_size;
141+
}
142+
memcpy(dst, _begin, size_to_read);
143+
_begin = wrap_if_bufend(_begin + size_to_read);
144+
return size_read;
145+
}
146+
147+
size_t cbuf::write(char c)
148+
{
149+
if(full()) {
150+
return 0;
151+
}
152+
153+
*_end = c;
154+
_end = wrap_if_bufend(_end + 1);
155+
return 1;
156+
}
157+
158+
size_t cbuf::write(const char* src, size_t size)
159+
{
160+
size_t bytes_available = room();
161+
size_t size_to_write = (size < bytes_available) ? size : bytes_available;
162+
size_t size_written = size_to_write;
163+
if(_end >= _begin && size_to_write > (size_t) (_bufend - _end)) {
164+
size_t top_size = _bufend - _end;
165+
memcpy(_end, src, top_size);
166+
_end = _buf;
167+
size_to_write -= top_size;
168+
src += top_size;
169+
}
170+
memcpy(_end, src, size_to_write);
171+
_end = wrap_if_bufend(_end + size_to_write);
172+
return size_written;
173+
}
174+
175+
void cbuf::flush()
176+
{
177+
_begin = _buf;
178+
_end = _buf;
179+
}
180+
181+
size_t cbuf::remove(size_t size)
182+
{
183+
size_t bytes_available = available();
184+
if(size >= bytes_available) {
185+
flush();
186+
return 0;
187+
}
188+
size_t size_to_remove = (size < bytes_available) ? size : bytes_available;
189+
if(_end < _begin && size_to_remove > (size_t) (_bufend - _begin)) {
190+
size_t top_size = _bufend - _begin;
191+
_begin = _buf;
192+
size_to_remove -= top_size;
193+
}
194+
_begin = wrap_if_bufend(_begin + size_to_remove);
195+
return available();
196+
}

0 commit comments

Comments
 (0)