gwenhywfar
4.3.3
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
src
base
fastbuffer.c
Go to the documentation of this file.
1
/***************************************************************************
2
begin : Tue Apr 27 2010
3
copyright : (C) 2010 by Martin Preuss
4
email : martin@libchipcard.de
5
6
***************************************************************************
7
* Please see toplevel file COPYING for license details *
8
***************************************************************************/
9
10
#ifdef HAVE_CONFIG_H
11
# include <config.h>
12
#endif
13
14
15
#define DISABLE_DEBUGLOG
16
17
18
#include "
fastbuffer.h
"
19
20
#include "
i18n_l.h
"
21
#include <gwenhywfar/misc.h>
22
#include <gwenhywfar/debug.h>
23
24
#include <assert.h>
25
26
27
GWEN_FAST_BUFFER
*
GWEN_FastBuffer_new
(uint32_t bsize,
GWEN_SYNCIO
*io) {
28
GWEN_FAST_BUFFER
*fb;
29
30
assert(bsize);
31
32
fb=(
GWEN_FAST_BUFFER
*) malloc(
sizeof
(
GWEN_FAST_BUFFER
)+bsize);
33
assert(fb);
34
memset(fb, 0,
sizeof
(
GWEN_FAST_BUFFER
)+bsize);
35
36
fb->
bufferSize
=bsize;
37
38
fb->
io
=io;
39
40
return
fb;
41
}
42
43
44
45
void
GWEN_FastBuffer_free
(
GWEN_FAST_BUFFER
*fb) {
46
if
(fb) {
47
GWEN_FREE_OBJECT
(fb);
48
}
49
}
50
51
52
53
int
GWEN_FastBuffer_ReadLine
(
GWEN_FAST_BUFFER
*fb, uint8_t *p,
int
len) {
54
int
bytes;
55
int
copied=0;
56
57
if
(fb->
bufferReadPos
>=fb->
bufferWritePos
) {
58
int
rv;
59
60
rv=
GWEN_SyncIo_Read
(fb->
io
, fb->
buffer
, fb->
bufferSize
);
61
if
(rv<0) {
62
DBG_DEBUG
(
GWEN_LOGDOMAIN
,
"here (%d)"
, rv);
63
return
rv;
64
}
65
}
66
67
bytes=fb->
bufferWritePos
-fb->
bufferReadPos
;
68
if
(bytes>len)
69
bytes=len;
70
while
(bytes) {
71
uint8_t c;
72
73
c=fb->
buffer
[fb->
bufferReadPos
++];
74
fb->
bytesRead
++;
75
if
(c==10) {
76
*(p++)=c;
77
copied++;
78
break
;
79
}
80
else
if
(c!=13) {
81
*(p++)=c;
82
copied++;
83
}
84
bytes--;
85
}
/* while */
86
87
return
copied;
88
}
89
90
91
92
int
GWEN_FastBuffer_ReadLineToBuffer
(
GWEN_FAST_BUFFER
*fb,
GWEN_BUFFER
*buf) {
93
int
lineComplete=0;
94
int
hadSome=0;
95
96
while
(!lineComplete) {
97
int
bytes;
98
int
copied=0;
99
uint8_t *p;
100
101
if
(fb->
bufferReadPos
>=fb->
bufferWritePos
) {
102
int
rv;
103
104
rv=
GWEN_SyncIo_Read
(fb->
io
, fb->
buffer
, fb->
bufferSize
);
105
if
(rv<0) {
106
if
(rv==
GWEN_ERROR_EOF
&& hadSome) {
107
/* done */
108
return
0;
109
}
110
DBG_INFO
(
GWEN_LOGDOMAIN
,
"here (%d)"
, rv);
111
return
rv;
112
}
113
else
if
(rv==0) {
114
DBG_DEBUG
(
GWEN_LOGDOMAIN
,
"EOF met"
);
115
return
GWEN_ERROR_EOF
;
116
}
117
else
{
118
fb->
bufferWritePos
=rv;
119
fb->
bufferReadPos
=0;
120
}
121
}
122
123
bytes=fb->
bufferWritePos
-fb->
bufferReadPos
;
124
p=fb->
buffer
+fb->
bufferReadPos
;
125
while
(bytes) {
126
uint8_t c;
127
128
hadSome=1;
129
130
c=fb->
buffer
[fb->
bufferReadPos
++];
131
fb->
bytesRead
++;
132
bytes--;
133
if
(c==10) {
134
lineComplete=1;
135
/* don't include this character */
136
break
;
137
}
138
else
if
(c==13) {
139
break
;
140
}
141
else
{
142
copied++;
143
}
144
}
/* while */
145
146
if
(copied)
147
GWEN_Buffer_AppendBytes
(buf, (
const
char
*)p, copied);
148
}
149
150
return
0;
151
}
152
153
154
155
uint32_t
GWEN_FastBuffer_GetFlags
(
const
GWEN_FAST_BUFFER
*fb) {
156
assert(fb);
157
return
fb->
flags
;
158
}
159
160
161
162
void
GWEN_FastBuffer_SetFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
163
assert(fb);
164
fb->
flags
=fl;
165
}
166
167
168
169
void
GWEN_FastBuffer_AddFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
170
assert(fb);
171
fb->
flags
|=fl;
172
}
173
174
175
176
void
GWEN_FastBuffer_SubFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
177
assert(fb);
178
fb->
flags
&=~fl;
179
}
180
181
182
183
uint32_t
GWEN_FastBuffer_GetBytesWritten
(
const
GWEN_FAST_BUFFER
*fb) {
184
assert(fb);
185
return
fb->
bytesWritten
;
186
}
187
188
189
190
uint32_t
GWEN_FastBuffer_GetBytesRead
(
const
GWEN_FAST_BUFFER
*fb) {
191
assert(fb);
192
return
fb->
bytesRead
;
193
}
194
195
196
197
198
199
200
201
202
203
204
Generated on Thu Mar 20 2014 17:05:59 for gwenhywfar by
1.8.1.2