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) {
110 newbf->realPtr=(
char*)
GWEN_Memory_malloc((bf->realBufferSize)?(bf->realBufferSize+1):0);
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;
283 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
300 reserved=bf->ptr-bf->realPtr;
303 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
305 nsize=(nsize+(bf->step-1));
306 nsize&=~(bf->step-1);
310 nsize+=bf->realBufferSize;
311 if (nsize>bf->hardLimit) {
313 "Size is beyond hard limit (%d>%d)",
314 nsize, bf->hardLimit);
321 bf->bufferSize, nsize);
322 if (bf->realPtr==
NULL) {
338 bf->ptr=bf->realPtr+reserved;
339 bf->realBufferSize=nsize;
340 bf->bufferSize+=noffs;
369 memmove(bf->ptr+bf->bytesUsed, buffer, size);
370 if (bf->pos==bf->bytesUsed)
374 bf->ptr[bf->bytesUsed]=0;
393 if (bf->bytesUsed+1+1 > bf->bufferSize) {
401 bf->ptr[bf->bytesUsed]=c;
402 if (bf->pos == bf->bytesUsed)
405 bf->ptr[++(bf->bytesUsed)]=0;
416 toread=bf->pos-bf->bytesUsed+1;
422 (uint8_t*) (bf->ptr+bf->bytesUsed),
437 "End of used area reached and no SYNCIO (%d bytes)",
452 "End of used area reached (%d bytes)", bf->pos);
462 if (bf->pos>=bf->bytesUsed) {
472 return (
unsigned char) (bf->ptr[bf->pos]);
480 if (bf->pos>=bf->bytesUsed) {
490 return (
unsigned char) (bf->ptr[bf->pos++]);
498 if (i+bf->pos>=bf->bufferSize) {
501 "Position %d outside buffer boundaries (%d bytes)\n"
502 "Incrementing anyway",
503 i+bf->pos, bf->bufferSize);
515 if (bf->pos<=bf->bufferSize) {
516 if (bf->pos>bf->bytesUsed) {
519 bf->bytesUsed=bf->pos;
522 bf->ptr[bf->bytesUsed]=0;
539 "Position %d outside buffer boundaries (%d bytes)",
540 bf->pos-i, bf->bufferSize);
572 return (bf->bufferSize-(bf->bytesUsed+1));
580 if (bf->pos<bf->bytesUsed)
581 return bf->bytesUsed-bf->pos;
590 return bf->ptr+bf->pos;
597 if (bf->realPtr && bf->realBufferSize) {
598 memset(bf->realPtr, c, bf->realBufferSize);
607 return bf->bookmarks[idx];
616 bf->bookmarks[idx]=v;
624 for (k=0; k<insert; k++)
625 fprintf(stderr,
" ");
626 fprintf(stderr,
"Buffer:\n");
628 for (k=0; k<insert; k++)
629 fprintf(stderr,
" ");
630 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
632 for (k=0; k<insert; k++)
633 fprintf(stderr,
" ");
634 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
636 for (k=0; k<insert; k++)
637 fprintf(stderr,
" ");
638 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
640 for (k=0; k<insert; k++)
641 fprintf(stderr,
" ");
642 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
644 for (k=0; k<insert; k++)
645 fprintf(stderr,
" ");
646 fprintf(stderr,
"Bytes Reserved : %u\n",
647 (uint32_t)(bf->ptr-bf->realPtr));
649 for (k=0; k<insert; k++)
650 fprintf(stderr,
" ");
651 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
652 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
653 fprintf(stderr,
"OWNED ");
654 fprintf(stderr,
")\n");
656 for (k=0; k<insert; k++)
657 fprintf(stderr,
" ");
658 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
660 fprintf(stderr,
"DYNAMIC ");
662 fprintf(stderr,
"READONLY ");
664 fprintf(stderr,
"ABORT_ON_MEMFULL ");
665 fprintf(stderr,
")\n");
667 for (k=0; k<insert; k++)
668 fprintf(stderr,
" ");
669 fprintf(stderr,
"Bookmarks :");
671 fprintf(stderr,
" %d", bf->bookmarks[k]);
672 fprintf(stderr,
"\n");
674 if (bf->ptr && bf->bytesUsed) {
675 for (k=0; k<insert; k++)
676 fprintf(stderr,
" ");
677 fprintf(stderr,
"Data:\n");
713 if (bf->pos>=bf->bytesUsed) {
720 srcLeft=bf->bytesUsed - bf->pos;
727 memmove(pdst, bf->ptr + bf->pos, j);
761 if (bf->bookmarks[i]>=pos)
762 bf->bookmarks[i]+=offset;
785 if (bf->bytesUsed==0) {
794 bf->ptr[bf->bytesUsed]=0;
798 if ( (bf->ptr - bf->realPtr) >= (
int)size ) {
802 bf->bufferSize+=size;
814 assert(bf->pos<=bf->bytesUsed);
816 i=bf->bytesUsed-bf->pos;
819 memmove(p+size, p, i);
822 bf->ptr[bf->bytesUsed]=0;
843 if (bf->bytesUsed<size+bf->pos) {
852 bf->bufferSize-=size;
856 p=bf->ptr+bf->pos+size;
857 i=bf->bytesUsed-bf->pos-size;
858 memmove(bf->ptr+bf->pos, p, i);
863 bf->ptr[bf->bytesUsed]=0;
899 "Error replacing %d bytes with %d bytes (%d)",
906 memmove(bf->ptr+bf->pos, buffer, size);
933 memmove(bf->ptr+bf->pos, buffer, size);
986 if (pos>=bf->bufferSize) {
990 if (bf->bytesUsed-pos<l) {
1003 if (bf->pos>bf->bytesUsed)
1004 bf->pos=bf->bytesUsed;
1006 bf->ptr[bf->bytesUsed]=0;
1015 const char *buffer) {
1024 const char *buffer) {
1037 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO) {
1042 bf->flags|=GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1044 bf->flags&=~GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1070 memset(bf->ptr+bf->bytesUsed, c, size);
1071 if (bf->pos==bf->bytesUsed)
1073 bf->bytesUsed+=size;
1075 bf->ptr[bf->bytesUsed]=0;
1101 memset(bf->ptr+bf->pos, c, size);
uint32_t GWEN_Buffer_GetBytesLeft(GWEN_BUFFER *bf)
int GWEN_Buffer_FillLeftWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Buffer_InsertString(GWEN_BUFFER *bf, const char *buffer)
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
#define GWEN_ERROR_INVALID
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
void GWEN_Buffer_SetHardLimit(GWEN_BUFFER *bf, uint32_t l)
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)
void GWEN_Buffer_SetStep(GWEN_BUFFER *bf, uint32_t step)
#define GWEN_FREE_OBJECT(varname)
void GWEN_Memory_dealloc(void *p)
#define DBG_VERBOUS(dbg_logger, format, args...)
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
int GWEN_Buffer_FillWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
#define GWEN_ERROR_BUFFER_OVERFLOW
int GWEN_Buffer_RemoveRoom(GWEN_BUFFER *bf, uint32_t size)
void GWEN_Buffer_Dump(GWEN_BUFFER *bf, unsigned int insert)
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWENHYWFAR_CB GWEN_Buffer_CacheFn_Free(void *ptr)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
void GWEN_Buffer_SetBookmark(GWEN_BUFFER *bf, unsigned int idx, uint32_t v)
void GWEN_Buffer_AdjustBookmarks(GWEN_BUFFER *bf, uint32_t pos, int offset)
int GWEN_Buffer_PeekByte(GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetBookmark(const GWEN_BUFFER *bf, unsigned int idx)
void GWEN_Buffer_Attach(GWEN_BUFFER *bf)
#define GWEN_NEW_OBJECT(typ, varname)
struct GWEN_SYNCIO GWEN_SYNCIO
uint32_t GWEN_Buffer_GetSize(const GWEN_BUFFER *bf)
int GWEN_Buffer__FillBuffer_SyncIo(GWEN_BUFFER *bf)
void GWEN_Buffer_SubMode(GWEN_BUFFER *bf, uint32_t mode)
void GWEN_Buffer_SetSourceSyncIo(GWEN_BUFFER *bf, GWEN_SYNCIO *sio, int take)
#define DBG_DEBUG(dbg_logger, format, args...)
int GWEN_Buffer__FillBuffer(GWEN_BUFFER *bf)
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
int GWEN_Buffer_InsertByte(GWEN_BUFFER *bf, char c)
int GWENHYWFAR_CB GWEN_Buffer_CacheFn_Attach(void *ptr)
int GWEN_SyncIo_ReadForced(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
void * GWEN_Memory_malloc(size_t wsize)
#define GWEN_ERROR_GENERIC
#define GWEN_BUFFER_MODE_DYNAMIC
void GWEN_Buffer_AddMode(GWEN_BUFFER *bf, uint32_t mode)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
#define GWEN_ERROR_PERMISSIONS
int GWEN_Buffer_Relinquish(GWEN_BUFFER *bf)
GWEN_BUFFER * GWEN_Buffer_dup(GWEN_BUFFER *bf)
int GWEN_Buffer_DecrementPos(GWEN_BUFFER *bf, uint32_t i)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
void GWEN_Buffer_SetMode(GWEN_BUFFER *bf, uint32_t mode)
#define DBG_ERROR(dbg_logger, format, args...)
uint32_t GWEN_Buffer_GetStep(GWEN_BUFFER *bf)
#define GWEN_BUFFER_MODE_USE_SYNCIO
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
#define GWEN_BUFFER_MODE_ABORT_ON_MEMFULL
#define GWEN_BUFFER_MAX_BOOKMARKS
int GWEN_Buffer_InsertBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
#define DBG_INFO(dbg_logger, format, args...)
uint32_t GWEN_Buffer_GetMode(GWEN_BUFFER *bf)
int GWEN_Buffer_ReadByte(GWEN_BUFFER *bf)
#define GWEN_BUFFER_MODE_READONLY
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
void * GWEN_Memory_realloc(void *oldp, size_t nsize)
int GWEN_Buffer_InsertRoom(GWEN_BUFFER *bf, uint32_t size)
int GWEN_Buffer_InsertBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
uint32_t GWEN_Buffer_GetHardLimit(GWEN_BUFFER *bf)
int GWEN_Buffer_ReplaceBytes(GWEN_BUFFER *bf, uint32_t rsize, const char *buffer, uint32_t size)
int GWEN_Buffer_ReadBytes(GWEN_BUFFER *bf, char *buffer, uint32_t *size)
#define GWEN_ERROR_MEMORY_FULL
#define GWEN_BUFFER_MODE_DEFAULT
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
void GWEN_Buffer_OverwriteContent(GWEN_BUFFER *bf, int c)