iupdate buffer.
This commit is contained in:
parent
e85e76cd57
commit
5a6f6c09ce
@ -28,6 +28,7 @@ int
|
|||||||
growBuffer(Buffer b, size_t minfree)
|
growBuffer(Buffer b, size_t minfree)
|
||||||
{ size_t osz = b->max - b->base, sz = osz;
|
{ size_t osz = b->max - b->base, sz = osz;
|
||||||
size_t top = b->top - b->base;
|
size_t top = b->top - b->base;
|
||||||
|
char *new;
|
||||||
|
|
||||||
if ( b->max - b->top >= (int)minfree )
|
if ( b->max - b->top >= (int)minfree )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -37,20 +38,17 @@ growBuffer(Buffer b, size_t minfree)
|
|||||||
while( top + minfree > sz )
|
while( top + minfree > sz )
|
||||||
sz *= 2;
|
sz *= 2;
|
||||||
|
|
||||||
if ( b->base != b->static_buffer )
|
if ( b->base == b->static_buffer )
|
||||||
{ b->base = realloc(b->base, sz);
|
{ if ( !(new = malloc(sz)) )
|
||||||
if ( !b->base )
|
|
||||||
return FALSE;
|
|
||||||
} else /* from static buffer */
|
|
||||||
{ char *new;
|
|
||||||
|
|
||||||
if ( !(new = malloc(sz)) )
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memcpy(new, b->static_buffer, osz);
|
memcpy(new, b->static_buffer, osz);
|
||||||
b->base = new;
|
} else
|
||||||
|
{ if ( !(new = realloc(b->base, sz)) )
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b->base = new;
|
||||||
b->top = b->base + top;
|
b->top = b->base + top;
|
||||||
b->max = b->base + sz;
|
b->max = b->base + sz;
|
||||||
|
|
||||||
@ -62,7 +60,7 @@ growBuffer(Buffer b, size_t minfree)
|
|||||||
* BUFFER RING *
|
* BUFFER RING *
|
||||||
*******************************/
|
*******************************/
|
||||||
|
|
||||||
#define discardable_buffer (LD->fli._discardable_buffer)
|
#define discardable_buffer (LD->fli._discardable_buffer)
|
||||||
#define buffer_ring (LD->fli._buffer_ring)
|
#define buffer_ring (LD->fli._buffer_ring)
|
||||||
#define current_buffer_id (LD->fli._current_buffer_id)
|
#define current_buffer_id (LD->fli._current_buffer_id)
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ int growBuffer(Buffer b, size_t minfree);
|
|||||||
{ if ( !growBuffer((Buffer)b, sizeof(type)) ) \
|
{ if ( !growBuffer((Buffer)b, sizeof(type)) ) \
|
||||||
outOfCore(); \
|
outOfCore(); \
|
||||||
} \
|
} \
|
||||||
*((type *)(b)->top) = obj; \
|
*((type *)(b)->top) = obj; \
|
||||||
(b)->top += sizeof(type); \
|
(b)->top += sizeof(type); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
@ -68,6 +68,24 @@ int growBuffer(Buffer b, size_t minfree);
|
|||||||
(b)->top = (char *)_d; \
|
(b)->top = (char *)_d; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
#define allocFromBuffer(b, bytes) \
|
||||||
|
f__allocFromBuffer((Buffer)(b), (bytes))
|
||||||
|
|
||||||
|
static inline void*
|
||||||
|
f__allocFromBuffer(Buffer b, size_t bytes)
|
||||||
|
{ if ( b->top + bytes <= b->max ||
|
||||||
|
growBuffer(b, bytes) )
|
||||||
|
{ void *top = b->top;
|
||||||
|
|
||||||
|
b->top += bytes;
|
||||||
|
|
||||||
|
return top;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define baseBuffer(b, type) ((type *) (b)->base)
|
#define baseBuffer(b, type) ((type *) (b)->base)
|
||||||
#define topBuffer(b, type) ((type *) (b)->top)
|
#define topBuffer(b, type) ((type *) (b)->top)
|
||||||
#define inBuffer(b, addr) ((char *) (addr) >= (b)->base && \
|
#define inBuffer(b, addr) ((char *) (addr) >= (b)->base && \
|
||||||
@ -83,6 +101,8 @@ int growBuffer(Buffer b, size_t minfree);
|
|||||||
sizeof((b)->static_buffer))
|
sizeof((b)->static_buffer))
|
||||||
#define emptyBuffer(b) ((b)->top = (b)->base)
|
#define emptyBuffer(b) ((b)->top = (b)->base)
|
||||||
#define isEmptyBuffer(b) ((b)->top == (b)->base)
|
#define isEmptyBuffer(b) ((b)->top == (b)->base)
|
||||||
|
#define popBuffer(b,type) \
|
||||||
|
((b)->top -= sizeof(type), *(type*)(b)->top)
|
||||||
|
|
||||||
#define discardBuffer(b) \
|
#define discardBuffer(b) \
|
||||||
do \
|
do \
|
||||||
@ -99,6 +119,6 @@ int growBuffer(Buffer b, size_t minfree);
|
|||||||
|
|
||||||
COMMON(Buffer) findBuffer(int flags);
|
COMMON(Buffer) findBuffer(int flags);
|
||||||
COMMON(int) unfindBuffer(int flags);
|
COMMON(int) unfindBuffer(int flags);
|
||||||
COMMON(char *) buffer_string(const char *s, int flags);
|
COMMON(char *) buffer_string(const char *s, int flags);
|
||||||
|
|
||||||
#endif /*BUFFER_H_INCLUDED*/
|
#endif /*BUFFER_H_INCLUDED*/
|
||||||
|
Reference in New Issue
Block a user