Changeset 13669
- Timestamp:
- Dec 14, 2012, 4:04:44 PM (10 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/variant-benc.c
r13667 r13669 50 50 int64_t * setme_val) 51 51 { 52 char *endptr;53 54 55 int64_tval;56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 52 char * endptr; 53 const void * begin; 54 const void * end; 55 int64_t val; 56 57 if (buf >= bufend) 58 return EILSEQ; 59 if (*buf != 'i') 60 return EILSEQ; 61 62 begin = buf + 1; 63 end = memchr (begin, 'e', (bufend - buf) - 1); 64 if (end == NULL) 65 return EILSEQ; 66 67 errno = 0; 68 val = evutil_strtoll (begin, &endptr, 10); 69 if (errno || (endptr != end)) /* incomplete parse */ 70 return EILSEQ; 71 if (val && * (const char*)begin == '0') /* no leading zeroes! */ 72 return EILSEQ; 73 74 *setme_end = (const uint8_t*)end + 1; 75 *setme_val = val; 76 return 0; 77 77 } 78 78 … … 90 90 size_t * setme_strlen) 91 91 { 92 size_tlen;93 94 char *endptr;95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 92 size_t len; 93 const void * end; 94 char * endptr; 95 96 if (buf >= bufend) 97 return EILSEQ; 98 99 if (!isdigit (*buf)) 100 return EILSEQ; 101 102 end = memchr (buf, ':', bufend - buf); 103 if (end == NULL) 104 return EILSEQ; 105 106 errno = 0; 107 len = strtoul ((const char*)buf, &endptr, 10); 108 if (errno || endptr != end) 109 return EILSEQ; 110 111 if ((const uint8_t*)end + 1 + len > bufend) 112 return EILSEQ; 113 114 *setme_end = (const uint8_t*)end + 1 + len; 115 *setme_str = (const uint8_t*)end + 1; 116 *setme_strlen = len; 117 return 0; 118 118 } 119 119 … … 151 151 int type) 152 152 { 153 154 155 156 157 158 159 160 161 162 163 164 165 153 tr_variant * parent; 154 155 assert (top); 156 assert (parentStack); 157 158 if (tr_ptrArrayEmpty (parentStack)) 159 return top; 160 161 parent = tr_ptrArrayBack (parentStack); 162 assert (parent); 163 164 /* dictionary keys must be strings */ 165 if ((parent->type == TR_VARIANT_TYPE_DICT) 166 166 && (type != TR_VARIANT_TYPE_STR) 167 167 && (! (parent->val.l.count % 2))) 168 169 170 171 168 return NULL; 169 170 makeroom (parent, 1); 171 return parent->val.l.vals + parent->val.l.count++; 172 172 } 173 173 … … 184 184 const char ** setme_end) 185 185 { 186 interr;187 188 189 190 191 192 186 int err; 187 const uint8_t * buf = buf_in; 188 const uint8_t * bufend = bufend_in; 189 190 tr_variantInit (top, 0); 191 192 while (buf != bufend) 193 193 { 194 if (buf > bufend) /* no more text to parse... */ 195 return 1; 196 197 if (*buf == 'i') /* int */ 198 { 199 int64_t val; 200 const uint8_t * end; 201 tr_variant * node; 202 203 if ((err = tr_bencParseInt (buf, bufend, &end, &val))) 204 return err; 205 206 node = getNode (top, parentStack, TR_VARIANT_TYPE_INT); 207 if (!node) 208 return EILSEQ; 209 210 tr_variantInitInt (node, val); 211 buf = end; 212 213 if (tr_ptrArrayEmpty (parentStack)) 214 break; 215 } 216 else if (*buf == 'l') /* list */ 217 { 218 tr_variant * node = getNode (top, parentStack, TR_VARIANT_TYPE_LIST); 219 if (!node) 220 return EILSEQ; 221 tr_variantInit (node, TR_VARIANT_TYPE_LIST); 222 tr_ptrArrayAppend (parentStack, node); 223 ++buf; 224 } 225 else if (*buf == 'd') /* dict */ 226 { 227 tr_variant * node = getNode (top, parentStack, TR_VARIANT_TYPE_DICT); 228 if (!node) 229 return EILSEQ; 230 tr_variantInit (node, TR_VARIANT_TYPE_DICT); 231 tr_ptrArrayAppend (parentStack, node); 232 ++buf; 233 } 234 else if (*buf == 'e') /* end of list or dict */ 235 { 236 tr_variant * node; 237 ++buf; 238 if (tr_ptrArrayEmpty (parentStack)) 239 return EILSEQ; 240 241 node = tr_ptrArrayBack (parentStack); 242 if (tr_variantIsDict (node) && (node->val.l.count % 2)) 194 if (buf > bufend) /* no more text to parse... */ 195 return 1; 196 197 if (*buf == 'i') /* int */ 198 { 199 int64_t val; 200 const uint8_t * end; 201 tr_variant * node; 202 203 if ((err = tr_bencParseInt (buf, bufend, &end, &val))) 204 return err; 205 206 node = getNode (top, parentStack, TR_VARIANT_TYPE_INT); 207 if (!node) 208 return EILSEQ; 209 210 tr_variantInitInt (node, val); 211 buf = end; 212 213 if (tr_ptrArrayEmpty (parentStack)) 214 break; 215 } 216 else if (*buf == 'l') /* list */ 217 { 218 tr_variant * node = getNode (top, parentStack, TR_VARIANT_TYPE_LIST); 219 if (!node) 220 return EILSEQ; 221 222 tr_variantInit (node, TR_VARIANT_TYPE_LIST); 223 tr_ptrArrayAppend (parentStack, node); 224 ++buf; 225 } 226 else if (*buf == 'd') /* dict */ 227 { 228 tr_variant * node = getNode (top, parentStack, TR_VARIANT_TYPE_DICT); 229 if (!node) 230 return EILSEQ; 231 232 tr_variantInit (node, TR_VARIANT_TYPE_DICT); 233 tr_ptrArrayAppend (parentStack, node); 234 ++buf; 235 } 236 else if (*buf == 'e') /* end of list or dict */ 237 { 238 tr_variant * node; 239 ++buf; 240 if (tr_ptrArrayEmpty (parentStack)) 241 return EILSEQ; 242 243 node = tr_ptrArrayBack (parentStack); 244 if (tr_variantIsDict (node) && (node->val.l.count % 2)) 243 245 { 244 245 246 246 /* odd # of children in dict */ 247 tr_variantFree (&node->val.l.vals[--node->val.l.count]); 248 return EILSEQ; 247 249 } 248 250 249 250 251 252 } 253 254 { 255 256 257 size_tstr_len;258 tr_variant *node;259 260 261 262 263 264 265 266 267 268 269 270 271 272 } 273 274 { 275 251 tr_ptrArrayPop (parentStack); 252 if (tr_ptrArrayEmpty (parentStack)) 253 break; 254 } 255 else if (isdigit (*buf)) /* string? */ 256 { 257 const uint8_t * end; 258 const uint8_t * str; 259 size_t str_len; 260 tr_variant * node; 261 262 if ((err = tr_bencParseStr (buf, bufend, &end, &str, &str_len))) 263 return err; 264 265 node = getNode (top, parentStack, TR_VARIANT_TYPE_STR); 266 if (!node) 267 return EILSEQ; 268 269 tr_variantInitStr (node, str, str_len); 270 buf = end; 271 272 if (tr_ptrArrayEmpty (parentStack)) 273 break; 274 } 275 else /* invalid bencoded text... march past it */ 276 { 277 ++buf; 276 278 } 277 279 } 278 280 279 280 281 282 283 284 281 err = !tr_variantIsSomething (top) || !tr_ptrArrayEmpty (parentStack); 282 283 if (!err && setme_end) 284 *setme_end = (const char*) buf; 285 286 return err; 285 287 } 286 288 -
trunk/libtransmission/variant-json.c
r13667 r13669 147 147 } 148 148 149 /* so sscanf(in+2, "%4x", &val) was showing up at the top of the profiler... *shrug**/149 /* like sscanf(in+2, "%4x", &val) but less slow */ 150 150 static bool 151 151 decode_hex_string (const char * in, unsigned int * setme) … … 343 343 ****/ 344 344 345 /** @brief Implementation helper class for tr_variantToBuffer (TR_VARIANT_FMT_JSON) */346 345 struct ParentState 347 346 { … … 351 350 }; 352 351 353 /** @brief Implementation helper class for tr_variantToBuffer (TR_VARIANT_FMT_JSON) */354 352 struct jsonWalk 355 353 { … … 378 376 if (data->parents && data->parents->data) 379 377 { 380 struct ParentState * p arentState = data->parents->data;381 382 switch (p arentState->bencType)378 struct ParentState * pstate = data->parents->data; 379 380 switch (pstate->bencType) 383 381 { 384 382 case TR_VARIANT_TYPE_DICT: 385 383 { 386 const int i = p arentState->childIndex++;384 const int i = pstate->childIndex++; 387 385 if (! (i % 2)) 388 386 { … … 391 389 else 392 390 { 393 const bool isLast = p arentState->childIndex == parentState->childCount;391 const bool isLast = pstate->childIndex == pstate->childCount; 394 392 395 393 if (!isLast) … … 404 402 case TR_VARIANT_TYPE_LIST: 405 403 { 406 const bool isLast = ++p arentState->childIndex == parentState->childCount;404 const bool isLast = ++pstate->childIndex == pstate->childCount; 407 405 if (!isLast) 408 406 { … … 423 421 const tr_variant * benc) 424 422 { 425 struct ParentState * p arentState = tr_new (struct ParentState, 1);426 427 p arentState->bencType = benc->type;428 p arentState->childIndex = 0;429 p arentState->childCount = benc->val.l.count;430 tr_list_prepend (&data->parents, p arentState);423 struct ParentState * pstate = tr_new (struct ParentState, 1); 424 425 pstate->bencType = benc->type; 426 pstate->childIndex = 0; 427 pstate->childCount = benc->val.l.count; 428 tr_list_prepend (&data->parents, pstate); 431 429 } 432 430 -
trunk/libtransmission/variant.c
r13668 r13669 12 12 13 13 #include <assert.h> 14 #include <ctype.h> /* isdigit () */15 14 #include <errno.h> 16 15 #include <stdio.h> /* rename () */ … … 72 71 * this occurs when the string is too long for our string buffer */ 73 72 static inline int 74 stringIsAlloced (const tr_variant * va l)75 { 76 return va l->val.s.len >= sizeof (val->val.s.str.buf);73 stringIsAlloced (const tr_variant * variant) 74 { 75 return variant->val.s.len >= sizeof (variant->val.s.str.buf); 77 76 } 78 77 79 78 /* returns a const pointer to the variant's string */ 80 79 static inline const char* 81 getStr (const tr_variant* val) 82 { 83 return stringIsAlloced (val) ? val->val.s.str.ptr : val->val.s.str.buf; 80 getStr (const tr_variant* variant) 81 { 82 return stringIsAlloced (variant) ? variant->val.s.str.ptr 83 : variant->val.s.str.buf; 84 84 } 85 85 86 86 static int 87 dictIndexOf (const tr_variant * val, const char * key)88 { 89 if (tr_variantIsDict ( val))87 dictIndexOf (const tr_variant * dict, const char * key) 88 { 89 if (tr_variantIsDict (dict)) 90 90 { 91 91 size_t i; 92 92 const size_t len = strlen (key); 93 93 94 for (i=0; (i+1) < val->val.l.count; i += 2)95 { 96 const tr_variant * child = val->val.l.vals + i;94 for (i=0; (i+1) < dict->val.l.count; i += 2) 95 { 96 const tr_variant * child = dict->val.l.vals + i; 97 97 if ((child->type == TR_VARIANT_TYPE_STR) 98 98 && (child->val.s.len == len) … … 106 106 107 107 tr_variant * 108 tr_variantDictFind (tr_variant * val,108 tr_variantDictFind (tr_variant * dict, 109 109 const char * key) 110 110 { 111 const int i = dictIndexOf ( val, key);112 113 return i < 0 ? NULL : & val->val.l.vals[i + 1];111 const int i = dictIndexOf (dict, key); 112 113 return i < 0 ? NULL : &dict->val.l.vals[i + 1]; 114 114 } 115 115 … … 126 126 tr_variantListSize (const tr_variant * list) 127 127 { 128 128 return tr_variantIsList (list) ? list->val.l.count : 0; 129 129 } 130 130 … … 133 133 size_t i) 134 134 { 135 tr_variant * ret = NULL; 136 137 if (tr_variantIsList (val) && (i < val->val.l.count)) 138 ret = val->val.l.vals + i; 139 return ret; 135 tr_variant * ret = NULL; 136 137 if (tr_variantIsList (val) && (i < val->val.l.count)) 138 ret = val->val.l.vals + i; 139 140 return ret; 140 141 } 141 142 … … 146 147 { 147 148 tr_variantFree (&list->val.l.vals[i]); 148 tr_removeElementFromArray (list->val.l.vals, i, sizeof (tr_variant), list->val.l.count--); 149 tr_removeElementFromArray (list->val.l.vals, i, 150 sizeof (tr_variant), 151 list->val.l.count--); 149 152 return 1; 150 153 } … … 335 338 336 339 void 337 tr_variantInitRaw (tr_variant * va l, const void * src, size_t byteCount)340 tr_variantInitRaw (tr_variant * variant, const void * src, size_t byteCount) 338 341 { 339 342 char * setme; 340 tr_variantInit (va l, TR_VARIANT_TYPE_STR);343 tr_variantInit (variant, TR_VARIANT_TYPE_STR); 341 344 342 345 /* There's no way in benc notation to distinguish between … … 346 349 * Append one, een to the raw arrays, just to be safe. */ 347 350 348 if (byteCount < sizeof (va l->val.s.str.buf))349 setme = va l->val.s.str.buf;351 if (byteCount < sizeof (variant->val.s.str.buf)) 352 setme = variant->val.s.str.buf; 350 353 else 351 setme = va l->val.s.str.ptr = tr_new (char, byteCount + 1);354 setme = variant->val.s.str.ptr = tr_new (char, byteCount + 1); 352 355 353 356 memcpy (setme, src, byteCount); 354 357 setme[byteCount] = '\0'; 355 va l->val.s.len = byteCount;358 variant->val.s.len = byteCount; 356 359 } 357 360 358 361 void 359 tr_variantInitStr (tr_variant * va l, const void * str, int len)362 tr_variantInitStr (tr_variant * variant, const void * str, int len) 360 363 { 361 364 if (str == NULL) … … 364 367 len = strlen (str); 365 368 366 tr_variantInitRaw (va l, str, len);369 tr_variantInitRaw (variant, str, len); 367 370 } 368 371 369 372 void 370 tr_variantInitBool (tr_variant * b, bool value)371 { 372 tr_variantInit ( b, TR_VARIANT_TYPE_BOOL);373 b->val.b = value != 0;373 tr_variantInitBool (tr_variant * variant, bool value) 374 { 375 tr_variantInit (variant, TR_VARIANT_TYPE_BOOL); 376 variant->val.b = value != 0; 374 377 } 375 378 … … 382 385 383 386 void 384 tr_variantInitInt (tr_variant * b, int64_t value)385 { 386 tr_variantInit ( b, TR_VARIANT_TYPE_INT);387 b->val.i = value;387 tr_variantInitInt (tr_variant * variant, int64_t value) 388 { 389 tr_variantInit (variant, TR_VARIANT_TYPE_INT); 390 variant->val.i = value; 388 391 } 389 392 390 393 int 391 tr_variantInitList (tr_variant * b, size_t reserve_count)392 { 393 tr_variantInit ( b, TR_VARIANT_TYPE_LIST);394 return tr_variantListReserve ( b, reserve_count);394 tr_variantInitList (tr_variant * variant, size_t reserve_count) 395 { 396 tr_variantInit (variant, TR_VARIANT_TYPE_LIST); 397 return tr_variantListReserve (variant, reserve_count); 395 398 } 396 399 397 400 static int 398 makeroom(tr_variant * container, size_t count)401 containerReserve (tr_variant * container, size_t count) 399 402 { 400 403 const size_t needed = container->val.l.count + count; … … 424 427 425 428 int 426 tr_variantListReserve (tr_variant * b, size_t count)427 { 428 assert (tr_variantIsList ( b));429 return makeroom (b, count);429 tr_variantListReserve (tr_variant * list, size_t count) 430 { 431 assert (tr_variantIsList (list)); 432 return containerReserve (list, count); 430 433 } 431 434 432 435 int 433 tr_variantInitDict (tr_variant * b, size_t reserve_count)434 { 435 tr_variantInit ( b, TR_VARIANT_TYPE_DICT);436 return tr_variantDictReserve ( b, reserve_count);436 tr_variantInitDict (tr_variant * variant, size_t reserve_count) 437 { 438 tr_variantInit (variant, TR_VARIANT_TYPE_DICT); 439 return tr_variantDictReserve (variant, reserve_count); 437 440 } 438 441 439 442 int 440 tr_variantDictReserve (tr_variant * b, size_t reserve_count) 441 { 442 assert (tr_variantIsDict (b)); 443 return makeroom (b, reserve_count * 2); 443 tr_variantDictReserve (tr_variant * dict, 444 size_t reserve_count) 445 { 446 assert (tr_variantIsDict (dict)); 447 return containerReserve (dict, reserve_count * 2); 444 448 } 445 449 … … 447 451 tr_variantListAdd (tr_variant * list) 448 452 { 449 tr_variant * item;453 tr_variant * child; 450 454 451 455 assert (tr_variantIsList (list)); 452 456 453 if (list->val.l.count == list->val.l.alloc) 454 tr_variantListReserve (list, 4); 455 456 assert (list->val.l.count < list->val.l.alloc); 457 458 item = &list->val.l.vals[list->val.l.count]; 459 list->val.l.count++; 460 tr_variantInit (item, TR_VARIANT_TYPE_INT); 461 462 return item; 457 containerReserve (list, 1); 458 child = &list->val.l.vals[list->val.l.count++]; 459 tr_variantInit (child, TR_VARIANT_TYPE_INT); 460 461 return child; 463 462 } 464 463 465 464 tr_variant * 466 tr_variantListAddInt (tr_variant * list, int64_t val) 467 { 468 tr_variant * node = tr_variantListAdd (list); 469 tr_variantInitInt (node, val); 470 return node; 465 tr_variantListAddInt (tr_variant * list, 466 int64_t val) 467 { 468 tr_variant * child = tr_variantListAdd (list); 469 tr_variantInitInt (child, val); 470 return child; 471 471 } 472 472 473 473 tr_variant * 474 tr_variantListAddReal (tr_variant * list, double val) 475 { 476 tr_variant * node = tr_variantListAdd (list); 477 tr_variantInitReal (node, val); 478 return node; 474 tr_variantListAddReal (tr_variant * list, 475 double val) 476 { 477 tr_variant * child = tr_variantListAdd (list); 478 tr_variantInitReal (child, val); 479 return child; 479 480 } 480 481 481 482 tr_variant * 482 tr_variantListAddBool (tr_variant * list, bool val) 483 { 484 tr_variant * node = tr_variantListAdd (list); 485 tr_variantInitBool (node, val); 486 return node; 483 tr_variantListAddBool (tr_variant * list, 484 bool val) 485 { 486 tr_variant * child = tr_variantListAdd (list); 487 tr_variantInitBool (child, val); 488 return child; 487 489 } 488 490 489 491 tr_variant * 490 tr_variantListAddStr (tr_variant * list, const char * val) 491 { 492 tr_variant * node = tr_variantListAdd (list); 493 tr_variantInitStr (node, val, -1); 494 return node; 492 tr_variantListAddStr (tr_variant * list, 493 const char * val) 494 { 495 tr_variant * child = tr_variantListAdd (list); 496 tr_variantInitStr (child, val, -1); 497 return child; 495 498 } 496 499 497 500 tr_variant * 498 tr_variantListAddRaw (tr_variant * list, const void * val, size_t len) 499 { 500 tr_variant * node = tr_variantListAdd (list); 501 tr_variantInitRaw (node, val, len); 502 return node; 501 tr_variantListAddRaw (tr_variant * list, 502 const void * val, 503 size_t len) 504 { 505 tr_variant * child = tr_variantListAdd (list); 506 tr_variantInitRaw (child, val, len); 507 return child; 503 508 } 504 509 … … 525 530 const char * key) 526 531 { 527 tr_variant * keyval;528 tr_variant * itemval;532 tr_variant * child_key; 533 tr_variant * child_val; 529 534 530 535 assert (tr_variantIsDict (dict)); 531 if (dict->val.l.count + 2 > dict->val.l.alloc) 532 makeroom (dict, 2); 533 assert (dict->val.l.count + 2 <= dict->val.l.alloc); 534 535 keyval = dict->val.l.vals + dict->val.l.count++; 536 tr_variantInitStr (keyval, key, -1); 537 538 itemval = dict->val.l.vals + dict->val.l.count++; 539 tr_variantInit (itemval, TR_VARIANT_TYPE_INT); 540 541 return itemval; 536 537 containerReserve (dict, 2); 538 539 child_key = dict->val.l.vals + dict->val.l.count++; 540 tr_variantInitStr (child_key, key, -1); 541 542 child_val = dict->val.l.vals + dict->val.l.count++; 543 tr_variantInit (child_val, TR_VARIANT_TYPE_INT); 544 return child_val; 542 545 } 543 546 … … 590 593 } 591 594 592 tr_variant*593 tr_variantDictAddStr (tr_variant * dict, const char * key, const char * val)595 static tr_variant * 596 dictRecycleOrAdd (tr_variant * dict, const char * key) 594 597 { 595 598 tr_variant * child; … … 614 617 child = tr_variantDictAdd (dict, key); 615 618 616 /* set it */ 619 return child; 620 } 621 622 623 tr_variant* 624 tr_variantDictAddStr (tr_variant * dict, const char * key, const char * val) 625 { 626 tr_variant * child = dictRecycleOrAdd (dict, key); 617 627 tr_variantInitStr (child, val, -1); 618 619 628 return child; 620 629 } … … 626 635 size_t len) 627 636 { 628 tr_variant * child; 629 630 /* see if it already exists, and if so, try to reuse it */ 631 if ((child = tr_variantDictFind (dict, key))) 632 { 633 if (tr_variantIsString (child)) 634 { 635 if (stringIsAlloced (child)) 636 tr_free (child->val.s.str.ptr); 637 } 638 else 639 { 640 tr_variantDictRemove (dict, key); 641 child = NULL; 642 } 643 } 644 645 /* if it doesn't exist, create it */ 646 if (child == NULL) 647 child = tr_variantDictAdd (dict, key); 648 649 /* set it */ 637 tr_variant * child = dictRecycleOrAdd (dict, key); 650 638 tr_variantInitRaw (child, src, len); 651 652 639 return child; 653 640 } … … 724 711 725 712 static void 726 nodeInitDict (struct SaveNode * node, const tr_variant * val, bool sort_dicts) 713 nodeInitDict (struct SaveNode * node, 714 const tr_variant * val, 715 bool sort_dicts) 727 716 { 728 717 const int n = val->val.l.count; … … 768 757 769 758 static void 770 nodeInitList (struct SaveNode * node, const tr_variant * val) 759 nodeInitList (struct SaveNode * node, 760 const tr_variant * val) 771 761 { 772 762 int i; … … 784 774 785 775 static void 786 nodeInitLeaf (struct SaveNode * node, const tr_variant * val) 787 { 788 assert (!tr_variantIsContainer (val)); 789 790 node->val = val; 776 nodeInitLeaf (struct SaveNode * node, 777 const tr_variant * variant) 778 { 779 assert (!tr_variantIsContainer (variant)); 780 781 node->val = variant; 791 782 } 792 783 793 784 static void 794 nodeInit (struct SaveNode * node, const tr_variant * val, bool sort_dicts) 785 nodeInit (struct SaveNode * node, 786 const tr_variant * variant, 787 bool sort_dicts) 795 788 { 796 789 static const struct SaveNode INIT_NODE = { NULL, 0, 0, 0, NULL }; … … 798 791 *node = INIT_NODE; 799 792 800 if (tr_variantIsList (va l))801 nodeInitList (node, va l);802 else if (tr_variantIsDict (va l))803 nodeInitDict (node, va l, sort_dicts);793 if (tr_variantIsList (variant)) 794 nodeInitList (node, variant); 795 else if (tr_variantIsDict (variant)) 796 nodeInitDict (node, variant, sort_dicts); 804 797 else 805 nodeInitLeaf (node, va l);798 nodeInitLeaf (node, variant); 806 799 } 807 800 … … 975 968 else if (tr_variantIsString (val)) 976 969 { 977 tr_variantListAddRaw (target, (const uint8_t*)getStr (val), val->val.s.len); 970 size_t len; 971 const char * str; 972 tr_variantGetStr (val, &str, &len); 973 tr_variantListAddRaw (target, str, len); 978 974 } 979 975 else if (tr_variantIsDict (val)) … … 1004 1000 1005 1001 bool 1006 tr_variantDictChild (tr_variant * dict, size_t n, const char ** key, tr_variant ** val) 1002 tr_variantDictChild (tr_variant * dict, 1003 size_t n, 1004 const char ** key, 1005 tr_variant ** val) 1007 1006 { 1008 1007 bool success = 0; … … 1060 1059 else if (tr_variantIsString (val)) 1061 1060 { 1062 tr_variantDictAddRaw (target, key, getStr (val), val->val.s.len); 1061 size_t len; 1062 const char * str; 1063 tr_variantGetStr (val, &str, &len); 1064 tr_variantDictAddRaw (target, key, str, len); 1063 1065 } 1064 1066 else if (tr_variantIsDict (val) && tr_variantDictFindDict (target, key, &t)) … … 1144 1146 1145 1147 int 1146 tr_variantToFile (const tr_variant * top, tr_variant_fmt fmt, const char * filename) 1148 tr_variantToFile (const tr_variant * top, 1149 tr_variant_fmt fmt, 1150 const char * filename) 1147 1151 { 1148 1152 char * tmp; … … 1196 1200 else 1197 1201 { 1198 //tr_fsync (fd);1199 1202 tr_close_file (fd); 1200 1203 … … 1230 1233 1231 1234 int 1232 tr_variantFromFile (tr_variant * setme, tr_variant_fmt fmt, const char * filename) 1235 tr_variantFromFile (tr_variant * setme, 1236 tr_variant_fmt fmt, 1237 const char * filename) 1233 1238 { 1234 1239 int err;
Note: See TracChangeset
for help on using the changeset viewer.