30#define DISABLE_DEBUGLOG
33#include <gwenhywfar/misc.h>
34#include <gwenhywfar/debug.h>
35#include <gwenhywfar/text.h>
56 bf->realBufferSize=size+1;
57 bf->bufferSize=size+1;
58 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
66 bf->realBufferSize=size;
70 bf->flags=GWEN_BUFFER_FLAGS_OWNED;
74 bf->hardLimit=GWEN_BUFFER_DEFAULT_HARDLIMIT;
75 bf->step=GWEN_BUFFER_DYNAMIC_STEP;
83 assert(bf->_refCount);
92 assert(bf->_refCount);
93 if (bf->_refCount==1) {
94 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
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) {
267 "Position %d outside buffer boundaries (%d bytes)",
268 i, (
int)(bf->bufferSize));
280 return bf->bytesUsed;
296 if (bf->bytesUsed+(size+1) > bf->bufferSize) {
313 reserved=bf->ptr-bf->realPtr;
316 nsize=bf->bytesUsed+(size+1)-bf->bufferSize;
318 nsize=(nsize+(bf->step-1));
319 nsize&=~(bf->step-1);
323 nsize+=bf->realBufferSize;
324 if (nsize>bf->hardLimit) {
326 "Size is beyond hard limit (%d>%d)",
327 (
int) nsize, (
int)(bf->hardLimit));
334 if (bf->realPtr==
NULL) {
349 bf->realPtr=(
char *)p;
350 bf->ptr=bf->realPtr+reserved;
351 bf->realBufferSize=nsize;
352 bf->bufferSize+=noffs;
382 memmove(bf->ptr+bf->bytesUsed, buffer, size);
383 if (bf->pos==bf->bytesUsed)
387 bf->ptr[bf->bytesUsed]=0;
407 if (bf->bytesUsed+1+1 > bf->bufferSize) {
415 bf->ptr[bf->bytesUsed]=c;
416 if (bf->pos == bf->bytesUsed)
419 bf->ptr[++(bf->bytesUsed)]=0;
429 if (bf->pos>=bf->bytesUsed) {
433 return (
unsigned char)(bf->ptr[bf->pos]);
442 if (bf->pos>=bf->bytesUsed) {
446 return (
unsigned char)(bf->ptr[bf->pos++]);
455 if (i+bf->pos>=bf->bufferSize) {
457 "Position %d outside buffer boundaries (%d bytes)\n"
458 "Incrementing anyway",
459 i+bf->pos, bf->bufferSize);
471 if (bf->pos<=bf->bufferSize) {
472 if (bf->pos>bf->bytesUsed) {
475 bf->bytesUsed=bf->pos;
478 bf->ptr[bf->bytesUsed]=0;
483 (
int)(bf->bufferSize));
496 "Position %d outside buffer boundaries (%d bytes)",
497 bf->pos-i, bf->bufferSize);
531 return (bf->bufferSize-(bf->bytesUsed+1));
540 if (bf->pos<bf->bytesUsed)
541 return bf->bytesUsed-bf->pos;
551 return bf->ptr+bf->pos;
559 if (bf->realPtr && bf->realBufferSize) {
560 memset(bf->realPtr, c, bf->realBufferSize);
570 return bf->bookmarks[idx];
580 bf->bookmarks[idx]=v;
589 for (k=0; k<insert; k++)
590 fprintf(stderr,
" ");
591 fprintf(stderr,
"Buffer:\n");
593 for (k=0; k<insert; k++)
594 fprintf(stderr,
" ");
595 fprintf(stderr,
"Pos : %d (%04x)\n", bf->pos, bf->pos);
597 for (k=0; k<insert; k++)
598 fprintf(stderr,
" ");
599 fprintf(stderr,
"Buffer Size : %d\n", bf->bufferSize);
601 for (k=0; k<insert; k++)
602 fprintf(stderr,
" ");
603 fprintf(stderr,
"Real Buffer Size : %d\n", bf->realBufferSize);
605 for (k=0; k<insert; k++)
606 fprintf(stderr,
" ");
607 fprintf(stderr,
"Hard limit : %d\n", bf->hardLimit);
609 for (k=0; k<insert; k++)
610 fprintf(stderr,
" ");
611 fprintf(stderr,
"Bytes Used : %d\n", bf->bytesUsed);
613 for (k=0; k<insert; k++)
614 fprintf(stderr,
" ");
615 fprintf(stderr,
"Bytes Reserved : %u\n",
616 (uint32_t)(bf->ptr-bf->realPtr));
618 for (k=0; k<insert; k++)
619 fprintf(stderr,
" ");
620 fprintf(stderr,
"Flags : %08x ( ", bf->flags);
621 if (bf->flags & GWEN_BUFFER_FLAGS_OWNED)
622 fprintf(stderr,
"OWNED ");
623 fprintf(stderr,
")\n");
625 for (k=0; k<insert; k++)
626 fprintf(stderr,
" ");
627 fprintf(stderr,
"Mode : %08x ( ", bf->mode);
629 fprintf(stderr,
"DYNAMIC ");
631 fprintf(stderr,
"READONLY ");
633 fprintf(stderr,
"ABORT_ON_MEMFULL ");
634 fprintf(stderr,
")\n");
636 for (k=0; k<insert; k++)
637 fprintf(stderr,
" ");
638 fprintf(stderr,
"Bookmarks :");
640 fprintf(stderr,
" %d", bf->bookmarks[k]);
641 fprintf(stderr,
"\n");
643 if (bf->ptr && bf->bytesUsed) {
644 for (k=0; k<insert; k++)
645 fprintf(stderr,
" ");
646 fprintf(stderr,
"Data:\n");
685 if (bf->pos>=bf->bytesUsed)
688 srcLeft=bf->bytesUsed - bf->pos;
695 memmove(pdst, bf->ptr + bf->pos, j);
732 if (bf->bookmarks[i]>=pos)
733 bf->bookmarks[i]+=offset;
757 if (bf->bytesUsed==0) {
766 bf->ptr[bf->bytesUsed]=0;
770 if ((bf->ptr - bf->realPtr) >= (
int)size) {
774 bf->bufferSize+=size;
786 assert(bf->pos<=bf->bytesUsed);
788 i=bf->bytesUsed-bf->pos;
791 memmove(p+size, p, i);
794 bf->ptr[bf->bytesUsed]=0;
816 if (bf->bytesUsed<size+bf->pos) {
825 bf->bufferSize-=size;
829 p=bf->ptr+bf->pos+size;
830 i=bf->bytesUsed-bf->pos-size;
831 memmove(bf->ptr+bf->pos, p, i);
836 bf->ptr[bf->bytesUsed]=0;
873 "Error replacing %d bytes with %d bytes (%d)",
880 memmove(bf->ptr+bf->pos, buffer, size);
908 memmove(bf->ptr+bf->pos, buffer, size);
964 if (pos>=bf->bufferSize) {
968 if (bf->bytesUsed-pos<l) {
981 if (bf->pos>bf->bytesUsed)
982 bf->pos=bf->bytesUsed;
984 bf->ptr[bf->bytesUsed]=0;
1033 memset(bf->ptr+bf->bytesUsed, c, size);
1034 if (bf->pos==bf->bytesUsed)
1036 bf->bytesUsed+=size;
1038 bf->ptr[bf->bytesUsed]=0;
1065 memset(bf->ptr+bf->pos, c, size);
1092 int maxUnsegmentedWrite;
1101 va_start(list,
fmt);
1102 rv=vsnprintf(p, maxUnsegmentedWrite,
fmt, list);
1108 else if (rv>=maxUnsegmentedWrite) {
1112 va_start(list,
fmt);
1113 rv=vsnprintf(p, maxUnsegmentedWrite,
fmt, list);
1131 const char *openingString,
1132 const char *closingString,
1142 startPos=(ptr-bf->ptr);
1144 startPos+=strlen(openingString);
1145 ptr+=strlen(openingString);
1148 endPos=(ptr-bf->ptr);
1150 endPos+=strlen(closingString);
int GWEN_Buffer_InsertByte(GWEN_BUFFER *bf, char c)
int GWEN_Buffer_DecrementPos(GWEN_BUFFER *bf, uint32_t i)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
int GWEN_Buffer_FillWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
void GWEN_Buffer_SetStep(GWEN_BUFFER *bf, uint32_t step)
int GWEN_Buffer_InsertBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
int GWEN_Buffer_RemoveRoom(GWEN_BUFFER *bf, uint32_t size)
int GWEN_Buffer_ReplaceBytes(GWEN_BUFFER *bf, uint32_t rsize, const char *buffer, uint32_t size)
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
GWEN_BUFFER * GWEN_Buffer_dup(GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetHardLimit(GWEN_BUFFER *bf)
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
void GWEN_Buffer_SubMode(GWEN_BUFFER *bf, uint32_t mode)
uint32_t GWEN_Buffer_GetBytesLeft(GWEN_BUFFER *bf)
void GWEN_Buffer_Dump(GWEN_BUFFER *bf, unsigned int insert)
void GWEN_Buffer_SetHardLimit(GWEN_BUFFER *bf, uint32_t l)
int GWEN_Buffer_PeekByte(GWEN_BUFFER *bf)
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
int GWEN_Buffer_InsertRoom(GWEN_BUFFER *bf, uint32_t size)
void GWEN_Buffer_OverwriteContent(GWEN_BUFFER *bf, int c)
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetMode(GWEN_BUFFER *bf)
int GWEN_Buffer_InsertString(GWEN_BUFFER *bf, const char *buffer)
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
void GWEN_Buffer_Attach(GWEN_BUFFER *bf)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
int GWEN_Buffer_ReadByte(GWEN_BUFFER *bf)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
void GWEN_Buffer_SetBookmark(GWEN_BUFFER *bf, unsigned int idx, uint32_t v)
int GWEN_Buffer_ReadBytes(GWEN_BUFFER *bf, char *buffer, uint32_t *size)
int GWEN_Buffer_FillLeftWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
uint32_t GWEN_Buffer_GetBookmark(const GWEN_BUFFER *bf, unsigned int idx)
int GWEN_Buffer_Relinquish(GWEN_BUFFER *bf)
void GWEN_Buffer_AdjustBookmarks(GWEN_BUFFER *bf, uint32_t pos, int offset)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
int GWEN_Buffer_KeepTextBetweenStrings(GWEN_BUFFER *bf, const char *openingString, const char *closingString, int onlyBetween)
uint32_t GWEN_Buffer_GetSize(const GWEN_BUFFER *bf)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetStep(GWEN_BUFFER *bf)
void GWEN_Buffer_AddMode(GWEN_BUFFER *bf, uint32_t mode)
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
int GWENHYWFAR_CB GWEN_Buffer_CacheFn_Attach(void *ptr)
int GWENHYWFAR_CB GWEN_Buffer_CacheFn_Free(void *ptr)
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
int GWEN_Buffer_InsertBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
void GWEN_Buffer_SetMode(GWEN_BUFFER *bf, uint32_t mode)
#define GWEN_BUFFER_MAX_BOOKMARKS
#define GWEN_BUFFER_MODE_ABORT_ON_MEMFULL
#define GWEN_BUFFER_MODE_DYNAMIC
#define GWEN_BUFFER_MODE_READONLY
GWENHYWFAR_API const char * fmt
#define GWEN_BUFFER_MODE_DEFAULT
#define DBG_VERBOUS(dbg_logger, format,...)
#define DBG_INFO(dbg_logger, format,...)
#define DBG_ERROR(dbg_logger, format,...)
#define DBG_DEBUG(dbg_logger, format,...)
#define GWEN_ERROR_MEMORY_FULL
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_BUFFER_OVERFLOW
#define GWEN_ERROR_PERMISSIONS
#define GWEN_ERROR_GENERIC
#define GWEN_ERROR_NOT_FOUND
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
void * GWEN_Memory_realloc(void *oldp, size_t nsize)
void * GWEN_Memory_malloc(size_t wsize)
void GWEN_Memory_dealloc(void *p)
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
const char * GWEN_Text_StrCaseStr(const char *haystack, const char *needle)
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)