… | |
… | |
504 | |
504 | |
505 | for (;;) |
505 | for (;;) |
506 | { |
506 | { |
507 | WANT (1); |
507 | WANT (1); |
508 | |
508 | |
509 | if (*dec->cur == 0xe0 | 31) |
509 | if (*dec->cur == (0xe0 | 31)) |
510 | { |
510 | { |
511 | ++dec->cur; |
511 | ++dec->cur; |
512 | break; |
512 | break; |
513 | } |
513 | } |
514 | |
514 | |
… | |
… | |
547 | |
547 | |
548 | for (;;) |
548 | for (;;) |
549 | { |
549 | { |
550 | WANT (1); |
550 | WANT (1); |
551 | |
551 | |
552 | if (*dec->cur == 0xe0 | 31) |
552 | if (*dec->cur == (0xe0 | 31)) |
553 | { |
553 | { |
554 | ++dec->cur; |
554 | ++dec->cur; |
555 | break; |
555 | break; |
556 | } |
556 | } |
557 | |
557 | |
… | |
… | |
752 | // not very fast, and certainly not robust against illegal input |
752 | // not very fast, and certainly not robust against illegal input |
753 | for (;;) |
753 | for (;;) |
754 | { |
754 | { |
755 | WANT (1); |
755 | WANT (1); |
756 | |
756 | |
757 | if (*dec->cur == 0xe0 | 31) |
757 | if (*dec->cur == (0xe0 | 31)) |
758 | { |
758 | { |
759 | ++dec->cur; |
759 | ++dec->cur; |
760 | break; |
760 | break; |
761 | } |
761 | } |
762 | |
762 | |
… | |
… | |
820 | return newSVsv (cbor_true); |
820 | return newSVsv (cbor_true); |
821 | case 22: |
821 | case 22: |
822 | return newSVsv (&PL_sv_undef); |
822 | return newSVsv (&PL_sv_undef); |
823 | |
823 | |
824 | case 25: |
824 | case 25: |
825 | // half float |
|
|
826 | abort (); |
|
|
827 | break; |
825 | { |
|
|
826 | WANT (2); |
|
|
827 | |
|
|
828 | uint16_t fp = (dec->cur[0] << 8) | dec->cur[1]; |
|
|
829 | dec->cur += 2; |
|
|
830 | |
|
|
831 | return newSVnv (ecb_binary16_to_float (fp)); |
|
|
832 | } |
828 | |
833 | |
829 | case 26: |
834 | case 26: |
830 | { |
835 | { |
831 | uint32_t fp; |
836 | uint32_t fp; |
832 | WANT (4); |
837 | WANT (4); |
… | |
… | |
975 | |
980 | |
976 | if (offset_return) |
981 | if (offset_return) |
977 | *offset_return = dec.cur; |
982 | *offset_return = dec.cur; |
978 | |
983 | |
979 | if (!(offset_return || !sv)) |
984 | if (!(offset_return || !sv)) |
980 | { |
|
|
981 | if (*dec.cur && !dec.err) |
985 | if (dec.cur != dec.end && !dec.err) |
982 | { |
|
|
983 | dec.err = "garbage after CBOR object"; |
986 | dec.err = "garbage after CBOR object"; |
|
|
987 | |
|
|
988 | if (dec.err) |
|
|
989 | { |
984 | SvREFCNT_dec (sv); |
990 | SvREFCNT_dec (sv); |
985 | sv = 0; |
|
|
986 | } |
|
|
987 | } |
|
|
988 | |
|
|
989 | if (!sv) |
|
|
990 | croak ("%s, at offset %d (octet 0x%02x)", dec.err, dec.cur - (U8 *)SvPVX (string), (int)(uint8_t)*dec.cur); |
991 | croak ("%s, at offset %d (octet 0x%02x)", dec.err, dec.cur - (U8 *)SvPVX (string), (int)(uint8_t)*dec.cur); |
|
|
992 | } |
991 | |
993 | |
992 | sv = sv_2mortal (sv); |
994 | sv = sv_2mortal (sv); |
993 | |
995 | |
994 | return sv; |
996 | return sv; |
995 | } |
997 | } |