source: vscpl/src/hu/varadiistvan/scpl/io/DataStream.cc@ 14:e46811708269

Last change on this file since 14:e46811708269 was 10:1ee8d0a23099, checked in by István Váradi <ivaradi@…>, 11 years ago

Imported the code of the blocking and data streams

File size: 3.6 KB
Line 
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
35using hu::varadiistvan::scpl::io::DataStream;
36
37using std::string;
38using std::min;
39
40//------------------------------------------------------------------------------
41
42size_t DataStream::readLength()
43{
44 size_t length = 0;
45
46 uint8_t d = 0;
47 do {
48 d = readU8();
49 length <<= 7;
50 length |= d&0x7f;
51 } while( (d&0x80)==0x80 );
52
53 return length;
54}
55
56//------------------------------------------------------------------------------
57
58string DataStream::readString()
59{
60 size_t length = readLength();
61 if (!*this) return "";
62
63 char* buffer = new char[length];
64 if (read(buffer, length)) {
65 string str(buffer, length);
66 delete buffer;
67 return str;
68 } else {
69 delete buffer;
70 return "";
71 }
72}
73
74//------------------------------------------------------------------------------
75
76size_t DataStream::readString(char* dest, size_t capacity)
77{
78 size_t length = readLength();
79 size_t destLength = 0;
80 if (*this && length>0) {
81 size_t destLength = min(length, capacity - 1);
82 if (read(dest, destLength)) {
83 if (destLength<length) {
84 if (!skip(length - destLength)) {
85 length = destLength = 0;
86 }
87 }
88 } else {
89 length = destLength = 0;
90 }
91 } else {
92 length = 0;
93 }
94
95 dest[destLength] = '\0';
96
97 return length;
98}
99
100//------------------------------------------------------------------------------
101
102bool DataStream::writeLength(size_t length)
103{
104 do {
105 uint8_t x = length&0x7f;
106 length >>= 7;
107 if (length>0) x |= 0x80;
108 if (!writeU8(x)) return false;
109 } while(length>0);
110 return true;
111}
112
113//------------------------------------------------------------------------------
114
115// Local Variables:
116// mode: C++
117// c-basic-offset: 4
118// indent-tabs-mode: nil
119// End:
Note: See TracBrowser for help on using the repository browser.