11 #ifndef GWEN_FASTBUFFER_H
12 #define GWEN_FASTBUFFER_H
19 #define GWEN_FAST_BUFFER_FLAGS_DOSMODE 0x00000001
74 #define GWEN_FASTBUFFER_PEEKBYTE(fb, var) {\
75 if (fb->bufferReadPos>=fb->bufferWritePos) { \
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); \
83 else if (fb_peekbyte_rv==0) { \
84 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met"); \
88 fb->bufferWritePos=fb_peekbyte_rv; \
89 fb->bufferReadPos=0; \
90 var=((int)((fb->buffer[fb->bufferReadPos])) & 0xff); \
94 var=((int)((fb->buffer[fb->bufferReadPos])) & 0xff); \
103 #define GWEN_FASTBUFFER_READBYTE(fb, var) {\
104 if (fb->bufferReadPos>=fb->bufferWritePos) { \
105 int fb_readbyte_rv; \
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; \
112 else if (fb_readbyte_rv==0) { \
113 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met"); \
114 var=GWEN_ERROR_EOF; \
117 fb->bufferWritePos=fb_readbyte_rv; \
118 fb->bufferReadPos=0; \
119 var=((int)((fb->buffer[fb->bufferReadPos++])) & 0xff); \
124 var=((int)((fb->buffer[fb->bufferReadPos++])) & 0xff); \
134 #define GWEN_FASTBUFFER_WRITEBYTE(fb, var, chr) {\
135 if (fb->bufferWritePos>=fb->bufferSize) { \
136 int fb_writeByte_rv; \
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; \
145 fb->bufferWritePos=0; \
146 fb->buffer[fb->bufferWritePos++]=chr; \
147 fb->bytesWritten++; \
152 fb->buffer[fb->bufferWritePos++]=chr; \
153 fb->bytesWritten++; \
162 #define GWEN_FASTBUFFER_FLUSH(fb, var) {\
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); \
172 fb->bufferWritePos=0; \
184 #define GWEN_FASTBUFFER_READBYTES(fb, var, p, len) { \
185 int fb_readbyte_bytes;\
188 if (fb->bufferReadPos>=fb->bufferWritePos) { \
189 int fb_readbyte_rv; \
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; \
197 fb->bufferWritePos=fb_readbyte_rv; \
198 fb->bufferReadPos=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; \
210 var=fb_readbyte_bytes;\
216 #define GWEN_FASTBUFFER_READLINE(fb, var, p, len) {\
217 int fb_readline_bytes;\
220 if (fb->bufferReadPos>=fb->bufferWritePos) {\
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);\
229 fb->bufferWritePos=fb_rv; \
230 fb->bufferReadPos=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;\
240 fb_readline_p=(uint8_t*)p;\
242 while(fb_readline_bytes) {\
245 c=fb->buffer[fb->bufferReadPos++];\
247 fb_readline_bytes--;\
249 *(fb_readline_p++)=c;\
254 *(fb_readline_p++)=c;\
264 #define GWEN_FASTBUFFER_READLINEFORCED(fb, var, p, len) {\
265 int fb_readlineforced_len;\
266 uint8_t *fb_readlineforced_p;\
268 fb_readlineforced_len=len;\
269 fb_readlineforced_p=(uint8_t*)p;\
271 while(fb_readlineforced_len && var==0) {\
272 int fb_readlineforced_rv;\
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;\
279 else if (fb_readlineforced_rv==0) {\
284 if (fb_readlineforced_p[fb_readlineforced_rv-1]==10) {\
285 fb_readlineforced_p[fb_readlineforced_rv-1]=0;\
286 var=fb_readlineforced_rv;\
289 fb_readlineforced_len-=fb_readlineforced_rv;\
290 fb_readlineforced_p+=fb_readlineforced_rv;\
294 DBG_INFO(GWEN_LOGDOMAIN, "No line within %d bytes", len);\
295 var=GWEN_ERROR_BAD_SIZE;\
301 #define GWEN_FASTBUFFER_READFORCED(fb, var, p, len) {\
302 int fb_readforced_len;\
303 uint8_t *fb_readforced_p;\
305 fb_readforced_len=len;\
306 fb_readforced_p=(uint8_t*)p;\
308 while(fb_readforced_len && var==0) {\
309 int fb_readforced_rv;\
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;\
316 else if (fb_readforced_rv==0) {\
321 fb_readforced_len-=fb_readforced_rv;\
322 fb_readforced_p+=fb_readforced_rv;\
336 #define GWEN_FASTBUFFER_WRITEBYTES(fb, var, p, len) {\
337 int fb_writebytes_bytes;\
338 int fb_writebytes_len;\
340 fb_writebytes_len=len;\
341 if (fb_writebytes_len==-1)\
342 fb_writebytes_len=strlen((const char*)p);\
344 if (fb->bufferWritePos>=fb->bufferSize) { \
345 int fb_writebytes_rv; \
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; \
353 fb->bufferWritePos=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; \
365 var=fb_writebytes_bytes;\
377 #define GWEN_FASTBUFFER_WRITEFORCED(fb, var, p, len) {\
378 int fb_writeforced_len;\
379 const uint8_t *fb_writeforced_p;\
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;\
386 while(fb_writeforced_len && var==0) {\
387 int fb_writeforced_rv;\
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;\
394 else if (fb_writeforced_rv==0) {\
399 fb_writeforced_len-=fb_writeforced_rv;\
400 fb_writeforced_p+=fb_writeforced_rv;\
407 #define GWEN_FASTBUFFER_WRITELINE(fb, var, p) {\
408 int fb_writeline_rv;\
409 int fb_writeline_len=strlen((const char*)p);\
411 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, p, fb_writeline_len);\
412 if (fb_writeline_rv<0)\
413 var=fb_writeline_rv;\
415 if (fb->flags & GWEN_FAST_BUFFER_FLAGS_DOSMODE) {\
416 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, "\r\n", 2);\
419 GWEN_FASTBUFFER_WRITEFORCED(fb, fb_writeline_rv, "\n", 1);\
421 if (fb_writeline_rv<0)\
422 var=fb_writeline_rv;\
437 #define GWEN_FASTBUFFER_COPYBYTES(fb1, fb2, var, len) { \
438 int fb_copybytes_bytes;\
441 if (fb1->bufferReadPos>=fb1->bufferWritePos) { \
442 int fb_copybytes_rv; \
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; \
450 fb1->bufferWritePos=fb_copybytes_rv; \
451 fb1->bufferReadPos=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;\
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; \
481 #define GWEN_FASTBUFFER_COPYFORCED(fb1, fb2, var, p, len) {\
482 int fb_copyforced_len;\
483 uint8_t *fb_copyforced_p;\
485 fb_copyforced_len=len;\
486 fb_copyforced_p=(uint8_t*)p;\
488 while(fb_copyforced_len && var==0) {\
489 int fb_copyforced_rv;\
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;\
496 else if (fb_copyforced_rv==0)\
499 fb_len-=fb_copyforced_rv;\
500 fb_p+=fb_copyforced_rv;\
GWENHYWFAR_API void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
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 uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
struct GWEN_SYNCIO GWEN_SYNCIO