Skip to content

Commit e2a73ef

Browse files
committed
move function code of cbuf to cbuf.cpp
add peek for multiple bytes add remove add resizeAdd add resize
1 parent d5d0d73 commit e2a73ef

File tree

2 files changed

+146
-61
lines changed

2 files changed

+146
-61
lines changed

cores/esp8266/cbuf.cpp

Lines changed: 133 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,153 @@
2121
#include "cbuf.h"
2222
#include "c_types.h"
2323

24+
cbuf::cbuf(size_t size) :
25+
_size(size), _buf(new char[size]), _bufend(_buf + size), _begin(_buf), _end(_begin) {
26+
}
27+
28+
cbuf::~cbuf() {
29+
delete[] _buf;
30+
}
31+
32+
size_t cbuf::resizeAdd(size_t addSize) {
33+
return resize(_size + addSize);
34+
}
35+
36+
size_t cbuf::resize(size_t newSize) {
37+
38+
size_t available = getSize();
39+
40+
if((available > newSize) || (newSize == _size)) {
41+
return _size;
42+
}
43+
44+
char *newbuf = new char[newSize];
45+
char *oldbuf = _buf;
46+
47+
if(!newbuf) {
48+
return _size;
49+
}
50+
51+
if(_buf) {
52+
read(newbuf, available);
53+
memset((newbuf + available), 0x00, (newSize - available));
54+
}
55+
56+
_begin = newbuf;
57+
_end = newbuf + available;
58+
_bufend = newbuf + newSize;
59+
_size = newSize;
60+
61+
_buf = newbuf;
62+
delete[] oldbuf;
63+
64+
return _size;
65+
}
66+
2467
size_t ICACHE_RAM_ATTR cbuf::getSize() const {
2568
if(_end >= _begin) {
2669
return _end - _begin;
2770
}
2871
return _size - (_begin - _end);
2972
}
3073

74+
size_t cbuf::room() const {
75+
if(_end >= _begin) {
76+
return _size - (_end - _begin) - 1;
77+
}
78+
return _begin - _end - 1;
79+
}
80+
81+
int cbuf::peek() {
82+
if(empty())
83+
return -1;
84+
85+
return static_cast<int>(*_begin);
86+
}
87+
88+
size_t cbuf::peek(char *dst, size_t size) {
89+
size_t bytes_available = getSize();
90+
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
91+
size_t size_read = size_to_read;
92+
char * begin = _begin;
93+
if(_end < _begin && size_to_read > (size_t) (_bufend - _begin)) {
94+
size_t top_size = _bufend - _begin;
95+
memcpy(dst, _begin, top_size);
96+
begin = _buf;
97+
size_to_read -= top_size;
98+
dst += top_size;
99+
}
100+
memcpy(dst, begin, size_to_read);
101+
return size_read;
102+
}
103+
31104
int ICACHE_RAM_ATTR cbuf::read() {
32-
if(empty()) return -1;
105+
if(empty())
106+
return -1;
33107

34108
char result = *_begin;
35109
_begin = wrap_if_bufend(_begin + 1);
36110
return static_cast<int>(result);
37111
}
38112

113+
size_t cbuf::read(char* dst, size_t size) {
114+
size_t bytes_available = getSize();
115+
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
116+
size_t size_read = size_to_read;
117+
if(_end < _begin && size_to_read > (size_t) (_bufend - _begin)) {
118+
size_t top_size = _bufend - _begin;
119+
memcpy(dst, _begin, top_size);
120+
_begin = _buf;
121+
size_to_read -= top_size;
122+
dst += top_size;
123+
}
124+
memcpy(dst, _begin, size_to_read);
125+
_begin = wrap_if_bufend(_begin + size_to_read);
126+
return size_read;
127+
}
128+
39129
size_t ICACHE_RAM_ATTR cbuf::write(char c) {
40-
if(full()) return 0;
130+
if(full())
131+
return 0;
132+
133+
*_end = c;
134+
_end = wrap_if_bufend(_end + 1);
135+
return 1;
136+
}
137+
138+
size_t cbuf::write(const char* src, size_t size) {
139+
size_t bytes_available = room();
140+
size_t size_to_write = (size < bytes_available) ? size : bytes_available;
141+
size_t size_written = size_to_write;
142+
if(_end >= _begin && size_to_write > (size_t) (_bufend - _end)) {
143+
size_t top_size = _bufend - _end;
144+
memcpy(_end, src, top_size);
145+
_end = _buf;
146+
size_to_write -= top_size;
147+
src += top_size;
148+
}
149+
memcpy(_end, src, size_to_write);
150+
_end = wrap_if_bufend(_end + size_to_write);
151+
return size_written;
152+
}
153+
154+
void cbuf::flush() {
155+
_begin = _buf;
156+
_end = _buf;
157+
}
41158

