ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CBOR-XS/XS.xs
(Generate patch)

Comparing CBOR-XS/XS.xs (file contents):
Revision 1.35 by root, Sat Nov 30 17:19:34 2013 UTC vs.
Revision 1.36 by root, Sat Nov 30 17:37:45 2013 UTC

228{ 228{
229 need (enc, 9); 229 need (enc, 9);
230 230
231 if (ecb_expect_true (len < LENGTH_EXT1)) 231 if (ecb_expect_true (len < LENGTH_EXT1))
232 *enc->cur++ = major | len; 232 *enc->cur++ = major | len;
233 else if (ecb_expect_true (len <= 0xff)) 233 else if (ecb_expect_true (len <= 0xffU))
234 { 234 {
235 *enc->cur++ = major | LENGTH_EXT1; 235 *enc->cur++ = major | LENGTH_EXT1;
236 *enc->cur++ = len; 236 *enc->cur++ = len;
237 } 237 }
238 else if (len <= 0xffff) 238 else if (len <= 0xffffU)
239 { 239 {
240 *enc->cur++ = major | LENGTH_EXT2; 240 *enc->cur++ = major | LENGTH_EXT2;
241 *enc->cur++ = len >> 8; 241 *enc->cur++ = len >> 8;
242 *enc->cur++ = len; 242 *enc->cur++ = len;
243 } 243 }
244 else if (len <= 0xffffffff) 244 else if (len <= 0xffffffffU)
245 { 245 {
246 *enc->cur++ = major | LENGTH_EXT4; 246 *enc->cur++ = major | LENGTH_EXT4;
247 *enc->cur++ = len >> 24; 247 *enc->cur++ = len >> 24;
248 *enc->cur++ = len >> 16; 248 *enc->cur++ = len >> 16;
249 *enc->cur++ = len >> 8; 249 *enc->cur++ = len >> 8;
627 U8 m = *dec->cur & MINOR_MASK; 627 U8 m = *dec->cur & MINOR_MASK;
628 ++dec->cur; 628 ++dec->cur;
629 629
630 if (ecb_expect_true (m < LENGTH_EXT1)) 630 if (ecb_expect_true (m < LENGTH_EXT1))
631 return m; 631 return m;
632 632 else if (ecb_expect_true (m == LENGTH_EXT1))
633 switch (m)
634 { 633 {
635 case LENGTH_EXT1:
636 WANT (1); 634 WANT (1);
637 dec->cur += 1; 635 dec->cur += 1;
638 return dec->cur[-1]; 636 return dec->cur[-1];
639 637 }
640 case LENGTH_EXT2: 638 else if (ecb_expect_true (m == LENGTH_EXT2))
639 {
641 WANT (2); 640 WANT (2);
642 dec->cur += 2; 641 dec->cur += 2;
643 return (((UV)dec->cur[-2]) << 8) 642 return (((UV)dec->cur[-2]) << 8)
644 | ((UV)dec->cur[-1]); 643 | ((UV)dec->cur[-1]);
645 644 }
646 case LENGTH_EXT4: 645 else if (ecb_expect_true (m == LENGTH_EXT4))
646 {
647 WANT (4); 647 WANT (4);
648 dec->cur += 4; 648 dec->cur += 4;
649 return (((UV)dec->cur[-4]) << 24) 649 return (((UV)dec->cur[-4]) << 24)
650 | (((UV)dec->cur[-3]) << 16) 650 | (((UV)dec->cur[-3]) << 16)
651 | (((UV)dec->cur[-2]) << 8) 651 | (((UV)dec->cur[-2]) << 8)
652 | ((UV)dec->cur[-1]); 652 | ((UV)dec->cur[-1]);
653 653 }
654 case LENGTH_EXT8: 654 else if (ecb_expect_true (m == LENGTH_EXT8))
655 {
655 WANT (8); 656 WANT (8);
656 dec->cur += 8; 657 dec->cur += 8;
657 658
658 return 659 return
659#if UVSIZE < 8 660#if UVSIZE < 8
660 0 661 0
661#else 662#else
662 (((UV)dec->cur[-8]) << 56) 663 (((UV)dec->cur[-8]) << 56)
663 | (((UV)dec->cur[-7]) << 48) 664 | (((UV)dec->cur[-7]) << 48)
664 | (((UV)dec->cur[-6]) << 40) 665 | (((UV)dec->cur[-6]) << 40)
665 | (((UV)dec->cur[-5]) << 32) 666 | (((UV)dec->cur[-5]) << 32)
666#endif 667#endif
667 | (((UV)dec->cur[-4]) << 24) 668 | (((UV)dec->cur[-4]) << 24)
668 | (((UV)dec->cur[-3]) << 16) 669 | (((UV)dec->cur[-3]) << 16)
669 | (((UV)dec->cur[-2]) << 8) 670 | (((UV)dec->cur[-2]) << 8)
670 | ((UV)dec->cur[-1]); 671 | ((UV)dec->cur[-1]);
671 672 }
672 default: 673 else
673 ERR ("corrupted CBOR data (unsupported integer minor encoding)"); 674 ERR ("corrupted CBOR data (unsupported integer minor encoding)");
674 }
675 675
676fail: 676fail:
677 return 0; 677 return 0;
678} 678}
679 679
705 } 705 }
706 else 706 else
707 { 707 {
708 int i, len = decode_uint (dec); 708 int i, len = decode_uint (dec);
709 709
710 WANT (len); // complexity check for av_fill - need at least one byte per value, do not allow supersize arrays
710 av_fill (av, len - 1); 711 av_fill (av, len - 1);
711 712
712 for (i = 0; i < len; ++i) 713 for (i = 0; i < len; ++i)
713 AvARRAY (av)[i] = decode_sv (dec); 714 AvARRAY (av)[i] = decode_sv (dec);
714 } 715 }
727{ 728{
728 // for speed reasons, we specialcase single-string 729 // for speed reasons, we specialcase single-string
729 // byte or utf-8 strings as keys, but only when !stringref 730 // byte or utf-8 strings as keys, but only when !stringref
730 731
731 if (ecb_expect_true (!dec->stringref)) 732 if (ecb_expect_true (!dec->stringref))
732 if ((*dec->cur - MAJOR_BYTES) <= 27) 733 if (ecb_expect_true ((*dec->cur - MAJOR_BYTES) <= LENGTH_EXT8))
733 { 734 {
734 I32 len = decode_uint (dec); 735 I32 len = decode_uint (dec);
735 char *key = (char *)dec->cur; 736 char *key = (char *)dec->cur;
736 737
737 dec->cur += len; 738 dec->cur += len;
741 742
742 hv_store (hv, key, len, decode_sv (dec), 0); 743 hv_store (hv, key, len, decode_sv (dec), 0);
743 744
744 return; 745 return;
745 } 746 }
746 else if ((*dec->cur - MAJOR_TEXT) <= 27) 747 else if (ecb_expect_true ((*dec->cur - MAJOR_TEXT) <= LENGTH_EXT8))
747 { 748 {
748 I32 len = decode_uint (dec); 749 I32 len = decode_uint (dec);
749 char *key = (char *)dec->cur; 750 char *key = (char *)dec->cur;
750 751
751 dec->cur += len; 752 dec->cur += len;
1288 cbor_free (self); 1289 cbor_free (self);
1289 1290
1290PROTOTYPES: ENABLE 1291PROTOTYPES: ENABLE
1291 1292
1292void encode_cbor (SV *scalar) 1293void encode_cbor (SV *scalar)
1294 ALIAS:
1295 encode_cbor = 0
1296 encode_cbor_sharing = F_ALLOW_SHARING
1293 PPCODE: 1297 PPCODE:
1294{ 1298{
1295 CBOR cbor; 1299 CBOR cbor;
1296 cbor_init (&cbor); 1300 cbor_init (&cbor);
1301 cbor.flags |= ix;
1297 PUTBACK; scalar = encode_cbor (scalar, &cbor); SPAGAIN; 1302 PUTBACK; scalar = encode_cbor (scalar, &cbor); SPAGAIN;
1298 XPUSHs (scalar); 1303 XPUSHs (scalar);
1299} 1304}
1300 1305
1301void decode_cbor (SV *cborstr) 1306void decode_cbor (SV *cborstr)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines