30 #define DISABLE_DEBUGLOG 33 #include <gwenhywfar/misc.h> 34 #include <gwenhywfar/debug.h> 35 #include <gwenhywfar/text.h> 52 bf->realBufferSize=size+1;
53 bf->bufferSize=size+1;
54 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
62 bf->realBufferSize=size;
66 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
70 bf->hardLimit=GWEN_BUFFER_DEFAULT_HARDLIMIT;
71 bf->step=GWEN_BUFFER_DYNAMIC_STEP;
79 assert(bf->_refCount);
88 assert(bf->_refCount);
89 if (bf->_refCount==1) {
90 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
93 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO)
113 if (bf->realPtr && bf->realBufferSize) {
114 newbf->realPtr=(
char *)
GWEN_Memory_malloc((bf->realBufferSize)?(bf->realBufferSize+1):0);
115 newbf->ptr=newbf->realPtr+(bf->ptr-bf->realPtr);
116 newbf->realBufferSize=bf->realBufferSize;
117 newbf->bufferSize=bf->bufferSize;
118 newbf->bytesUsed=bf->bytesUsed;
119 if (newbf->bytesUsed) {
122 toCopy=bf->bytesUsed+1;
123 if (toCopy>(newbf->bufferSize)) {
124 fprintf(stderr,
"Panic: Too many bytes in buffer");
127 memmove(newbf->ptr, bf->ptr, toCopy);
131 newbf->flags=bf->flags | GWEN_BUFFER_FLAGS_OWNED;
132 newbf->mode=bf->mode&GWEN_BUFFER_MODE_COPYMASK;
133 newbf->hardLimit=bf->hardLimit;
134 newbf->step=bf->step;
136 newbf->bookmarks[i]=bf->bookmarks[i];
146 if (!(bf->flags & GWEN_BUFFER_FLAGS_OWNED))
148 if (bf->realPtr!=bf->ptr)
151 bf->flags&=~GWEN_BUFFER_FLAGS_OWNED;
168 memmove(bf->ptr+res, bf->ptr, bf->bytesUsed);
221 return bf->hardLimit;
247 return bf->hardLimit;
248 return bf->bufferSize;
265 if (i>=bf->bufferSize) {
271 "Position %d outside buffer boundaries (%d bytes)",
272 i, (
int)(bf->bufferSize));
285 return bf->bytesUsed;
301 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
318 reserved=bf->ptr-bf->realPtr;
321 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
323 nsize=(nsize+(bf->step-1));
324 nsize&=~(bf->step-1);
328 nsize+=bf->realBufferSize;
329 if (nsize>bf->hardLimit) {
331 "Size is beyond hard limit (%d>%d)",
332 (
int) nsize, (
int)(bf->hardLimit));
339 bf->bufferSize, nsize);
340 if (bf->realPtr==
NULL) {
356 bf->ptr=bf->realPtr+reserved;
357 bf->realBufferSize=nsize;
358 bf->bufferSize+=noffs;
388 memmove(bf->ptr+bf->bytesUsed, buffer, size);
389 if (bf->pos==bf->bytesUsed)
393 bf->ptr[bf->bytesUsed]=0;
413 if (bf->bytesUsed+1+1 > bf->bufferSize) {
421 bf->ptr[bf->bytesUsed]=c;
422 if (bf->pos == bf->bytesUsed)
425 bf->ptr[++(bf->bytesUsed)]=0;
437 toread=bf->pos-bf->bytesUsed+1;
443 (uint8_t *)(bf->ptr+bf->bytesUsed),
458 "End of used area reached and no SYNCIO (%d bytes)",
474 "End of used area reached (%d bytes)", bf->pos);
485 if (bf->pos>=bf->bytesUsed) {
495 return (
unsigned char)(bf->ptr[bf->pos]);
504 if (bf->pos>=bf->bytesUsed) {
514 return (
unsigned char)(bf->ptr[bf->pos++]);
523 if (i+bf->pos>=bf->bufferSize) {
526 "Position %d outside buffer boundaries (%d bytes)\n" 527 "Incrementing anyway",
528 i+bf->pos, bf->bufferSize);
541 if (bf->pos<=bf->bufferSize) {
542 if (bf->pos>bf->bytesUsed) {
545 bf->bytesUsed=bf->pos;
548 bf->ptr[bf->bytesUsed]=0;
553 (
int)(bf->bufferSize));
566 "Position %d outside buffer boundaries (%d bytes)",
567 bf->pos-i, bf->bufferSize);
601 return (bf->bufferSize-(bf->bytesUsed+1));
610 if (bf->pos<bf->bytesUsed)
611 return bf->bytesUsed-bf->pos;
621 return bf->ptr+bf->pos;
629 if (bf->realPtr && bf->realBufferSize) {
630 memset(bf->realPtr, c, bf->realBufferSize);
640 return bf->bookmarks[idx];
650 bf->bookmarks[idx]=v;
659 for (k=0; k<insert; k++)
660 fprintf(stderr,
" ");
661 fprintf(stderr,
"Buffer:\n");
663 for (k=0; k<insert; k++)
664 fprintf(stderr,
" ");
665 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
667 for (k=0; k<insert; k++)
668 fprintf(stderr,
" ");
669 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
671 for (k=0; k<insert; k++)
672 fprintf(stderr,
" ");
673 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
675 for (k=0; k<insert; k++)
676 fprintf(stderr,
" ");
677 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
679 for (k=0; k<insert; k++)
680 fprintf(stderr,
" ");
681 fprintf(stderr,
"Bytes Reserved : %u\n",
682 (uint32_t)(bf->ptr-bf->realPtr));
684 for (k=0; k<insert; k++)
685 fprintf(stderr,
" ");
686 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
687 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
688 fprintf(stderr,
"OWNED ");
689 fprintf(stderr,
")\n");
691 for (k=0; k<insert; k++)
692 fprintf(stderr,
" ");
693 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
695 fprintf(stderr,
"DYNAMIC ");
697 fprintf(stderr,
"READONLY ");
699 fprintf(stderr,
"ABORT_ON_MEMFULL ");
700 fprintf(stderr,
")\n");
702 for (k=0; k<insert; k++)
703 fprintf(stderr,
" ");
704 fprintf(stderr,
"Bookmarks :");
706 fprintf(stderr,
" %d", bf->bookmarks[k]);
707 fprintf(stderr,
"\n");
709 if (bf->ptr && bf->bytesUsed) {
710 for (k=0; k<insert; k++)
711 fprintf(stderr,
" ");
712 fprintf(stderr,
"Data:\n");
751 if (bf->pos>=bf->bytesUsed) {
758 srcLeft=bf->bytesUsed - bf->pos;
765 memmove(pdst, bf->ptr + bf->pos, j);
802 if (bf->bookmarks[i]>=pos)
803 bf->bookmarks[i]+=offset;
827 if (bf->bytesUsed==0) {
836 bf->ptr[bf->bytesUsed]=0;
840 if ((bf->ptr - bf->realPtr) >= (
int)size) {
844 bf->bufferSize+=size;
856 assert(bf->pos<=bf->bytesUsed);
858 i=bf->bytesUsed-bf->pos;
861 memmove(p+size, p, i);
864 bf->ptr[bf->bytesUsed]=0;
886 if (bf->bytesUsed<size+bf->pos) {
895 bf->bufferSize-=size;
899 p=bf->ptr+bf->pos+size;
900 i=bf->bytesUsed-bf->pos-size;
901 memmove(bf->ptr+bf->pos, p, i);
906 bf->ptr[bf->bytesUsed]=0;
943 "Error replacing %d bytes with %d bytes (%d)",
950 memmove(bf->ptr+bf->pos, buffer, size);
978 memmove(bf->ptr+bf->pos, buffer, size);
1034 if (pos>=bf->bufferSize) {
1038 if (bf->bytesUsed-pos<l) {
1043 bf->bufferSize-=pos;
1051 if (bf->pos>bf->bytesUsed)
1052 bf->pos=bf->bytesUsed;
1054 bf->ptr[bf->bytesUsed]=0;
1088 if (bf->flags & GWEN_BUFFER_FLAGS_OWN_SYNCIO) {
1093 bf->flags|=GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1095 bf->flags&=~GWEN_BUFFER_FLAGS_OWN_SYNCIO;
1122 memset(bf->ptr+bf->bytesUsed, c, size);
1123 if (bf->pos==bf->bytesUsed)
1125 bf->bytesUsed+=size;
1127 bf->ptr[bf->bytesUsed]=0;
1154 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)