version 1.27, 2015/04/29 00:42:12 |
version 1.28, 2019/12/21 15:26:47 |
|
|
* Functions for automatically expanded buffers. |
* Functions for automatically expanded buffers. |
*/ |
*/ |
|
|
|
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <limits.h> |
#include <limits.h> |
#include <stddef.h> |
#include <stddef.h> |
|
|
exit(2); |
exit(2); |
} |
} |
|
|
/* BufExpand(bp, nb) |
#define BUF_DEF_SIZE 256U /* Default buffer size */ |
* Expand buffer bp to hold upto nb additional |
#define BUF_MARGIN 256U /* Make sure we are comfortable */ |
* chars. Makes sure there's room for an extra '\0' char at |
|
* the end of the buffer to terminate the string. */ |
|
#define BufExpand(bp,nb) \ |
|
do { \ |
|
size_t occupied = (bp)->inPtr - (bp)->buffer; \ |
|
size_t size = (bp)->endPtr - (bp)->buffer; \ |
|
DO_STAT_BUF(bp, nb); \ |
|
\ |
|
do { \ |
|
if (size <= SIZE_MAX/2) { \ |
|
size *= 2 ; \ |
|
} else { \ |
|
fatal_overflow(); \ |
|
} \ |
|
} while (size - occupied < (nb)+1+BUF_MARGIN); \ |
|
(bp)->buffer = (bp)->inPtr = (bp)->endPtr = \ |
|
erealloc((bp)->buffer, size); \ |
|
(bp)->inPtr += occupied; \ |
|
(bp)->endPtr += size; \ |
|
} while (0); |
|
|
|
#define BUF_DEF_SIZE 256 /* Default buffer size */ |
/* BufExpand(bp, nb) |
#define BUF_MARGIN 256 /* Make sure we are comfortable */ |
* Expand buffer bp to hold up to nb additional |
|
* chars. Makes sure there's always room for an extra '\0' char |
/* the hard case for Buf_AddChar: buffer must be expanded to accommodate |
* at the end of the buffer for Buf_Retrieve. */ |
* one more char. */ |
|
void |
void |
BufOverflow(Buffer bp) |
BufExpand(Buffer bp, size_t nb) |
{ |
{ |
BufExpand(bp, 1); |
size_t occupied = bp->inPtr - bp->buffer; |
|
size_t size = bp->endPtr - bp->buffer; |
|
DO_STAT_BUF(bp, nb); |
|
|
|
do { |
|
if (size <= SIZE_MAX/2) { |
|
size *= 2 ; |
|
} else { |
|
fatal_overflow(); |
|
} |
|
assert(size >= occupied); |
|
} while (size - occupied < nb+1+BUF_MARGIN); |
|
bp->buffer = erealloc(bp->buffer, size); |
|
bp->inPtr = bp->buffer +occupied; |
|
bp->endPtr = bp->buffer + size; |
} |
} |
|
|
|
|
void |
void |
Buf_AddChars(Buffer bp, size_t numBytes, const char *bytesPtr) |
Buf_AddChars(Buffer bp, size_t numBytes, const char *bytesPtr) |
{ |
{ |
|
assert(bp->endPtr >= bp->inPtr); |
if ((size_t)(bp->endPtr - bp->inPtr) < numBytes+1) |
if ((size_t)(bp->endPtr - bp->inPtr) < numBytes+1) |
BufExpand(bp, numBytes); |
BufExpand(bp, numBytes); |
|
|
|
|
va_start(va, fmt); |
va_start(va, fmt); |
n = vsnprintf(bp->inPtr, bp->endPtr - bp->inPtr, fmt, va); |
n = vsnprintf(bp->inPtr, bp->endPtr - bp->inPtr, fmt, va); |
va_end(va); |
va_end(va); |
if (n > bp->endPtr - bp->inPtr) { |
if (n+1 > bp->endPtr - bp->inPtr) { |
va_list vb; |
va_list vb; |
BufExpand(bp, n); |
BufExpand(bp, n); |
va_start(vb, fmt); |
va_start(vb, fmt); |