gwenhywfar
4.6.0beta
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
if
(!hadSome)
116
return
GWEN_ERROR_EOF
;
117
lineComplete=1;
118
/* TODO: maybe we should have a flag that indicates that we met EOF here... */
119
}
120
else
{
121
fb->
bufferWritePos
=rv;
122
fb->
bufferReadPos
=0;
123
}
124
}
125
126
bytes=fb->
bufferWritePos
-fb->
bufferReadPos
;
127
p=fb->
buffer
+fb->
bufferReadPos
;
128
while
(bytes) {
129
uint8_t c;
130
131
hadSome=1;
132
133
c=fb->
buffer
[fb->
bufferReadPos
++];
134
fb->
bytesRead
++;
135
bytes--;
136
if
(c==10) {
137
lineComplete=1;
138
/* don't include this character */
139
break
;
140
}
141
else
if
(c==13) {
142
break
;
143
}
144
else
{
145
copied++;
146
}
147
}
/* while */
148
149
if
(copied)
150
GWEN_Buffer_AppendBytes
(buf, (
const
char
*)p, copied);
151
}
152
153
return
0;
154
}
155
156
157
158
uint32_t
GWEN_FastBuffer_GetFlags
(
const
GWEN_FAST_BUFFER
*fb) {
159
assert(fb);
160
return
fb->
flags
;
161
}
162
163
164
165
void
GWEN_FastBuffer_SetFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
166
assert(fb);
167
fb->
flags
=fl;
168
}
169
170
171
172
void
GWEN_FastBuffer_AddFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
173
assert(fb);
174
fb->
flags
|=fl;
175
}
176
177
178
179
void
GWEN_FastBuffer_SubFlags
(
GWEN_FAST_BUFFER
*fb, uint32_t fl) {
180
assert(fb);
181
fb->
flags
&=~fl;
182
}
183
184
185
186
uint32_t
GWEN_FastBuffer_GetBytesWritten
(
const
GWEN_FAST_BUFFER
*fb) {
187
assert(fb);
188
return
fb->
bytesWritten
;
189
}
190
191
192
193
uint32_t
GWEN_FastBuffer_GetBytesRead
(
const
GWEN_FAST_BUFFER
*fb) {
194
assert(fb);
195
return
fb->
bytesRead
;
196
}
197
198
199
200
201
202
203
204
205
206
207
Generated on Wed May 29 2013 05:31:47 for gwenhywfar by
1.8.3.1