42-
*_end = c;
43-
_end = wrap_if_bufend(_end + 1);
44-
return 1;
159+
size_t cbuf::remove(size_t size) {
160+
size_t bytes_available = getSize();
161+
if(size >= bytes_available) {
162+
flush();
163+
return 0;
164+
}
165+
size_t size_to_remove = (size < bytes_available) ? size : bytes_available;
166+
if(_end < _begin && size_to_remove > (size_t) (_bufend - _begin)) {
167+
size_t top_size = _bufend - _begin;
168+
_begin = _buf;
169+
size_to_remove -= top_size;
170+
}
171+
_begin = wrap_if_bufend(_begin + size_to_remove);
172+
return getSize();
45173
}

cores/esp8266/cbuf.h

Lines changed: 13 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,14 @@
2727

2828
class cbuf {
2929
public:
30-
cbuf(size_t size) :
31-
_size(size), _buf(new char[size]), _bufend(_buf + size), _begin(_buf), _end(_begin) {
32-
}
33-
34-
~cbuf() {
35-
delete[] _buf;
36-
}
30+
cbuf(size_t size);
31+
~cbuf();
3732

33+
size_t resizeAdd(size_t addSize);
34+
size_t resize(size_t newSize);
3835
size_t getSize() const;
3936

40-
size_t room() const {
41-
if(_end >= _begin) {
42-
return _size - (_end - _begin) - 1;
43-
}
44-
return _begin - _end - 1;
45-
}
37+
size_t room() const;
4638

4739
inline bool empty() const {
4840
return _begin == _end;
@@ -52,61 +44,26 @@ class cbuf {
5244
return wrap_if_bufend(_end + 1) == _begin;
5345
}
5446

55-
int peek() {
56-
if(empty()) return -1;
57-
58-
return static_cast<int>(*_begin);
59-
}
47+
int peek();
48+
size_t peek(char *dst, size_t size);
6049

6150
int read();
62-
63-
size_t read(char* dst, size_t size) {
64-
size_t bytes_available = getSize();
65-
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
66-
size_t size_read = size_to_read;
67-
if(_end < _begin && size_to_read > (size_t)(_bufend - _begin)) {
68-
size_t top_size = _bufend - _begin;
69-
memcpy(dst, _begin, top_size);
70-
_begin = _buf;
71-
size_to_read -= top_size;
72-
dst += top_size;
73-
}
74-
memcpy(dst, _begin, size_to_read);
75-
_begin = wrap_if_bufend(_begin + size_to_read);
76-
return size_read;
77-
}
51+
size_t read(char* dst, size_t size);
7852

7953
size_t write(char c);
54+
size_t write(const char* src, size_t size);
8055

81-
size_t write(const char* src, size_t size) {
82-
size_t bytes_available = room();
83-
size_t size_to_write = (size < bytes_available) ? size : bytes_available;
84-
size_t size_written = size_to_write;
85-
if(_end >= _begin && size_to_write > (size_t)(_bufend - _end)) {
86-
size_t top_size = _bufend - _end;
87-
memcpy(_end, src, top_size);
88-
_end = _buf;
89-
size_to_write -= top_size;
90-
src += top_size;
91-
}
92-
memcpy(_end, src, size_to_write);
93-
_end = wrap_if_bufend(_end + size_to_write);
94-
return size_written;
95-
}
96-
97-
void flush() {
98-
_begin = _buf;
99-
_end = _buf;
100-
}
56+
void flush();
57+
size_t remove(size_t size);
10158

10259
private:
10360
inline char* wrap_if_bufend(char* ptr) const {
10461
return (ptr == _bufend) ? _buf : ptr;
10562
}
10663

107-
const size_t _size;
64+
size_t _size;
10865
char* _buf;
109-
const char* const _bufend;
66+
const char* _bufend;
11067
char* _begin;
11168
char* _end;
11269
};

0 commit comments

Comments
 (0)