コード例 #1
0
// realloc
static void * real()
{
	int j,size, oldsize;
	void * current = NULL;

	oldsize = 0;

	for (j = 0 ; j < REALLOC_COUNT ; j ++)
	{
		TotalAlloc ++;

		size = (random() % MAX_ALLOCATE_SIZE);

		TotalAllocSize += size;

		if (oldsize && current)
		{
			memset(current, 'A', oldsize);
		}

		current = (void *)upnp_realloc(current, size);

		if (current && size && oldsize)
		{
			void *ptr = current;
			int c;
			int m = ((size > oldsize)?oldsize:size);
			for (c = 0 ; c <m ; c ++, ptr ++)
			{
				if (*((char*)ptr) != 'A')
				{
					printf("strdup error ! duplicated character error : %c [expected: %c]\n", *((char*)ptr), 'A');
					upnp_mm_dump();
					exit(1);
				}
			}
		}

		if ((!current) && size)
		{
			printf("reallocate Warning: out of memory (size : %d)\n", size);
			upnp_mm_dump();
			NullAlloc ++;
		}

		oldsize = size;
	}
	return current;
}
コード例 #2
0
int
iasnprintf( char **ret,
            int incr,
            int max,
            const char *fmt,
            ... )
{
    int size = incr;
    int retc = 0;
    va_list ap;
    char *temp = NULL;

    assert( ret );
    assert( fmt );
#ifdef _UPNP_MM_
    ( *ret ) = ( char * )upnp_malloc( incr );
#else
    ( *ret ) = ( char * )malloc( incr );
#endif

    while( 1 ) {
        va_start( ap, fmt );
        retc = vsnprintf( ( *ret ), size, fmt, ap );
        va_end( ap );

        if( retc < 0 ) {
            //size not big enough
            //and vsnprintf does NOT return the
            //necessary number of bytes
            if( ( max != -1 ) && ( size == max ) )  //max reached
            {
                break;
            }

            incr *= 2;          //increase increment
            //increase size and try again  
            if( ( max != -1 ) && ( ( size + incr ) > max ) ) {
                incr = ( max - size );
            }

#ifdef _UPNP_MM_
            temp = ( char * )upnp_realloc( ( *ret ), size + incr );
#else
            temp = ( char * )realloc( ( *ret ), size + incr );
#endif
            if( temp == NULL ) {
                break;
            }
            size += incr;
            ( *ret ) = temp;

        } else {
            if( ( retc + 1 ) > size ) {
                //size not big enough
                //and vsnprintf 
                //returns the necessary 
                //number of bytes
                if( ( max != -1 ) && ( retc + 1 > max ) ) {
                    retc = -1;
                    break;
                }

#ifdef _UPNP_MM_
                temp = ( char * )upnp_realloc( ( *ret ), retc + 1 );
#else
                temp = ( char * )realloc( ( *ret ), retc + 1 );
#endif
                if( temp == NULL ) {
                    retc = -1;
                    break;
                }
                size = retc + 1;
                ( *ret ) = temp;    //size increased try again
            } else if( ( retc + 1 ) < size ) {
                //size is bigger than needed
                //try and reallocate smaller

#ifdef _UPNP_MM_
                temp = ( char * )upnp_realloc( ( *ret ), retc + 1 );
#else
                temp = ( char * )realloc( ( *ret ), retc + 1 );
#endif
                if( temp != NULL ) {
                    ( *ret ) = temp;
                }
                break;
            } else              //size is just right, exit
            {
                break;
            }

        }
    }

    if( retc < 0 ) {
#ifdef _UPNP_MM_
        upnp_free( ( *ret ) );
#else
        free( ( *ret ) );
#endif
        ( *ret ) = NULL;
    }

    return retc;
}