gwenhywfar 5.12.1
fastbuffer.h
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
11#ifndef GWEN_FASTBUFFER_H
12#define GWEN_FASTBUFFER_H
13
14
15#include <gwenhywfar/syncio.h>
16#include <gwenhywfar/buffer.h>
17
18
19#define GWEN_FAST_BUFFER_FLAGS_DOSMODE 0x00000001
20
21
29typedef struct {
31 uint32_t bufferSize;
32 uint32_t bufferReadPos;
34 uint32_t flags;
35 uint32_t bytesWritten;
36 uint32_t bytesRead;
37 uint8_t buffer[1];
39
40
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46
48
50
51
56
59
62
63
64#ifdef __cplusplus
65}
66#endif
67
68
74#define GWEN_FASTBUFFER_PEEKBYTE(fb, var) {\
75 if (fb->bufferReadPos>=fb->bufferWritePos) { \
76 int fb_peekbyte_rv; \
77 \
78 fb_peekbyte_rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize); \
79 if (fb_peekbyte_rv<0) { \
80 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_peekbyte_rv); \
81 var=fb_peekbyte_rv; \
82 } \
83 else if (fb_peekbyte_rv==0) { \
84 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met"); \
85 var=GWEN_ERROR_EOF; \
86 } \
87 else { \
88 fb->bufferWritePos=fb_peekbyte_rv; \
89 fb->bufferReadPos=0; \
90 var=((int)((fb->buffer[fb->bufferReadPos])) & 0xff); \
91 } \
92 } \
93 else { \
94 var=((int)((fb->buffer[fb->bufferReadPos])) & 0xff); \
95 } \
96 }
97
98
103#define GWEN_FASTBUFFER_READBYTE(fb, var) {\
104 if (fb->bufferReadPos>=fb->bufferWritePos) { \
105 int fb_readbyte_rv; \
106 \
107 fb_readbyte_rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize); \
108 if (fb_readbyte_rv<0) { \
109 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_readbyte_rv); \
110 var=fb_readbyte_rv; \
111 } \
112 else if (fb_readbyte_rv==0) { \
113 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met"); \
114 var=GWEN_ERROR_EOF; \
115 } \
116 else { \
117 fb->bufferWritePos=fb_readbyte_rv; \
118 fb->bufferReadPos=0; \
119 var=((int)((fb->buffer[fb->bufferReadPos++])) & 0xff); \
120 fb->bytesRead++; \
121 } \
122 } \
123 else { \
124 var=((int)((fb->buffer[fb->bufferReadPos++])) & 0xff); \
125 fb->bytesRead++; \
126 } \
127 }
128
129
134#define GWEN_FASTBUFFER_WRITEBYTE(fb, var, chr) {\
135 if (fb->bufferWritePos>=fb->bufferSize) { \
136 int fb_writeByte_rv; \
137 \
138 fb_writeByte_rv=GWEN_SyncIo_WriteForced(fb->io, fb->buffer, fb->bufferWritePos); \
139 if (fb_writeByte_rv<(int)(fb->bufferWritePos)) { \
140 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", fb_writeByte_rv); \
141 var=fb_writeByte_rv; \
142 } \
143 else { \
144 var=0; \
145 fb->bufferWritePos=0; \
146 fb->buffer[fb->bufferWritePos++]=chr; \
147 fb->bytesWritten++; \
148 } \
149 } \
150 else { \
151 var=0; \
152 fb->buffer[fb->bufferWritePos++]=chr; \
153 fb->bytesWritten++; \
154 } \
155 }
156
157
162#define GWEN_FASTBUFFER_FLUSH(fb, var) {\
163 int fb_flush_rv; \
164 \
165 fb_flush_rv=GWEN_SyncIo_WriteForced(fb->io, fb->buffer, fb->bufferWritePos); \
166 if (fb_flush_rv<(int)(fb->bufferWritePos)) { \
167 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", fb_flush_rv); \
168 var=fb_flush_rv; \
169 } \
170 else { \
171 var=0; \
172 fb->bufferWritePos=0; \
173 } \
174 }
175
176
184#define GWEN_FASTBUFFER_READBYTES(fb, var, p, len) { \
185 int fb_readbyte_bytes;\
186 \
187 var=0; \
188 if (fb->bufferReadPos>=fb->bufferWritePos) { \
189 int fb_readbyte_rv; \
190 \
191 fb_readbyte_rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize); \
192 if (fb_readbyte_rv<0) { \
193 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_readbyte_rv); \
194 var=fb_readbyte_rv; \
195 } \
196 else {\
197 fb->bufferWritePos=fb_readbyte_rv; \
198 fb->bufferReadPos=0; \
199 }\
200 }\
201 if (var==0) {\
202 fb_readbyte_bytes=fb->bufferWritePos-fb->bufferReadPos;\
203 if (fb_readbyte_bytes>len)\
204 fb_readbyte_bytes=len;\
205 if (fb_readbyte_bytes) {\
206 memmove(p, fb->buffer+fb->bufferReadPos, fb_readbyte_bytes);\
207 fb->bufferReadPos+=fb_readbyte_bytes;\
208 fb->bytesRead+=fb_readbyte_bytes; \
209 }\
210 var=fb_readbyte_bytes;\
211 }\
212}
213
214
215
216#define GWEN_FASTBUFFER_READLINE(fb, var, p, len) {\
217 int fb_readline_bytes;\
218 \
219 var=0;\
220 if (fb->bufferReadPos>=fb->bufferWritePos) {\
221 int fb_readline_rv;\
222 \
223 fb_readline_rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);\
224 if (fb_readline_rv<0) {\
225 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_readline_rv);\
226 var=fb_readline_rv;\
227 }\
228 else {\
229 fb->bufferWritePos=fb_rv; \
230 fb->bufferReadPos=0; \
231 }\
232 }\
233 if (var==0) {\
234 fb_readline_bytes=fb->bufferWritePos-fb->bufferReadPos;\
235 if (fb_readline_bytes>len)\
236 fb_readline_bytes=len;\
237 if (fb_readline_bytes) {\
238 uint8_t *fb_readline_p;\
239 \
240 fb_readline_p=(uint8_t*)p;\
241 \
242 while(fb_readline_bytes) {\
243 uint8_t c;\
244 \
245 c=fb->buffer[fb->bufferReadPos++];\
246 fb->bytesRead++; \
247 fb_readline_bytes--;\
248 if (c==10) {\
249 *(fb_readline_p++)=c;\
250 var++;\
251 break;\
252 }\
253 else if (c!=13) {\
254 *(fb_readline_p++)=c;\
255 var++;\
256 }\
257 }\
258 }\
259 }\
260}
261
262
263
264#define GWEN_FASTBUFFER_READLINEFORCED(fb, var, p, len) {\
265 int fb_readlineforced_len;\
266 uint8_t *fb_readlineforced_p;\
267 \
268 fb_readlineforced_len=len;\
269 fb_readlineforced_p=(uint8_t*)p;\
270 var=0;\
271 while(fb_readlineforced_len && var==0) {\
272 int fb_readlineforced_rv;\
273 \
274 GWEN_FASTBUFFER_READLINE(fb, fb_readlineforced_rv, fb_readlineforced_p, fb_readlineforced_len);\
275 if (fb_readlineforced_rv<0) {\
276 var=fb_readlineforced_rv;\
277 break;\
278 }\
279 else if (fb_readlineforced_rv==0) {\
280 var=GWEN_ERROR_EOF;\
281 break;\
282 }\
283 else {\
284 if (fb_readlineforced_p[fb_readlineforced_rv-1]==10) {\
285 fb_readlineforced_p[fb_readlineforced_rv-1]=0;\
286 var=fb_readlineforced_rv;\
287 break;\
288 }\
289 fb_readlineforced_len-=fb_readlineforced_rv;\
290 fb_readlineforced_p+=fb_readlineforced_rv;\
291 }\
292 }\
293 if (var==0) {\
294 DBG_INFO(GWEN_LOGDOMAIN, "No line within %d bytes", len);\
295 var=GWEN_ERROR_BAD_SIZE;\
296 }\
297}
298
299
300
301#define GWEN_FASTBUFFER_READFORCED(fb, var, p, len) {\
302 int fb_readforced_len;\
303 uint8_t *fb_readforced_p;\
304 \
305 fb_readforced_len=len;\
306 fb_readforced_p=(uint8_t*)p;\
307 var=0;\
308 while(fb_readforced_len && var==0) {\
309 int fb_readforced_rv;\
310 \
311 GWEN_FASTBUFFER_READBYTES(fb, fb_readforced_rv, fb_readforced_p, fb_readforced_len);\
312 if (fb_readforced_rv<0) {\
313 var=fb_readforced_rv;\
314 break;\
315 }\
316 else if (fb_readforced_rv==0) {\
317 var=GWEN_ERROR_EOF;\
318 break;\
319 }\
320 else {\
321 fb_readforced_len-=fb_readforced_rv;\
322 fb_readforced_p+=fb_readforced_rv;\
323 }\
324 }\
325}
326
327
328
336#define GWEN_FASTBUFFER_WRITEBYTES(fb, var, p, len) {\
337 int fb_writebytes_bytes;\
338 int fb_writebytes_len;\
339 \
340 fb_writebytes_len=len;\
341 if (fb_writebytes_len==-1)\
342 fb_writebytes_len=strlen((const char*)p);\
343 var=0; \
344 if (fb->bufferWritePos>=fb->bufferSize) { \
345 int fb_writebytes_rv; \
346 \
347 fb_writebytes_rv=GWEN_SyncIo_WriteForced(fb->io, fb->buffer, fb->bufferWritePos); \
348 if (fb_writebytes_rv<(int)(fb->bufferWritePos)) { \
349 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_writebytes_rv); \
350 var=fb_writebytes_rv; \
351 } \
352 else {\
353 fb->bufferWritePos=0; \
354 }\
355 }\
356 if (var==0) {\
357 fb_writebytes_bytes=fb->bufferSize-fb->bufferWritePos;\
358 if (fb_writebytes_bytes>fb_writebytes_len)\
359 fb_writebytes_bytes=fb_writebytes_len;\
360 if (fb_writebytes_bytes) {\
361 memmove(fb->buffer+fb->bufferWritePos, p, fb_writebytes_bytes);\
362 fb->bufferWritePos+=fb_writebytes_bytes;\
363 fb->bytesWritten+=fb_writebytes_bytes; \
364 }\
365 var=fb_writebytes_bytes;\
366 }\
367}
368
369
377#define GWEN_FASTBUFFER_WRITEFORCED(fb, var, p, len) {\
378 int fb_writeforced_len;\
379 const uint8_t *fb_writeforced_p;\
380 \
381 fb_writeforced_len=len;\
382 if (fb_writeforced_len==-1) \
383 fb_writeforced_len=strlen((const char*)p);\
384 fb_writeforced_p=(const uint8_t*)p;\
385 var=0;\
386 while(fb_writeforced_len && var==0) {\
387 int fb_writeforced_rv;\
388 \
389 GWEN_FASTBUFFER_WRITEBYTES(fb, fb_writeforced_rv, fb_writeforced_p, fb_writeforced_len);\
390 if (fb_writeforced_rv<0) {\
391 var=fb_writeforced_rv;\
392 break;\
393 }\
394 else if (fb_writeforced_rv==0) {\
395 var=GWEN_ERROR_EOF;\
396 break;\
397 }\
398 else {\
399 fb_writeforced_len-=fb_writeforced_rv;\
400 fb_writeforced_p+=fb_writeforced_rv;\
401 }\
402 }\
403}
404
405
406
407#define GWEN_FASTBUFFER_WRITELINE(fb, var, p) {\
408 int fb_writeline_rv;\
409 int fb_writeline_len=strlen((const char*)p);\
410 \
411 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, p, fb_writeline_len);\
412 if (fb_writeline_rv<0)\
413 var=fb_writeline_rv;\
414 else {\
415 if (fb->flags & GWEN_FAST_BUFFER_FLAGS_DOSMODE) {\
416 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, "\r\n", 2);\
417 }\
418 else {\
419 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, "\n", 1);\
420 }\
421 if (fb_writeline_rv<0)\
422 var=fb_writeline_rv;\
423 else\
424 var=0;\
425 }\
426}
427
428
429
437#define GWEN_FASTBUFFER_COPYBYTES(fb1, fb2, var, len) { \
438 int fb_copybytes_bytes;\
439 \
440 var=0; \
441 if (fb1->bufferReadPos>=fb1->bufferWritePos) { \
442 int fb_copybytes_rv; \
443 \
444 fb_copybytes_rv=GWEN_SyncIo_Read(fb1->io, fb1->buffer, fb1->bufferSize); \
445 if (fb_copybytes_rv<0) { \
446 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", fb_copybytes_rv); \
447 var=fb_copybytes_rv; \
448 } \
449 else {\
450 fb1->bufferWritePos=fb_copybytes_rv; \
451 fb1->bufferReadPos=0; \
452 }\
453 }\
454 if (var==0) {\
455 fb_bytes=fb1->bufferWritePos-fb1->bufferReadPos;\
456 if (fb_copybytes_bytes>len)\
457 fb_copybytes_bytes=len;\
458 if (fb_copybytes_bytes) {\
459 int fb_copybytes_rv;\
460 \
461 GWEN_FASTBUFFER_WRITEBYTES(fb2, fb_copybytes_rv, (fb1->buffer+fb1->bufferReadPos), fb_bytes);\
462 var=fb_copybytes_rv;\
463 if (fb_copybytes_rv>0) {\
464 fb1->bufferReadPos+=fb_copybytes_rv;\
465 fb1->bytesRead+=fb_copybytes_rv; \
466 }\
467 }\
468 }\
469}
470
471
472
481#define GWEN_FASTBUFFER_COPYFORCED(fb1, fb2, var, p, len) {\
482 int fb_copyforced_len;\
483 uint8_t *fb_copyforced_p;\
484 \
485 fb_copyforced_len=len;\
486 fb_copyforced_p=(uint8_t*)p;\
487 var=0;\
488 while(fb_copyforced_len && var==0) {\
489 int fb_copyforced_rv;\
490 \
491 GWEN_FASTBUFFER_COPYBYTES(fb1, fb2, fb_copyforced_rv, fb_copyforced_p, fb_copyforced_len);\
492 if (fb_copyforced_rv<0) {\
493 var=fb_copyforced_rv;\
494 break;\
495 }\
496 else if (fb_copyforced_rv==0)\
497 var=GWEN_ERROR_EOF;\
498 else {\
499 fb_len-=fb_copyforced_rv;\
500 fb_p+=fb_copyforced_rv;\
501 }\
502 }\
503}
504
505
506
507
508#endif
509
510
511
GWENHYWFAR_API void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API void GWEN_FastBuffer_SubFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetBytesWritten(const GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf)
GWENHYWFAR_API void GWEN_FastBuffer_AddFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
GWENHYWFAR_API int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len)
GWENHYWFAR_API void GWEN_FastBuffer_SetFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
GWENHYWFAR_API GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWENHYWFAR_API
uint32_t bytesWritten
Definition fastbuffer.h:35
uint32_t bufferReadPos
Definition fastbuffer.h:32
uint32_t bufferWritePos
Definition fastbuffer.h:33
uint32_t bytesRead
Definition fastbuffer.h:36
uint32_t bufferSize
Definition fastbuffer.h:31
GWEN_SYNCIO * io
Definition fastbuffer.h:30
struct GWEN_SYNCIO GWEN_SYNCIO
Definition syncio.h:40