Changeset 5901


Ignore:
Timestamp:
May 22, 2008, 4:41:16 PM (14 years ago)
Author:
charles
Message:

(rpc) make our generated JSON more human-readable.

Location:
trunk/libtransmission
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bencode-test.c

    r5860 r5901  
     1#include <ctype.h>
    12#include <stdio.h>
    23#include "transmission.h"
     
    151152    } else {
    152153        check( !err );
     154#if 0
     155        fprintf( stderr, "in: [%s]\n", str );
     156        fprintf( stderr, "out:\n%s", tr_bencSaveAsJSON(&val,NULL) );
     157#endif
    153158        check( end == (const uint8_t*)str + len );
    154159        saved = tr_bencSave( &val, &savedLen );
     
    220225    if(( err = testString( "d4:spaml1:a1:bee", TRUE )))
    221226        return err;
     227    if(( err = testString( "d5:greenli1ei2ei3ee4:spamd1:ai123e3:keyi214eee", TRUE )))
     228        return err;
    222229    if(( err = testString( "d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee", TRUE )))
    223230        return err;
     
    270277
    271278    return 0;
     279}
     280
     281static void
     282stripWhitespace( char * in )
     283{
     284    char * out;
     285    for( out=in; *in; ++in )
     286        if( !isspace( *in ) )
     287            *out++ = *in;
     288    *out = '\0';
    272289}
    273290
     
    279296    tr_bencLoad( benc_str, strlen( benc_str ), &top, NULL );
    280297    serialized = tr_bencSaveAsJSON( &top, NULL );
     298    stripWhitespace( serialized );
    281299#if 0
    282 fprintf( stderr, " expected: [%s]\n", expected );
    283 fprintf( stderr, "      got: [%s]\n", serialized );
     300fprintf( stderr, "benc: %s\n", benc_str );
     301fprintf( stderr, "json: %s\n", serialized );
     302fprintf( stderr, "want: %s\n", expected );
    284303#endif
    285304    check( !strcmp( serialized, expected ) );
     
    302321
    303322    benc_str = "d5:helloi1e5:worldi2ee";
    304     expected = "{ \"hello\": 1, \"world\": 2 }";
     323    expected = "{\"hello\":1,\"world\":2}";
    305324    if(( val = testJSONSnippet( benc_str, expected )))
    306325        return val;
    307326
    308327    benc_str = "d5:helloi1e5:worldi2e3:fooli1ei2ei3ee";
    309     expected = "{ \"foo\": [ 1, 2, 3 ], \"hello\": 1, \"world\": 2 }";
     328    expected = "{\"foo\":[1,2,3],\"hello\":1,\"world\":2}";
    310329    if(( val = testJSONSnippet( benc_str, expected )))
    311330        return val;
    312331
    313332    benc_str = "d5:helloi1e5:worldi2e3:fooli1ei2ei3ed1:ai0eee";
    314     expected = "{ \"foo\": [ 1, 2, 3, { \"a\": 0 } ], \"hello\": 1, \"world\": 2 }";
    315     if(( val = testJSONSnippet( benc_str, expected )))
    316         return val;
    317 
    318     benc_str = "d4:argsd6:statuslee6:result7:successe";
    319     expected = "{ \"args\": { \"status\": [  ] }, \"result\": \"success\" }";
     333    expected = "{\"foo\":[1,2,3,{\"a\":0}],\"hello\":1,\"world\":2}";
     334    if(( val = testJSONSnippet( benc_str, expected )))
     335        return val;
     336
     337    benc_str = "d4:argsd6:statusle7:status2lee6:result7:successe";
     338    expected = "{\"args\":{\"status\":[],\"status2\":[]},\"result\":\"success\"}";
    320339    if(( val = testJSONSnippet( benc_str, expected )))
    321340        return val;
  • trunk/libtransmission/bencode.c

    r5843 r5901  
    2424
    2525#include <assert.h>
    26 #include <ctype.h> /* isdigit, isprint */
     26#include <ctype.h> /* isdigit, isprint, isspace */
    2727#include <errno.h>
    2828#include <stdarg.h>
     
    10251025
    10261026static void
     1027jsonIndent( struct jsonWalk * data )
     1028{
     1029    const int width = tr_list_size( data->parents ) * 4;
     1030    evbuffer_add_printf( data->out, "\n%*.*s", width, width, " " );
     1031}
     1032
     1033static void
    10271034jsonChildFunc( struct jsonWalk * data )
    10281035{
     
    10371044                if( ! ( i % 2 ) )
    10381045                    evbuffer_add_printf( data->out, ": " );
    1039                 else
     1046                else {
    10401047                    evbuffer_add_printf( data->out, ", " );
     1048                    jsonIndent( data );
     1049                }
    10411050                break;
    10421051            }
     
    10451054                ++parentState->childIndex;
    10461055                evbuffer_add_printf( data->out, ", " );
     1056                jsonIndent( data );
    10471057                break;
    10481058            }
     
    10861096    {
    10871097        switch( *it ) {
    1088             case '"' : evbuffer_add_printf( data->out, "\\\"" ); break;
    1089             case '/' : evbuffer_add_printf( data->out, "\\/" ); break;
    1090             case '\b': evbuffer_add_printf( data->out, "\\b" ); break;
    1091             case '\f': evbuffer_add_printf( data->out, "\\f" ); break;
    1092             case '\n': evbuffer_add_printf( data->out, "\\n" ); break;
    1093             case '\r': evbuffer_add_printf( data->out, "\\n" ); break;
    1094             case '\t': evbuffer_add_printf( data->out, "\\n" ); break;
    1095             case '\\': evbuffer_add_printf( data->out, "\\\\" ); break;
     1098            case '"' :
     1099            case '/' :
     1100            case '\b':
     1101            case '\f':
     1102            case '\n':
     1103            case '\r':
     1104            case '\t':
     1105            case '\\': evbuffer_add_printf( data->out, "\\%c", *it ); break;
    10961106            default: {
    10971107                if( isascii( *it ) )
     
    11111121    struct jsonWalk * data = vdata;
    11121122    jsonPushParent( data, val );
    1113     evbuffer_add_printf( data->out, "{ " );
    1114     if( !val->val.l.count )
    1115         evbuffer_add_printf( data->out, "  " );
     1123    evbuffer_add_printf( data->out, "{" );
     1124    if( val->val.l.count )
     1125        jsonIndent( data );
    11161126}
    11171127static void
    11181128jsonListBeginFunc( const tr_benc * val, void * vdata )
    11191129{
     1130    const int nChildren = tr_bencListSize( val );
    11201131    struct jsonWalk * data = vdata;
    11211132    jsonPushParent( data, val );
    1122     evbuffer_add_printf( data->out, "[ " );
    1123     if( !val->val.l.count )
    1124         evbuffer_add_printf( data->out, "  " );
     1133    evbuffer_add_printf( data->out, "[" );
     1134    if( nChildren )
     1135        jsonIndent( data );
    11251136}
    11261137static void
    11271138jsonContainerEndFunc( const tr_benc * val, void * vdata )
    11281139{
     1140    size_t i;
    11291141    struct jsonWalk * data = vdata;
    1130     EVBUFFER_LENGTH( data->out ) -= 2;
     1142    char * str;
     1143    int emptyContainer = FALSE;
     1144
     1145    /* trim out the trailing comma, if any */
     1146    str = (char*) EVBUFFER_DATA( data->out );
     1147    for( i=EVBUFFER_LENGTH( data->out )-1; i>0; --i ) {
     1148        if( isspace( str[i] ) ) continue;
     1149        if( str[i]==',' )
     1150            EVBUFFER_LENGTH( data->out ) = i;
     1151        if( str[i]=='{' || str[i]=='[' )
     1152            emptyContainer = TRUE;
     1153        break;
     1154    }
     1155
     1156    jsonPopParent( data );
     1157    if( !emptyContainer )
     1158        jsonIndent( data );
    11311159    if( tr_bencIsDict( val ) )
    1132         evbuffer_add_printf( data->out, " }" );
     1160        evbuffer_add_printf( data->out, "}" );
    11331161    else /* list */
    1134         evbuffer_add_printf( data->out, " ]" );
    1135     jsonPopParent( data );
     1162        evbuffer_add_printf( data->out, "]" );
    11361163    jsonChildFunc( data );
    11371164}
     
    11541181    bencWalk( top, &walkFuncs, &data );
    11551182   
     1183    if( EVBUFFER_LENGTH( data.out ) )
     1184        evbuffer_add_printf( data.out, "\n" );
    11561185    if( len != NULL )
    11571186        *len = EVBUFFER_LENGTH( data.out );
Note: See TracChangeset for help on using the changeset viewer.