30 #define DISABLE_DEBUGLOG
33 #include <gwenhywfar/misc.h>
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/text.h>
51 bf->realBufferSize=size+1;
52 bf->bufferSize=size+1;
53 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
61 bf->realBufferSize=size;
65 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
69 bf->hardLimit=GWEN_BUFFER_DEFAULT_HARDLIMIT;
70 bf->step=GWEN_BUFFER_DYNAMIC_STEP;
77 assert(bf->_refCount);
85 assert(bf->_refCount);
86 if (bf->_refCount==1) {
87 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
90 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO)
109 if (bf->realPtr && bf->realBufferSize) {
111 newbf->ptr=newbf->realPtr+(bf->ptr-bf->realPtr);
112 newbf->realBufferSize=bf->realBufferSize;
113 newbf->bufferSize=bf->bufferSize;
114 newbf->bytesUsed=bf->bytesUsed;
115 if (newbf->bytesUsed) {
118 toCopy=bf->bytesUsed+1;
119 if (toCopy>(newbf->bufferSize)) {
120 fprintf(stderr,
"Panic: Too many bytes in buffer");
123 memmove(newbf->ptr, bf->ptr, toCopy);
127 newbf->flags=bf->flags | GWEN_BUFFER_FLAGS_OWNED;
128 newbf->mode=bf->mode&GWEN_BUFFER_MODE_COPYMASK;
129 newbf->hardLimit=bf->hardLimit;
130 newbf->step=bf->step;
132 newbf->bookmarks[i]=bf->bookmarks[i];
141 if (!(bf->flags & GWEN_BUFFER_FLAGS_OWNED))
143 if (bf->realPtr!=bf->ptr)
146 bf->flags&=~GWEN_BUFFER_FLAGS_OWNED;
162 memmove(bf->ptr+res, bf->ptr, bf->bytesUsed);
210 return bf->hardLimit;
233 return bf->hardLimit;
234 return bf->bufferSize;
249 if (i>=bf->bufferSize) {
255 "Position %d outside buffer boundaries (%d bytes)",
268 return bf->bytesUsed;
284 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
301 reserved=bf->ptr-bf->realPtr;
304 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
306 nsize=(nsize+(bf->step-1));
307 nsize&=~(bf->step-1);
311 nsize+=bf->realBufferSize;
312 if (nsize>bf->hardLimit) {
314 "Size is beyond hard limit (%d>%d)",
315 nsize, bf->hardLimit);
322 bf->bufferSize, nsize);
324 if (bf->realPtr==
NULL) {
340 bf->ptr=bf->realPtr+reserved;
341 bf->realBufferSize=nsize;
342 bf->bufferSize+=noffs;
371 if (bf->bytesUsed+size>bf->bufferSize) {
374 bf->bytesUsed, size+1,
379 memmove(bf->ptr+bf->bytesUsed, buffer, size);
381 if (bf->pos==bf->bytesUsed)
385 bf->ptr[bf->bytesUsed]=0;
404 if (bf->bytesUsed+1+1 > bf->bufferSize) {
412 bf->ptr[bf->bytesUsed]=c;
413 if (bf->pos == bf->bytesUsed)
416 bf->ptr[++(bf->bytesUsed)]=0;
427 toread=bf->pos-bf->bytesUsed+1;
433 (uint8_t*) (bf->ptr+bf->bytesUsed),
448 "End of used area reached and no SYNCIO (%d bytes)",
463 "End of used area reached (%d bytes)", bf->pos);
473 if (bf->pos>=bf->bytesUsed) {
483 return (
unsigned char) (bf->ptr[bf->pos]);
491 if (bf->pos>=bf->bytesUsed) {
501 return (
unsigned char) (bf->ptr[bf->pos++]);
509 if (i+bf->pos>=bf->bufferSize) {
512 "Position %d outside buffer boundaries (%d bytes)\n"
513 "Incrementing anyway",
514 i+bf->pos, bf->bufferSize);
526 if (bf->pos<=bf->bufferSize) {
527 if (bf->pos>bf->bytesUsed) {
530 bf->bytesUsed=bf->pos;
533 bf->ptr[bf->bytesUsed]=0;
550 "Position %d outside buffer boundaries (%d bytes)",
551 bf->pos-i, bf->bufferSize);
583 return (bf->bufferSize-bf->bytesUsed);
591 if (bf->pos<bf->bytesUsed)
592 return bf->bytesUsed-bf->pos;
601 return bf->ptr+bf->pos;
608 if (bf->realPtr && bf->realBufferSize) {
609 memset(bf->realPtr, c, bf->realBufferSize);
618 return bf->bookmarks[idx];
627 bf->bookmarks[idx]=v;
635 for (k=0; k<insert; k++)
636 fprintf(stderr,
" ");
637 fprintf(stderr,
"Buffer:\n");
639 for (k=0; k<insert; k++)
640 fprintf(stderr,
" ");
641 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
643 for (k=0; k<insert; k++)
644 fprintf(stderr,
" ");
645 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
647 for (k=0; k<insert; k++)
648 fprintf(stderr,
" ");
649 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
651 for (k=0; k<insert; k++)
652 fprintf(stderr,
" ");
653 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
655 for (k=0; k<insert; k++)
656 fprintf(stderr,
" ");
657 fprintf(stderr,
"Bytes Reserved : %u\n",
658 (uint32_t)(bf->ptr-bf->realPtr));
660 for (k=0; k<insert; k++)
661 fprintf(stderr,
" ");
662 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
663 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
664 fprintf(stderr,
"OWNED ");
665 fprintf(stderr,
")\n");
667 for (k=0; k<insert; k++)
668 fprintf(stderr,
" ");
669 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
671 fprintf(stderr,
"DYNAMIC ");
673 fprintf(stderr,
"READONLY ");
675 fprintf(stderr,
"ABORT_ON_MEMFULL ");
676 fprintf(stderr,
")\n");
678 for (k=0; k<insert; k++)
679 fprintf(stderr,
" ");
680 fprintf(stderr,
"Bookmarks :");
682 fprintf(stderr,
" %d", bf->bookmarks[k]);
683 fprintf(stderr,
"\n");
685 if (bf->ptr && bf->bytesUsed) {
686 for (k=0; k<insert; k++)
687 fprintf(stderr,
" ");
688 fprintf(stderr,
"Data:\n");
724 if (bf->pos>=bf->bytesUsed) {
731 srcLeft=bf->bytesUsed - bf->pos;
738 memmove(pdst, bf->ptr + bf->pos, j);
772 if (bf->bookmarks[i]>=pos)
773 bf->bookmarks[i]+=offset;
796 if (bf->bytesUsed==0) {
805 bf->ptr[bf->bytesUsed]=0;
809 if ( (bf->ptr - bf->realPtr) >= (
int)size ) {
813 bf->bufferSize+=size;
825 if (bf->pos+size>bf->bufferSize) {
832 i=bf->bytesUsed-bf->pos;
835 memmove(p+size, p, i);
838 bf->ptr[bf->bytesUsed]=0;
860 if (bf->bytesUsed<size) {
867 bf->bufferSize-=size;
870 if (bf->bytesUsed+size<(bf->bytesUsed)) {
876 p=bf->ptr+bf->pos+size;
877 i=bf->bytesUsed-bf->pos-size;
878 memmove(bf->ptr+bf->pos, p, i);
883 bf->ptr[bf->bytesUsed]=0;
919 "Error replacing %d bytes with %d bytes (%d)",
926 memmove(bf->ptr+bf->pos, buffer, size);
953 memmove(bf->ptr+bf->pos, buffer, size);
1005 if (pos>=bf->bufferSize) {
1010 bf->bufferSize-=pos;
1012 if (bf->bytesUsed-pos<l) {
1019 if (bf->pos>bf->bytesUsed)
1020 bf->pos=bf->bytesUsed;
1022 bf->ptr[bf->bytesUsed]=0;
1030 const char *buffer){
1039 const char *buffer){
1052 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO) {
1057 bf->flags|=GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1059 bf->flags&=~GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1086 if (bf->bytesUsed+size>bf->bufferSize) {
1088 bf->bytesUsed, size+1,
1092 memset(bf->ptr+bf->bytesUsed, c, size);
1093 if (bf->pos==bf->bytesUsed)
1095 bf->bytesUsed+=size;
1097 bf->ptr[bf->bytesUsed]=0;
1123 memset(bf->ptr+bf->pos, c, size);