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)
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];
142 if (!(bf->flags & GWEN_BUFFER_FLAGS_OWNED))
144 if (bf->realPtr!=bf->ptr)
147 bf->flags&=~GWEN_BUFFER_FLAGS_OWNED;
164 memmove(bf->ptr+res, bf->ptr, bf->bytesUsed);
217 return bf->hardLimit;
243 return bf->hardLimit;
244 return bf->bufferSize;
261 if (i>=bf->bufferSize) {
263 "Position %d outside buffer boundaries (%d bytes)",
264 i, (
int)(bf->bufferSize));
276 return bf->bytesUsed;
292 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
309 reserved=bf->ptr-bf->realPtr;
312 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
314 nsize=(nsize+(bf->step-1));
315 nsize&=~(bf->step-1);
319 nsize+=bf->realBufferSize;
320 if (nsize>bf->hardLimit) {
322 "Size is beyond hard limit (%d>%d)",
323 (
int) nsize, (
int)(bf->hardLimit));
330 bf->bufferSize, nsize);
331 if (bf->realPtr==
NULL) {
346 bf->realPtr=(
char *)p;
347 bf->ptr=bf->realPtr+reserved;
348 bf->realBufferSize=nsize;
349 bf->bufferSize+=noffs;
379 memmove(bf->ptr+bf->bytesUsed, buffer, size);
380 if (bf->pos==bf->bytesUsed)
384 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;
426 if (bf->pos>=bf->bytesUsed) {
430 return (
unsigned char)(bf->ptr[bf->pos]);
439 if (bf->pos>=bf->bytesUsed) {
443 return (
unsigned char)(bf->ptr[bf->pos++]);
452 if (i+bf->pos>=bf->bufferSize) {
454 "Position %d outside buffer boundaries (%d bytes)\n" 455 "Incrementing anyway",
456 i+bf->pos, bf->bufferSize);
468 if (bf->pos<=bf->bufferSize) {
469 if (bf->pos>bf->bytesUsed) {
472 bf->bytesUsed=bf->pos;
475 bf->ptr[bf->bytesUsed]=0;
480 (
int)(bf->bufferSize));
493 "Position %d outside buffer boundaries (%d bytes)",
494 bf->pos-i, bf->bufferSize);
528 return (bf->bufferSize-(bf->bytesUsed+1));
537 if (bf->pos<bf->bytesUsed)
538 return bf->bytesUsed-bf->pos;
548 return bf->ptr+bf->pos;
556 if (bf->realPtr && bf->realBufferSize) {
557 memset(bf->realPtr, c, bf->realBufferSize);
567 return bf->bookmarks[idx];
577 bf->bookmarks[idx]=v;
586 for (k=0; k<insert; k++)
587 fprintf(stderr,
" ");
588 fprintf(stderr,
"Buffer:\n");
590 for (k=0; k<insert; k++)
591 fprintf(stderr,
" ");
592 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
594 for (k=0; k<insert; k++)
595 fprintf(stderr,
" ");
596 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
598 for (k=0; k<insert; k++)
599 fprintf(stderr,
" ");
600 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
602 for (k=0; k<insert; k++)
603 fprintf(stderr,
" ");
604 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
606 for (k=0; k<insert; k++)
607 fprintf(stderr,
" ");
608 fprintf(stderr,
"Bytes Reserved : %u\n",
609 (uint32_t)(bf->ptr-bf->realPtr));
611 for (k=0; k<insert; k++)
612 fprintf(stderr,
" ");
613 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
614 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
615 fprintf(stderr,
"OWNED ");
616 fprintf(stderr,
")\n");
618 for (k=0; k<insert; k++)
619 fprintf(stderr,
" ");
620 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
622 fprintf(stderr,
"DYNAMIC ");
624 fprintf(stderr,
"READONLY ");
626 fprintf(stderr,
"ABORT_ON_MEMFULL ");
627 fprintf(stderr,
")\n");
629 for (k=0; k<insert; k++)
630 fprintf(stderr,
" ");
631 fprintf(stderr,
"Bookmarks :");
633 fprintf(stderr,
" %d", bf->bookmarks[k]);
634 fprintf(stderr,
"\n");
636 if (bf->ptr && bf->bytesUsed) {
637 for (k=0; k<insert; k++)
638 fprintf(stderr,
" ");
639 fprintf(stderr,
"Data:\n");
678 if (bf->pos>=bf->bytesUsed)
681 srcLeft=bf->bytesUsed - bf->pos;
688 memmove(pdst, bf->ptr + bf->pos, j);
725 if (bf->bookmarks[i]>=pos)
726 bf->bookmarks[i]+=offset;
750 if (bf->bytesUsed==0) {
759 bf->ptr[bf->bytesUsed]=0;
763 if ((bf->ptr - bf->realPtr) >= (
int)size) {
767 bf->bufferSize+=size;
779 assert(bf->pos<=bf->bytesUsed);
781 i=bf->bytesUsed-bf->pos;
784 memmove(p+size, p, i);
787 bf->ptr[bf->bytesUsed]=0;
809 if (bf->bytesUsed<size+bf->pos) {
818 bf->bufferSize-=size;
822 p=bf->ptr+bf->pos+size;
823 i=bf->bytesUsed-bf->pos-size;
824 memmove(bf->ptr+bf->pos, p, i);
829 bf->ptr[bf->bytesUsed]=0;
866 "Error replacing %d bytes with %d bytes (%d)",
873 memmove(bf->ptr+bf->pos, buffer, size);
901 memmove(bf->ptr+bf->pos, buffer, size);
957 if (pos>=bf->bufferSize) {
961 if (bf->bytesUsed-pos<l) {
974 if (bf->pos>bf->bytesUsed)
975 bf->pos=bf->bytesUsed;
977 bf->ptr[bf->bytesUsed]=0;
1026 memset(bf->ptr+bf->bytesUsed, c, size);
1027 if (bf->pos==bf->bytesUsed)
1029 bf->bytesUsed+=size;
1031 bf->ptr[bf->bytesUsed]=0;
1058 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)
uint32_t GWEN_Buffer_GetSize(const GWEN_BUFFER *bf)
void GWEN_Buffer_SubMode(GWEN_BUFFER *bf, uint32_t mode)
#define DBG_DEBUG(dbg_logger, format, args...)
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)
void * GWEN_Memory_malloc(size_t wsize)
#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.
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)
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)