… | |
… | |
8 | #include <stdio.h> |
8 | #include <stdio.h> |
9 | #include <limits.h> |
9 | #include <limits.h> |
10 | #include <float.h> |
10 | #include <float.h> |
11 | |
11 | |
12 | #include "ecb.h" |
12 | #include "ecb.h" |
13 | |
|
|
14 | #if defined(__BORLANDC__) || defined(_MSC_VER) |
|
|
15 | # define snprintf _snprintf // C compilers have this in stdio.h |
|
|
16 | #endif |
|
|
17 | |
13 | |
18 | #define F_SHRINK 0x00000200UL |
14 | #define F_SHRINK 0x00000200UL |
19 | #define F_ALLOW_UNKNOWN 0x00002000UL |
15 | #define F_ALLOW_UNKNOWN 0x00002000UL |
20 | |
16 | |
21 | #define INIT_SIZE 32 // initial scalar size to be allocated |
17 | #define INIT_SIZE 32 // initial scalar size to be allocated |
… | |
… | |
138 | { |
134 | { |
139 | need (enc, 9); |
135 | need (enc, 9); |
140 | |
136 | |
141 | if (len < 24) |
137 | if (len < 24) |
142 | *enc->cur++ = major | len; |
138 | *enc->cur++ = major | len; |
143 | else if (len < 0x100) |
139 | else if (len <= 0xff) |
144 | { |
140 | { |
145 | *enc->cur++ = major | 24; |
141 | *enc->cur++ = major | 24; |
146 | *enc->cur++ = len; |
142 | *enc->cur++ = len; |
147 | } |
143 | } |
148 | else if (len < 0x10000) |
144 | else if (len <= 0xffff) |
149 | { |
145 | { |
150 | *enc->cur++ = major | 25; |
146 | *enc->cur++ = major | 25; |
151 | *enc->cur++ = len >> 8; |
147 | *enc->cur++ = len >> 8; |
152 | *enc->cur++ = len; |
148 | *enc->cur++ = len; |
153 | } |
149 | } |
154 | else if (len < 0x100000000) |
150 | else if (len <= 0xffffffff) |
155 | { |
151 | { |
156 | *enc->cur++ = major | 26; |
152 | *enc->cur++ = major | 26; |
157 | *enc->cur++ = len >> 24; |
153 | *enc->cur++ = len >> 24; |
158 | *enc->cur++ = len >> 16; |
154 | *enc->cur++ = len >> 16; |
159 | *enc->cur++ = len >> 8; |
155 | *enc->cur++ = len >> 8; |
160 | *enc->cur++ = len; |
156 | *enc->cur++ = len; |
161 | } |
157 | } |
162 | else if (len) |
158 | else |
163 | { |
159 | { |
164 | *enc->cur++ = major | 27; |
160 | *enc->cur++ = major | 27; |
165 | *enc->cur++ = len >> 56; |
161 | *enc->cur++ = len >> 56; |
166 | *enc->cur++ = len >> 48; |
162 | *enc->cur++ = len >> 48; |
167 | *enc->cur++ = len >> 40; |
163 | *enc->cur++ = len >> 40; |
… | |
… | |
781 | fail: |
777 | fail: |
782 | return &PL_sv_undef; |
778 | return &PL_sv_undef; |
783 | } |
779 | } |
784 | |
780 | |
785 | static SV * |
781 | static SV * |
|
|
782 | decode_tagged (dec_t *dec) |
|
|
783 | { |
|
|
784 | UV tag = decode_uint (dec); |
|
|
785 | SV *sv = decode_sv (dec); |
|
|
786 | |
|
|
787 | if (tag == 55799) // 2.4.5 Self-Describe CBOR |
|
|
788 | return sv; |
|
|
789 | |
|
|
790 | AV *av = newAV (); |
|
|
791 | av_push (av, newSVuv (tag)); |
|
|
792 | av_push (av, sv); |
|
|
793 | return newRV_noinc ((SV *)av); |
|
|
794 | } |
|
|
795 | |
|
|
796 | static SV * |
786 | decode_sv (dec_t *dec) |
797 | decode_sv (dec_t *dec) |
787 | { |
798 | { |
788 | WANT (1); |
799 | WANT (1); |
789 | |
800 | |
790 | switch (*dec->cur >> 5) |
801 | switch (*dec->cur >> 5) |
… | |
… | |
801 | case 4: // array |
812 | case 4: // array |
802 | return decode_av (dec); |
813 | return decode_av (dec); |
803 | case 5: // map |
814 | case 5: // map |
804 | return decode_hv (dec); |
815 | return decode_hv (dec); |
805 | case 6: // tag |
816 | case 6: // tag |
806 | abort (); |
817 | return decode_tagged (dec); |
807 | break; |
|
|
808 | case 7: // misc |
818 | case 7: // misc |
809 | switch (*dec->cur++ & 31) |
819 | switch (*dec->cur++ & 31) |
810 | { |
820 | { |
811 | case 20: |
821 | case 20: |
812 | #if CBOR_SLOW |
822 | #if CBOR_SLOW |