Very Simple Cross-Platform Library
src
hu
varadiistvan
scpl
io
DataStream.cc
1
// Copyright (c) 2013 by István Váradi
2
3
// This file is part of VSCPL, a simple cross-platform utility library
4
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are met:
7
8
// 1. Redistributions of source code must retain the above copyright notice, this
9
// list of conditions and the following disclaimer.
10
// 2. Redistributions in binary form must reproduce the above copyright notice,
11
// this list of conditions and the following disclaimer in the documentation
12
// and/or other materials provided with the distribution.
13
14
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25
// The views and conclusions contained in the software and documentation are those
26
// of the authors and should not be interpreted as representing official policies,
27
// either expressed or implied, of the FreeBSD Project.
28
29
//------------------------------------------------------------------------------
30
31
#include "DataStream.h"
32
33
//------------------------------------------------------------------------------
34
35
using
hu::varadiistvan::scpl::io::DataStream
;
36
37
using
std::string;
38
using
std::min;
39
40
//------------------------------------------------------------------------------
41
42
size_t
DataStream::readLength()
43
{
44
size_t
length = 0;
45
46
uint8_t d = 0;
47
unsigned
shift = 0;
48
do
{
49
d =
readU8
();
50
length |=
static_cast<
size_t
>
(d&0x7f)<<shift;
51
shift += 7;
52
}
while
( (d&0x80)==0x80 );
53
54
return
length;
55
}
56
57
//------------------------------------------------------------------------------
58
59
string
DataStream::readString
()
60
{
61
size_t
length =
readLength
();
62
if
(!*
this
)
return
""
;
63
64
char
* buffer =
new
char
[length];
65
if
(
read
(buffer, length)) {
66
string
str(buffer, length);
67
delete
buffer;
68
return
str;
69
}
else
{
70
delete
buffer;
71
return
""
;
72
}
73
}
74
75
//------------------------------------------------------------------------------
76
77
size_t
DataStream::readString
(
char
* dest,
size_t
capacity)
78
{
79
size_t
length =
readLength
();
80
size_t
destLength = 0;
81
if
(*
this
&& length>0) {
82
size_t
destLength = min(length, capacity - 1);
83
if
(
read
(dest, destLength)) {
84
if
(destLength<length) {
85
if
(!
skip
(length - destLength)) {
86
length = destLength = 0;
87
}
88
}
89
}
else
{
90
length = destLength = 0;
91
}
92
}
else
{
93
length = 0;
94
}
95
96
dest[destLength] =
'\0'
;
97
98
return
length;
99
}
100
101
//------------------------------------------------------------------------------
102
103
bool
DataStream::writeLength
(
size_t
length)
104
{
105
do
{
106
uint8_t x = length&0x7f;
107
length >>= 7;
108
if
(length>0) x |= 0x80;
109
if
(!
writeU8
(x))
return
false
;
110
}
while
(length>0);
111
return
true
;
112
}
113
114
//------------------------------------------------------------------------------
115
116
// Local Variables:
117
// mode: C++
118
// c-basic-offset: 4
119
// indent-tabs-mode: nil
120
// End:
hu::varadiistvan::scpl::io::BlockingStream::read
bool read(void *dest, size_t length)
Definition:
BlockingStream.cc:62
hu::varadiistvan::scpl::io::BlockingStream::skip
bool skip(size_t length)
Definition:
BlockingStream.cc:83
hu::varadiistvan::scpl::io::DataStream
Definition:
DataStream.h:66
hu::varadiistvan::scpl::io::DataStream::readString
std::string readString()
Definition:
DataStream.cc:59
hu::varadiistvan::scpl::io::DataStream::writeLength
bool writeLength(size_t length)
Definition:
DataStream.cc:103
hu::varadiistvan::scpl::io::DataStream::readLength
size_t readLength()
Definition:
DataStream.cc:42
hu::varadiistvan::scpl::io::DataStream::writeU8
bool writeU8(uint8_t x)
Definition:
DataStream.h:343
hu::varadiistvan::scpl::io::DataStream::readU8
uint8_t readU8()
Definition:
DataStream.h:266
Generated on Fri Dec 23 2022 10:49:36 for Very Simple Cross-Platform Library by
1.9.1