Changeset 7359
- Timestamp:
- Dec 12, 2008, 2:12:17 AM (12 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/bencode-test.c
r6842 r7359 362 362 } 363 363 364 static int 365 testMerge( void ) 366 { 367 tr_benc dest, src; 368 int64_t i; 369 const char * s; 370 371 /* initial dictionary (default values) */ 372 tr_bencInitDict( &dest, 10 ); 373 tr_bencDictAddInt( &dest, "i1", 1 ); 374 tr_bencDictAddInt( &dest, "i2", 2 ); 375 tr_bencDictAddInt( &dest, "i4", -35 ); /* remains untouched */ 376 tr_bencDictAddStr( &dest, "s5", "abc" ); 377 tr_bencDictAddStr( &dest, "s6", "def" ); 378 tr_bencDictAddStr( &dest, "s7", "127.0.0.1" ); /* remains untouched */ 379 380 /* new dictionary, will overwrite items in dest */ 381 tr_bencInitDict( &src, 10 ); 382 tr_bencDictAddInt( &src, "i1", 1 ); /* same value */ 383 tr_bencDictAddInt( &src, "i2", 4 ); /* new value */ 384 tr_bencDictAddInt( &src, "i3", 3 ); /* new key:value */ 385 tr_bencDictAddStr( &src, "s5", "abc" ); /* same value */ 386 tr_bencDictAddStr( &src, "s6", "xyz" ); /* new value */ 387 tr_bencDictAddStr( &src, "s8", "ghi" ); /* new key:value */ 388 389 tr_bencMergeDicts( &dest, /*const*/ &src ); 390 391 check( tr_bencDictFindInt( &dest, "i1", &i )); 392 check( i == 1); 393 check( tr_bencDictFindInt( &dest, "i2", &i )); 394 check( i == 4); 395 check( tr_bencDictFindInt( &dest, "i3", &i )); 396 check( i == 3); 397 check( tr_bencDictFindInt( &dest, "i4", &i )); 398 check( i == -35); 399 check( tr_bencDictFindStr( &dest, "s5", &s )); 400 check( strcmp( "abc", s ) == 0 ); 401 check( tr_bencDictFindStr( &dest, "s6", &s )); 402 check( strcmp( "xyz", s ) == 0 ); 403 check( tr_bencDictFindStr( &dest, "s7", &s )); 404 check( strcmp( "127.0.0.1", s ) == 0 ); 405 check( tr_bencDictFindStr( &dest, "s8", &s )); 406 check( strcmp( "ghi", s ) == 0 ); 407 408 tr_bencFree( &dest ); 409 tr_bencFree( &src ); 410 return 0; 411 } 412 364 413 static int 365 414 testStackSmash( int depth ) … … 397 446 int i; 398 447 399 if( ( i = testInt( ) ) ) 400 return i; 401 402 if( ( i = testStr( ) ) ) 403 return i; 404 405 if( ( i = testParse( ) ) ) 406 return i; 407 408 if( ( i = testJSON( ) ) ) 448 if(( i = testInt( ))) 449 return i; 450 451 if(( i = testStr( ))) 452 return i; 453 454 if(( i = testParse( ))) 455 return i; 456 457 if(( i = testJSON( ))) 458 return i; 459 460 if(( i = testMerge( ))) 409 461 return i; 410 462 -
trunk/libtransmission/bencode.c
r7166 r7359 35 35 **/ 36 36 37 int 38 tr_bencIsType( const tr_benc * val, 39 int type ) 37 tr_bool 38 tr_bencIsType( const tr_benc * val, int type ) 40 39 { 41 40 return ( val ) && ( val->type == type ); 42 41 } 43 42 44 static int43 static tr_bool 45 44 isContainer( const tr_benc * val ) 46 45 { … … 48 47 } 49 48 50 static int49 static tr_bool 51 50 isSomething( const tr_benc * val ) 52 51 { 53 return isContainer( val ) || tr_bencIsInt( val ) || tr_bencIsString( 54 val ); 52 return isContainer( val ) || tr_bencIsInt( val ) || tr_bencIsString( val ); 55 53 } 56 54 … … 383 381 384 382 tr_benc * 385 tr_bencDictFind( tr_benc * val, 386 const char * key ) 383 tr_bencDictFind( tr_benc * val, const char * key ) 387 384 { 388 385 const int i = dictIndexOf( val, key ); … … 418 415 } 419 416 420 int 417 tr_bool 421 418 tr_bencGetInt( const tr_benc * val, 422 419 int64_t * setme ) … … 429 426 } 430 427 431 int 428 tr_bool 432 429 tr_bencGetStr( const tr_benc * val, 433 430 const char ** setme ) … … 440 437 } 441 438 442 int 443 tr_bencDictFindInt( tr_benc * dict, 444 const char * key, 445 int64_t * setme ) 446 { 447 int found = FALSE; 439 tr_bool 440 tr_bencDictFindInt( tr_benc * dict, const char * key, int64_t * setme ) 441 { 442 tr_bool found = FALSE; 448 443 tr_benc * child = tr_bencDictFindType( dict, key, TYPE_INT ); 449 444 … … 453 448 } 454 449 455 int 456 tr_bencDictFindDouble( tr_benc * dict, 457 const char * key, 458 double * setme ) 450 tr_bool 451 tr_bencDictFindDouble( tr_benc * dict, const char * key, double * setme ) 459 452 { 460 453 const char * str; 461 const intsuccess = tr_bencDictFindStr( dict, key, &str );454 const tr_bool success = tr_bencDictFindStr( dict, key, &str ); 462 455 463 456 if( success ) 464 457 *setme = strtod( str, NULL ); 458 465 459 return success; 466 460 } 467 461 468 int 469 tr_bencDictFindList( tr_benc * dict, 470 const char * key, 471 tr_benc ** setme ) 472 { 473 int found = FALSE; 462 tr_bool 463 tr_bencDictFindList( tr_benc * dict, const char * key, tr_benc ** setme ) 464 { 465 tr_bool found = FALSE; 474 466 tr_benc * child = tr_bencDictFindType( dict, key, TYPE_LIST ); 475 467 … … 479 471 found = TRUE; 480 472 } 473 481 474 return found; 482 475 } 483 476 484 int 485 tr_bencDictFindDict( tr_benc * dict, 486 const char * key, 487 tr_benc ** setme ) 488 { 489 int found = FALSE; 477 tr_bool 478 tr_bencDictFindDict( tr_benc * dict, const char * key, tr_benc ** setme ) 479 { 480 tr_bool found = FALSE; 490 481 tr_benc * child = tr_bencDictFindType( dict, key, TYPE_DICT ); 491 482 … … 495 486 found = TRUE; 496 487 } 488 497 489 return found; 498 490 } 499 491 500 int 501 tr_bencDictFindStr( tr_benc * dict, 502 const char * key, 503 const char ** setme ) 504 { 505 int found = FALSE; 492 tr_bool 493 tr_bencDictFindStr( tr_benc * dict, const char * key, const char ** setme ) 494 { 495 tr_bool found = FALSE; 506 496 tr_benc * child = tr_bencDictFindType( dict, key, TYPE_STR ); 507 497 … … 511 501 found = TRUE; 512 502 } 503 513 504 return found; 514 505 } 515 506 516 int 517 tr_bencDictFindRaw( tr_benc *dict,518 const char *key,519 const uint8_t ** setme_raw,520 size_t *setme_len )521 { 522 intfound = FALSE;507 tr_bool 508 tr_bencDictFindRaw( tr_benc * dict, 509 const char * key, 510 const uint8_t ** setme_raw, 511 size_t * setme_len ) 512 { 513 tr_bool found = FALSE; 523 514 tr_benc * child = tr_bencDictFindType( dict, key, TYPE_STR ); 524 515 … … 529 520 found = TRUE; 530 521 } 522 531 523 return found; 532 524 } … … 1317 1309 ***/ 1318 1310 1311 static size_t 1312 tr_bencDictSize( const tr_benc * dict ) 1313 { 1314 size_t count = 0; 1315 1316 if( tr_bencIsDict( dict ) ) 1317 count = dict->val.l.count / 2; 1318 1319 return count; 1320 } 1321 1322 static tr_bool 1323 tr_bencDictChild( const tr_benc * dict, size_t n, const char ** key, const tr_benc ** val ) 1324 { 1325 tr_bool success = 0; 1326 1327 assert( tr_bencIsDict( dict ) ); 1328 1329 if( tr_bencIsDict( dict ) && (n*2)+1 <= dict->val.l.count ) 1330 { 1331 tr_benc * k = dict->val.l.vals + (n*2); 1332 tr_benc * v = dict->val.l.vals + (n*2) + 1; 1333 if(( success = tr_bencGetStr( k, key ) && isSomething( v ))) 1334 *val = v; 1335 } 1336 1337 return success; 1338 } 1339 1340 void 1341 tr_bencMergeDicts( tr_benc * target, const tr_benc * source ) 1342 { 1343 size_t i; 1344 const size_t sourceCount = tr_bencDictSize( source ); 1345 1346 assert( tr_bencIsDict( target ) ); 1347 assert( tr_bencIsDict( source ) ); 1348 1349 for( i=0; i<sourceCount; ++i ) 1350 { 1351 const char * key; 1352 const tr_benc * val; 1353 1354 if( tr_bencDictChild( source, i, &key, &val ) ) 1355 { 1356 int64_t i64; 1357 const char * str; 1358 1359 if( tr_bencGetInt( val, &i64 ) ) 1360 { 1361 tr_bencDictRemove( target, key ); 1362 tr_bencDictAddInt( target, key, i64 ); 1363 } 1364 else if( tr_bencGetStr( val, &str ) ) 1365 { 1366 tr_bencDictRemove( target, key ); 1367 tr_bencDictAddStr( target, key, str ); 1368 } 1369 else 1370 { 1371 tr_err( "tr_bencMergeDicts skipping \"%s\"", key ); 1372 } 1373 } 1374 } 1375 } 1376 1377 /*** 1378 **** 1379 ***/ 1380 1319 1381 static int 1320 1382 saveFile( const char * filename, -
trunk/libtransmission/bencode.h
r6795 r7359 71 71 void tr_bencFree( tr_benc * ); 72 72 73 char* tr_bencSave( const tr_benc * val, 74 int * len ); 73 char* tr_bencSave( const tr_benc * val, int * len ); 75 74 76 char* tr_bencSaveAsJSON( const tr_benc * top, 77 int * len ); 75 char* tr_bencSaveAsJSON( const tr_benc * top, int * len ); 78 76 79 int tr_bencSaveFile( const char * filename, 80 const tr_benc * ); 77 int tr_bencSaveFile( const char * filename, const tr_benc * ); 81 78 82 int tr_bencSaveJSONFile( const char * filename, 83 const tr_benc * ); 79 int tr_bencSaveJSONFile( const char * filename, const tr_benc * ); 84 80 85 void tr_bencInitStr( tr_benc *, 86 const void * str, 87 int str_len ); 81 void tr_bencInitStr( tr_benc *, const void * str, int str_len ); 88 82 89 void tr_bencInitRaw( tr_benc *, 90 const void * raw, 91 size_t raw_len ); 83 void tr_bencInitRaw( tr_benc *, const void * raw, size_t raw_len ); 92 84 93 void tr_bencInitInt( tr_benc *, 94 int64_t num ); 85 void tr_bencInitInt( tr_benc *, int64_t num ); 95 86 96 int tr_bencInitDict( tr_benc *, 97 size_t reserveCount ); 87 int tr_bencInitDict( tr_benc *, size_t reserveCount ); 98 88 99 int tr_bencInitList( tr_benc *, 100 size_t reserveCount ); 89 int tr_bencInitList( tr_benc *, size_t reserveCount ); 101 90 102 91 /*** … … 104 93 ***/ 105 94 106 int tr_bencListReserve( tr_benc *, 107 size_t reserveCount ); 95 int tr_bencListReserve( tr_benc *, size_t reserveCount ); 108 96 109 97 tr_benc * tr_bencListAdd( tr_benc * ); 110 98 111 tr_benc * tr_bencListAddInt( tr_benc *, 112 int64_t val ); 99 tr_benc * tr_bencListAddInt( tr_benc *, int64_t val ); 113 100 114 tr_benc * tr_bencListAddStr( tr_benc *, 115 const char * val ); 101 tr_benc * tr_bencListAddStr( tr_benc *, const char * val ); 116 102 117 tr_benc * tr_bencListAddList( tr_benc *, 118 size_t reserveCount ); 103 tr_benc * tr_bencListAddList( tr_benc *, size_t reserveCount ); 119 104 120 tr_benc * tr_bencListAddDict( tr_benc *, 121 size_t reserveCount ); 105 tr_benc * tr_bencListAddDict( tr_benc *, size_t reserveCount ); 122 106 123 107 size_t tr_bencListSize( const tr_benc * list ); 124 108 125 tr_benc * tr_bencListChild( tr_benc * list, 126 size_t n ); 109 tr_benc * tr_bencListChild( tr_benc * list, size_t n ); 127 110 128 111 /*** … … 130 113 ***/ 131 114 132 int tr_bencDictReserve( tr_benc *, 133 size_t reserveCount ); 115 int tr_bencDictReserve( tr_benc *, size_t reserveCount ); 134 116 135 int tr_bencDictRemove( tr_benc *, 136 const char * key ); 117 int tr_bencDictRemove( tr_benc *, const char * key ); 137 118 138 tr_benc * tr_bencDictAdd( tr_benc *, 139 const char * key ); 119 tr_benc * tr_bencDictAdd( tr_benc *, const char * key ); 140 120 141 tr_benc * tr_bencDictAddDouble( tr_benc *, 142 const char * key, 143 double d ); 121 tr_benc * tr_bencDictAddDouble( tr_benc *, const char * key, double ); 144 122 145 tr_benc * tr_bencDictAddInt( tr_benc *, 146 const char * key, 147 int64_t val ); 123 tr_benc * tr_bencDictAddInt( tr_benc *, const char * key, int64_t ); 148 124 149 tr_benc * tr_bencDictAddStr( tr_benc *, 150 const char * key, 151 const char * val ); 125 tr_benc * tr_bencDictAddStr( tr_benc *, const char * key, const char * ); 152 126 153 tr_benc * tr_bencDictAddList( tr_benc *, 154 const char * key, 155 size_t reserve ); 127 tr_benc * tr_bencDictAddList( tr_benc *, const char * key, size_t reserve ); 156 128 157 tr_benc * tr_bencDictAddDict( tr_benc *, 158 const char * key, 159 size_t reserve ); 129 tr_benc * tr_bencDictAddDict( tr_benc *, const char * key, size_t reserve ); 160 130 161 tr_benc * tr_bencDictAddRaw( tr_benc *, 162 const char * key, 163 const void *, 164 size_t len ); 131 tr_benc * tr_bencDictAddRaw( tr_benc *, const char * key, 132 const void * raw, size_t rawlen ); 165 133 166 tr_benc* tr_bencDictFind( tr_benc *, 167 const char * key ); 134 tr_benc* tr_bencDictFind( tr_benc *, const char * key ); 168 135 169 int tr_bencDictFindList( tr_benc *, 170 const char * key, 171 tr_benc ** setme ); 136 tr_bool tr_bencDictFindList( tr_benc *, const char * key, tr_benc ** setme ); 172 137 173 int tr_bencDictFindDict( tr_benc *, 174 const char * key, 175 tr_benc ** setme ); 138 tr_bool tr_bencDictFindDict( tr_benc *, const char * key, tr_benc ** setme ); 176 139 177 int tr_bencDictFindInt( tr_benc *, 178 const char * key, 179 int64_t * setme ); 140 tr_bool tr_bencDictFindInt( tr_benc *, const char * key, int64_t * setme ); 180 141 181 int tr_bencDictFindDouble( tr_benc *, 182 const char * key, 183 double * setme ); 142 tr_bool tr_bencDictFindDouble( tr_benc *, const char * key, double * setme ); 184 143 185 int tr_bencDictFindStr( tr_benc *, 186 const char * key, 187 const char ** setme ); 144 tr_bool tr_bencDictFindStr( tr_benc *, const char * key, const char ** setme ); 188 145 189 int tr_bencDictFindRaw( tr_benc *, 190 const char * key, 191 const uint8_t ** setme_raw, 192 size_t * setme_len ); 146 tr_bool tr_bencDictFindRaw( tr_benc *, const char * key, 147 const uint8_t ** setme_raw, size_t * setme_len ); 193 148 194 149 /*** … … 196 151 ***/ 197 152 198 int tr_bencGetInt( const tr_benc * val, 199 int64_t * setme ); 153 tr_bool tr_bencGetInt( const tr_benc * val, int64_t * setme ); 200 154 201 int tr_bencGetStr( const tr_benc * val, 202 const char ** setme ); 155 tr_bool tr_bencGetStr( const tr_benc * val, const char ** setme ); 203 156 204 int tr_bencIsType( const tr_benc *, 205 int type ); 157 tr_bool tr_bencIsType( const tr_benc *, int type ); 158 206 159 207 160 #define tr_bencIsInt( b ) tr_bencIsType( ( b ), TYPE_INT ) … … 226 179 size_t * setme_strlen ); 227 180 181 /** 182 *** 183 **/ 184 185 void tr_bencMergeDicts( tr_benc * b1, const tr_benc * b2 ); 186 228 187 #endif
Note: See TracChangeset
for help on using the changeset viewer.