Changeset 8247


Ignore:
Timestamp:
Apr 16, 2009, 9:00:48 PM (13 years ago)
Author:
charles
Message:

(trunk libT) avoid unnecessary malloc()s & free()s in tr_utf8clean()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/utils.c

    r8087 r8247  
    13531353tr_utf8clean( const char * str, int max_len, tr_bool * err )
    13541354{
    1355     const char zero = '\0';
    13561355    char * ret;
    1357     struct evbuffer * buf = evbuffer_new( );
    13581356    const char * end;
     1357
     1358    if( max_len < 0 )
     1359        max_len = (int) strlen( str );
    13591360
    13601361    if( err != NULL )
    13611362        *err = FALSE;
    13621363
    1363     if( max_len < 0 )
    1364         max_len = (int) strlen( str );
    1365 
    1366     while( !tr_utf8_validate ( str, max_len, &end ) )
    1367     {
    1368         const int good_len = end - str;
    1369 
    1370         evbuffer_add( buf, str, good_len );
    1371         max_len -= ( good_len + 1 );
    1372         str += ( good_len + 1 );
    1373         evbuffer_add( buf, "?", 1 );
    1374 
    1375         if( err != NULL )
    1376             *err = TRUE;
    1377     }
    1378 
    1379     evbuffer_add( buf, str, max_len );
    1380     evbuffer_add( buf, &zero, 1 );
    1381     ret = tr_memdup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) );
     1364    if( tr_utf8_validate( str, max_len, &end  ) )
     1365    {
     1366        ret = tr_strndup( str, max_len );
     1367    }
     1368    else
     1369    {
     1370        const char zero = '\0';
     1371        struct evbuffer * buf = evbuffer_new( );
     1372
     1373        while( !tr_utf8_validate ( str, max_len, &end ) )
     1374        {
     1375            const int good_len = end - str;
     1376
     1377            evbuffer_add( buf, str, good_len );
     1378            max_len -= ( good_len + 1 );
     1379            str += ( good_len + 1 );
     1380            evbuffer_add( buf, "?", 1 );
     1381
     1382            if( err != NULL )
     1383                *err = TRUE;
     1384        }
     1385
     1386        evbuffer_add( buf, str, max_len );
     1387        evbuffer_add( buf, &zero, 1 );
     1388        ret = tr_memdup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) );
     1389        evbuffer_free( buf );
     1390    }
     1391
    13821392    assert( tr_utf8_validate( ret, -1, NULL ) );
    1383     evbuffer_free( buf );
    13841393    return ret;
    13851394}
Note: See TracChangeset for help on using the changeset viewer.