30 #define DISABLE_DEBUGLOG
33 #include <gwenhywfar/misc.h>
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/text.h>
50 bf->realBufferSize=size+1;
51 bf->bufferSize=size+1;
52 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
60 bf->realBufferSize=size;
64 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
68 bf->hardLimit=GWEN_BUFFER_DEFAULT_HARDLIMIT;
69 bf->step=GWEN_BUFFER_DYNAMIC_STEP;
77 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
80 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO)
94 if (bf->realPtr && bf->realBufferSize) {
96 newbf->ptr=newbf->realPtr+(bf->ptr-bf->realPtr);
97 newbf->realBufferSize=bf->realBufferSize;
98 newbf->bufferSize=bf->bufferSize;
99 newbf->bytesUsed=bf->bytesUsed;
100 if (newbf->bytesUsed) {
103 toCopy=bf->bytesUsed+1;
104 if (toCopy>(newbf->bufferSize)) {
105 fprintf(stderr,
"Panic: Too many bytes in buffer");
108 memmove(newbf->ptr, bf->ptr, toCopy);
112 newbf->flags=bf->flags | GWEN_BUFFER_FLAGS_OWNED;
113 newbf->mode=bf->mode&GWEN_BUFFER_MODE_COPYMASK;
114 newbf->hardLimit=bf->hardLimit;
115 newbf->step=bf->step;
117 newbf->bookmarks[i]=bf->bookmarks[i];
126 if (!(bf->flags & GWEN_BUFFER_FLAGS_OWNED))
128 if (bf->realPtr!=bf->ptr)
131 bf->flags&=~GWEN_BUFFER_FLAGS_OWNED;
147 memmove(bf->ptr+res, bf->ptr, bf->bytesUsed);
195 return bf->hardLimit;
218 return bf->hardLimit;
219 return bf->bufferSize;
234 if (i>=bf->bufferSize) {
240 "Position %d outside buffer boundaries (%d bytes)",
253 return bf->bytesUsed;
269 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
286 reserved=bf->ptr-bf->realPtr;
289 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
291 nsize=(nsize+(bf->step-1));
292 nsize&=~(bf->step-1);
296 nsize+=bf->realBufferSize;
297 if (nsize>bf->hardLimit) {
299 "Size is beyond hard limit (%d>%d)",
300 nsize, bf->hardLimit);
307 bf->bufferSize, nsize);
309 if (bf->realPtr==
NULL) {
325 bf->ptr=bf->realPtr+reserved;
326 bf->realBufferSize=nsize;
327 bf->bufferSize+=noffs;
356 if (bf->bytesUsed+size>bf->bufferSize) {
359 bf->bytesUsed, size+1,
364 memmove(bf->ptr+bf->bytesUsed, buffer, size);
366 if (bf->pos==bf->bytesUsed)
370 bf->ptr[bf->bytesUsed]=0;
389 if (bf->bytesUsed+1+1 > bf->bufferSize) {
397 bf->ptr[bf->bytesUsed]=c;
398 if (bf->pos == bf->bytesUsed)
401 bf->ptr[++(bf->bytesUsed)]=0;
412 toread=bf->pos-bf->bytesUsed+1;
418 (uint8_t*) (bf->ptr+bf->bytesUsed),
433 "End of used area reached and no SYNCIO (%d bytes)",
448 "End of used area reached (%d bytes)", bf->pos);
458 if (bf->pos>=bf->bytesUsed) {
468 return (
unsigned char) (bf->ptr[bf->pos]);
476 if (bf->pos>=bf->bytesUsed) {
486 return (
unsigned char) (bf->ptr[bf->pos++]);
494 if (i+bf->pos>=bf->bufferSize) {
497 "Position %d outside buffer boundaries (%d bytes)\n"
498 "Incrementing anyway",
499 i+bf->pos, bf->bufferSize);
511 if (bf->pos<=bf->bufferSize) {
512 if (bf->pos>bf->bytesUsed) {
515 bf->bytesUsed=bf->pos;
518 bf->ptr[bf->bytesUsed]=0;
535 "Position %d outside buffer boundaries (%d bytes)",
536 bf->pos-i, bf->bufferSize);
568 return (bf->bufferSize-bf->bytesUsed);
576 if (bf->pos<bf->bytesUsed)
577 return bf->bytesUsed-bf->pos;
586 return bf->ptr+bf->pos;
594 return bf->bookmarks[idx];
603 bf->bookmarks[idx]=v;
611 for (k=0; k<insert; k++)
612 fprintf(stderr,
" ");
613 fprintf(stderr,
"Buffer:\n");
615 for (k=0; k<insert; k++)
616 fprintf(stderr,
" ");
617 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
619 for (k=0; k<insert; k++)
620 fprintf(stderr,
" ");
621 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
623 for (k=0; k<insert; k++)
624 fprintf(stderr,
" ");
625 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
627 for (k=0; k<insert; k++)
628 fprintf(stderr,
" ");
629 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
631 for (k=0; k<insert; k++)
632 fprintf(stderr,
" ");
633 fprintf(stderr,
"Bytes Reserved : %u\n",
634 (uint32_t)(bf->ptr-bf->realPtr));
636 for (k=0; k<insert; k++)
637 fprintf(stderr,
" ");
638 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
639 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
640 fprintf(stderr,
"OWNED ");
641 fprintf(stderr,
")\n");
643 for (k=0; k<insert; k++)
644 fprintf(stderr,
" ");
645 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
647 fprintf(stderr,
"DYNAMIC ");
649 fprintf(stderr,
"READONLY ");
651 fprintf(stderr,
"ABORT_ON_MEMFULL ");
652 fprintf(stderr,
")\n");
654 for (k=0; k<insert; k++)
655 fprintf(stderr,
" ");
656 fprintf(stderr,
"Bookmarks :");
658 fprintf(stderr,
" %d", bf->bookmarks[k]);
659 fprintf(stderr,
"\n");
661 if (bf->ptr && bf->bytesUsed) {
662 for (k=0; k<insert; k++)
663 fprintf(stderr,
" ");
664 fprintf(stderr,
"Data:\n");
700 if (bf->pos>=bf->bytesUsed) {
707 srcLeft=bf->bytesUsed - bf->pos;
714 memmove(pdst, bf->ptr + bf->pos, j);
748 if (bf->bookmarks[i]>=pos)
749 bf->bookmarks[i]+=offset;
772 if (bf->bytesUsed==0) {
781 bf->ptr[bf->bytesUsed]=0;
785 if ( (bf->ptr - bf->realPtr) >= (
int)size ) {
789 bf->bufferSize+=size;
801 if (bf->pos+size>bf->bufferSize) {
808 i=bf->bytesUsed-bf->pos;
811 memmove(p+size, p, i);
814 bf->ptr[bf->bytesUsed]=0;
836 if (bf->bytesUsed<size) {
843 bf->bufferSize-=size;
846 if (bf->bytesUsed+size<(bf->bytesUsed)) {
852 p=bf->ptr+bf->pos+size;
853 i=bf->bytesUsed-bf->pos-size;
854 memmove(bf->ptr+bf->pos, p, i);
859 bf->ptr[bf->bytesUsed]=0;
895 "Error replacing %d bytes with %d bytes (%d)",
902 memmove(bf->ptr+bf->pos, buffer, size);
929 memmove(bf->ptr+bf->pos, buffer, size);
981 if (pos>=bf->bufferSize) {
988 if (bf->bytesUsed-pos<l) {
995 if (bf->pos>bf->bytesUsed)
996 bf->pos=bf->bytesUsed;
998 bf->ptr[bf->bytesUsed]=0;
1006 const char *buffer){
1015 const char *buffer){
1028 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO) {
1033 bf->flags|=GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1035 bf->flags&=~GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1062 if (bf->bytesUsed+size>bf->bufferSize) {
1064 bf->bytesUsed, size+1,
1068 memset(bf->ptr+bf->bytesUsed, c, size);
1069 if (bf->pos==bf->bytesUsed)
1071 bf->bytesUsed+=size;
1073 bf->ptr[bf->bytesUsed]=0;
1099 memset(bf->ptr+bf->pos, c, size);