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_SetFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
GWENHYWFAR_API int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf)
GWENHYWFAR_API GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
struct GWEN_SYNCIO GWEN_SYNCIO
GWENHYWFAR_API void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len)
GWENHYWFAR_API void GWEN_FastBuffer_SubFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetBytesWritten(const GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb)
GWENHYWFAR_API void GWEN_FastBuffer_AddFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)