@ -4,8 +4,7 @@
*
* StringInfo provides an indefinitely - extensible string data type .
* It can be used to buffer either ordinary C strings ( null - terminated text )
* or arbitrary binary data . All storage is allocated with palloc ( ) and
* friends .
* or arbitrary binary data . All storage is allocated with palloc ( ) .
*
* Portions Copyright ( c ) 1996 - 2017 , PostgreSQL Global Development Group
* Portions Copyright ( c ) 1994 , Regents of the University of California
@ -37,29 +36,11 @@ makeStringInfo(void)
return res ;
}
/*
* makeLongStringInfo
*
* Same as makeStringInfo , for larger strings .
*/
StringInfo
makeLongStringInfo ( void )
{
StringInfo res ;
res = ( StringInfo ) palloc ( sizeof ( StringInfoData ) ) ;
initLongStringInfo ( res ) ;
return res ;
}
/*
* initStringInfo
*
* Initialize a StringInfoData struct ( with previously undefined contents )
* to describe an empty string ; don ' t enable long strings yet .
* to describe an empty string .
*/
void
initStringInfo ( StringInfo str )
@ -68,22 +49,9 @@ initStringInfo(StringInfo str)
str - > data = ( char * ) palloc ( size ) ;
str - > maxlen = size ;
str - > long_ok = false ;
resetStringInfo ( str ) ;
}
/*
* initLongStringInfo
*
* Same as initStringInfo , plus enable long strings .
*/
void
initLongStringInfo ( StringInfo str )
{
initStringInfo ( str ) ;
str - > long_ok = true ;
}
/*
* resetStringInfo
*
@ -174,7 +142,7 @@ appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
/*
* Return pvsnprintf ' s estimate of the space needed . ( Although this is
* given as a size_t , we know it will fit in int because it ' s not more
* than either MaxAllocSize or half an int ' s width . )
* than MaxAllocSize . )
*/
return ( int ) nprinted ;
}
@ -276,17 +244,7 @@ appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
void
enlargeStringInfo ( StringInfo str , int needed )
{
Size newlen ;
Size limit ;
/*
* Determine the upper size limit . Because of overflow concerns outside
* of this module , we limit ourselves to 4 - byte signed integer range ,
* even for " long_ok " strings .
*/
limit = str - > long_ok ?
( ( ( Size ) 1 ) < < ( sizeof ( int32 ) * 8 - 1 ) ) - 1 :
MaxAllocSize ;
int newlen ;
/*
* Guard against out - of - range " needed " values . Without this , we can get
@ -294,7 +252,7 @@ enlargeStringInfo(StringInfo str, int needed)
*/
if ( needed < 0 ) /* should not happen */
elog ( ERROR , " invalid string enlargement request size: %d " , needed ) ;
if ( ( ( Size ) needed ) > = ( limit - ( Size ) str - > len ) )
if ( ( ( Size ) needed ) > = ( MaxAllocSize - ( Size ) str - > len ) )
ereport ( ERROR ,
( errcode ( ERRCODE_PROGRAM_LIMIT_EXCEEDED ) ,
errmsg ( " out of memory " ) ,
@ -303,7 +261,7 @@ enlargeStringInfo(StringInfo str, int needed)
needed + = str - > len + 1 ; /* total space required now */
/* Because of the above test, we now have needed <= limit */
/* Because of the above test, we now have needed <= MaxAllocSize */
if ( needed < = str - > maxlen )
return ; /* got enough space already */
@ -313,20 +271,19 @@ enlargeStringInfo(StringInfo str, int needed)
* for efficiency , double the buffer size each time it overflows .
* Actually , we might need to more than double it if ' needed ' is big . . .
*/
newlen = 2 * ( Size ) str - > maxlen ;
while ( ( Size ) needed > newlen )
newlen = 2 * str - > maxlen ;
while ( needed > newlen )
newlen = 2 * newlen ;
/*
* Clamp to the limit in case we went past it . ( We used to depend on
* limit < = INT32_MAX / 2 , to avoid overflow in the loop above ; we no longer
* depend on that , but if " needed " and str - > maxlen ever become wider , we
* will need similar caution here . ) We will still have newlen > = needed .
* Clamp to MaxAllocSize in case we went past it . Note we are assuming
* here that MaxAllocSize < = INT_MAX / 2 , else the above loop could
* overflow . We will still have newlen > = needed .
*/
if ( newlen > limit )
newlen = limit ;
if ( newlen > ( int ) MaxAllocSize )
newlen = ( int ) MaxAllocSize ;
str - > data = ( char * ) repalloc_huge ( str - > data , newlen ) ;
str - > data = ( char * ) repalloc ( str - > data , newlen ) ;
str - > maxlen = newlen ;
}