Ignore:
Timestamp:
Jan 10, 2009, 10:48:58 PM (13 years ago)
Author:
charles
Message:

(trunk libT) #1675: better utf8 validation of metainfo name, creator, and comment fields

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/utils.c

    r7632 r7656  
    3333
    3434#include "transmission.h"
     35#include "ConvertUTF.h"
    3536#include "list.h"
    3637#include "utils.h"
     
    13201321    return first;
    13211322}
     1323
     1324/***
     1325****
     1326***/
     1327
     1328char*
     1329tr_utf8clean( const char * str, ssize_t max_len, tr_bool * err )
     1330{
     1331    const char zero = '\0';
     1332    char * ret;
     1333    struct evbuffer * buf = evbuffer_new( );
     1334    const char * end;
     1335
     1336    if( err != NULL )
     1337        *err = FALSE;
     1338
     1339    if( max_len < 0 )
     1340        max_len = (ssize_t) strlen( str );
     1341
     1342    while( !tr_utf8_validate ( str, max_len, &end ) )
     1343    {
     1344        const ssize_t good_len = end - str;
     1345
     1346        evbuffer_add( buf, str, good_len );
     1347        max_len -= ( good_len + 1 );
     1348        str += ( good_len + 1 );
     1349        evbuffer_add( buf, "?", 1 );
     1350
     1351        if( err != NULL )
     1352            *err = TRUE;
     1353    }
     1354
     1355    evbuffer_add( buf, str, max_len );
     1356    evbuffer_add( buf, &zero, 1 );
     1357    ret = tr_memdup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) );
     1358    assert( tr_utf8_validate( ret, -1, NULL ) );
     1359    evbuffer_free( buf );
     1360    return ret;
     1361}
Note: See TracChangeset for help on using the changeset viewer.