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.2 by root, Sat Oct 26 10:41:12 2013 UTC vs.
Revision 1.4 by root, Sat Oct 26 21:06:37 2013 UTC

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;
781fail: 777fail:
782 return &PL_sv_undef; 778 return &PL_sv_undef;
783} 779}
784 780
785static SV * 781static SV *
782decode_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
796static SV *
786decode_sv (dec_t *dec) 797decode_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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines