1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Jos van den Oever
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
/* This file is part of Strigi Desktop Search
*
* Copyright (C) 2006 Jos van den Oever <jos@vandenoever.info>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef STRINGREADER_H
#define STRINGREADER_H
/**
* Author: Jos van den Oever
* Ben van Klinken
**/
#include "streambase.h"
namespace jstreams {
template <class T>
class StringReader : public StreamBase<T> {
private:
int64_t markpt;
T* data;
bool dataowner;
StringReader(const StringReader<T>&);
void operator=(const StringReader<T>&);
public:
StringReader(const T* value, int32_t length = -1, bool copy = true);
~StringReader();
int32_t read(const T*& start, int32_t min, int32_t max);
int64_t skip(int64_t ntoskip);
int64_t reset(int64_t pos);
};
typedef StringReader<char> StringInputStream;
template <class T>
StringReader<T>::StringReader(const T* value, int32_t length, bool copy)
: markpt(0), dataowner(copy) {
if (length < 0) {
length = 0;
while (value[length] != '\0') {
length++;
}
}
StreamBase<T>::size = length;
if (copy) {
data = new T[length+1];
size_t s = (size_t)(length*sizeof(T));
memcpy(data, value, s);
data[length] = 0;
} else {
// casting away const is ok, because we don't write anyway
data = (T*)value;
}
}
template <class T>
StringReader<T>::~StringReader() {
if (dataowner) {
delete [] data;
}
}
template <class T>
int32_t
StringReader<T>::read(const T*& start, int32_t min, int32_t max) {
int64_t left = StreamBase<T>::size - StreamBase<T>::position;
if (left == 0) {
StreamBase<T>::status = Eof;
return -1;
}
if (min < 0) min = 0;
int32_t nread = (int32_t)((max > left || max < 1) ?left :max);
start = data + StreamBase<T>::position;
StreamBase<T>::position += nread;
if (StreamBase<T>::position == StreamBase<T>::size) {
StreamBase<T>::status = Eof;
}
return nread;
}
template <class T>
int64_t
StringReader<T>::skip(int64_t ntoskip) {
const T* start;
return read(start, ntoskip, ntoskip);
}
template <class T>
int64_t
StringReader<T>::reset(int64_t newpos) {
if (newpos < 0) {
StreamBase<T>::status = Ok;
StreamBase<T>::position = 0;
} else if (newpos < StreamBase<T>::size) {
StreamBase<T>::status = Ok;
StreamBase<T>::position = newpos;
} else {
StreamBase<T>::position = StreamBase<T>::size;
StreamBase<T>::status = Eof;
}
return StreamBase<T>::position;
}
} // end namespace jstreams
#endif
|