Ignore:
Timestamp:
Apr 8, 2009, 5:25:17 PM (13 years ago)
Author:
charles
Message:

(trunk libT) faster serialization from tr_benc structs into json and benc formats

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bencode.c

    r8160 r8179  
    817817}
    818818
    819 #if 0
    820 tr_benc*
    821 tr_bencDictAddReal( tr_benc * dict, const char * key, double d )
    822 {
    823     ccc
    824     char buf[128];
    825     char * locale;
    826 
    827     /* the json spec requires a '.' decimal point regardless of locale */
    828     locale = tr_strdup( setlocale ( LC_NUMERIC, NULL ) );
    829     setlocale( LC_NUMERIC, "POSIX" );
    830     tr_snprintf( buf, sizeof( buf ), "%f", d );
    831     setlocale( LC_NUMERIC, locale );
    832     tr_free( locale );
    833 
    834     return tr_bencDictAddStr( dict, key, buf );
    835 }
    836 #endif
    837 
    838819tr_benc*
    839820tr_bencDictAddList( tr_benc *    dict,
     
    11091090saveBoolFunc( const tr_benc * val, void * evbuf )
    11101091{
    1111     evbuffer_add_printf( evbuf, "i%de", val->val.b?1:0 );
     1092    if( val->val.b )
     1093        evbuffer_add( evbuf, "i1e", 3 );
     1094    else
     1095        evbuffer_add( evbuf, "i0e", 3 );
    11121096}
    11131097
     
    11451129                   void *              evbuf )
    11461130{
    1147     evbuffer_add_printf( evbuf, "d" );
     1131    evbuffer_add( evbuf, "d", 1 );
    11481132}
    11491133
     
    11521136                   void *              evbuf )
    11531137{
    1154     evbuffer_add_printf( evbuf, "l" );
     1138    evbuffer_add( evbuf, "l", 1 );
    11551139}
    11561140
     
    11591143                      void *              evbuf )
    11601144{
    1161     evbuffer_add_printf( evbuf, "e" );
     1145    evbuffer_add( evbuf, "e", 1 );
    11621146}
    11631147
     
    12511235jsonIndent( struct jsonWalk * data )
    12521236{
     1237    int i;
     1238    char buf[1024], *pch=buf;
    12531239    const int width = tr_list_size( data->parents ) * 4;
    12541240
    1255     evbuffer_add_printf( data->out, "\n%*.*s", width, width, " " );
     1241    *pch++ = '\n';
     1242    for( i=0; i<width; ++i )
     1243        *pch++ = ' ';
     1244
     1245    evbuffer_add( data->out, buf, pch-buf );
    12561246}
    12571247
     
    12691259                const int i = parentState->childIndex++;
    12701260                if( !( i % 2 ) )
    1271                     evbuffer_add_printf( data->out, ": " );
     1261                    evbuffer_add( data->out, ": ", 2 );
    12721262                else
    12731263                {
    1274                     evbuffer_add_printf( data->out, ", " );
     1264                    evbuffer_add( data->out, ", ", 2 );
    12751265                    jsonIndent( data );
    12761266                }
     
    12811271            {
    12821272                ++parentState->childIndex;
    1283                 evbuffer_add_printf( data->out, ", " );
     1273                evbuffer_add( data->out, ", ", 2 );
    12841274                jsonIndent( data );
    12851275                break;
     
    13251315    struct jsonWalk * data = vdata;
    13261316
    1327     evbuffer_add_printf( data->out, "%s", (val->val.b?"true":"false") );
     1317    if( val->val.b )
     1318        evbuffer_add( data->out, "true", 4 );
     1319    else
     1320        evbuffer_add( data->out, "false", 5 );
     1321
    13281322    jsonChildFunc( data );
    13291323}
     
    13461340
    13471341static void
    1348 jsonStringFunc( const tr_benc * val,
    1349                 void *          vdata )
    1350 {
    1351     struct jsonWalk *    data = vdata;
     1342jsonStringFunc( const tr_benc * val, void * vdata )
     1343{
     1344    struct jsonWalk * data = vdata;
    13521345    const unsigned char *it, *end;
    13531346
    1354     evbuffer_add_printf( data->out, "\"" );
     1347    evbuffer_add( data->out, "\"", 1 );
    13551348    for( it = (const unsigned char*)val->val.s.s, end = it + val->val.s.i;
    13561349         it != end; ++it )
     
    13581351        switch( *it )
    13591352        {
     1353            case '"':
     1354            case '\\':
    13601355            case '/':
    1361                 evbuffer_add_printf( data->out, "\\/" ); break;
    1362 
    13631356            case '\b':
    1364                 evbuffer_add_printf( data->out, "\\b" ); break;
    1365 
    13661357            case '\f':
    1367                 evbuffer_add_printf( data->out, "\\f" ); break;
    1368 
    13691358            case '\n':
    1370                 evbuffer_add_printf( data->out, "\\n" ); break;
    1371 
    13721359            case '\r':
    1373                 evbuffer_add_printf( data->out, "\\r" ); break;
    1374 
    1375             case '\t':
    1376                 evbuffer_add_printf( data->out, "\\t" ); break;
    1377 
    1378             case '"':
    1379                 evbuffer_add_printf( data->out, "\\\"" ); break;
    1380 
    1381             case '\\':
    1382                 evbuffer_add_printf( data->out, "\\\\" ); break;
     1360            case '\t': {
     1361                char buf[2] = { '\\', *it };
     1362                evbuffer_add( data->out, buf, 2 );
     1363                break;
     1364            }
    13831365
    13841366            default:
     
    13861368                {
    13871369                    /*fprintf( stderr, "[%c]\n", *it );*/
    1388                     evbuffer_add_printf( data->out, "%c", *it );
     1370                    evbuffer_add( data->out, it, 1 );
    13891371                }
    13901372                else
     
    14041386        }
    14051387    }
    1406     evbuffer_add_printf( data->out, "\"" );
     1388    evbuffer_add( data->out, "\"", 1 );
    14071389    jsonChildFunc( data );
    14081390}
     
    14151397
    14161398    jsonPushParent( data, val );
    1417     evbuffer_add_printf( data->out, "{" );
     1399    evbuffer_add( data->out, "{", 1 );
    14181400    if( val->val.l.count )
    14191401        jsonIndent( data );
     
    14281410
    14291411    jsonPushParent( data, val );
    1430     evbuffer_add_printf( data->out, "[" );
     1412    evbuffer_add( data->out, "[", 1 );
    14311413    if( nChildren )
    14321414        jsonIndent( data );
     
    14581440        jsonIndent( data );
    14591441    if( tr_bencIsDict( val ) )
    1460         evbuffer_add_printf( data->out, "}" );
     1442        evbuffer_add( data->out, "}", 1 );
    14611443    else /* list */
    1462         evbuffer_add_printf( data->out, "]" );
     1444        evbuffer_add( data->out, "]", 1 );
    14631445    jsonChildFunc( data );
    14641446}
Note: See TracChangeset for help on using the changeset viewer.