… | |
… | |
28 | #define F_SHRINK 0x00000200UL |
28 | #define F_SHRINK 0x00000200UL |
29 | #define F_ALLOW_BLESSED 0x00000400UL |
29 | #define F_ALLOW_BLESSED 0x00000400UL |
30 | #define F_CONV_BLESSED 0x00000800UL // NYI |
30 | #define F_CONV_BLESSED 0x00000800UL // NYI |
31 | #define F_MAXDEPTH 0xf8000000UL |
31 | #define F_MAXDEPTH 0xf8000000UL |
32 | #define S_MAXDEPTH 27 |
32 | #define S_MAXDEPTH 27 |
|
|
33 | #define F_MAXSIZE 0x01f00000UL |
|
|
34 | #define S_MAXSIZE 20 |
33 | |
35 | |
34 | #define DEC_DEPTH(flags) (1UL << ((flags & F_MAXDEPTH) >> S_MAXDEPTH)) |
36 | #define DEC_DEPTH(flags) (1UL << ((flags & F_MAXDEPTH) >> S_MAXDEPTH)) |
|
|
37 | #define DEC_SIZE(flags) (1UL << ((flags & F_MAXSIZE ) >> S_MAXSIZE )) |
35 | |
38 | |
36 | #define F_PRETTY F_INDENT | F_SPACE_BEFORE | F_SPACE_AFTER |
39 | #define F_PRETTY F_INDENT | F_SPACE_BEFORE | F_SPACE_AFTER |
37 | #define F_DEFAULT (9UL << S_MAXDEPTH) |
40 | #define F_DEFAULT (9UL << S_MAXDEPTH) |
38 | |
41 | |
39 | #define INIT_SIZE 32 // initial scalar size to be allocated |
42 | #define INIT_SIZE 32 // initial scalar size to be allocated |
… | |
… | |
1133 | SV *sv; |
1136 | SV *sv; |
1134 | |
1137 | |
1135 | SvGETMAGIC (string); |
1138 | SvGETMAGIC (string); |
1136 | SvUPGRADE (string, SVt_PV); |
1139 | SvUPGRADE (string, SVt_PV); |
1137 | |
1140 | |
|
|
1141 | if (flags & F_MAXSIZE && SvCUR (string) > DEC_SIZE (flags)) |
|
|
1142 | croak ("attempted decode of JSON text of %lu bytes size, but max_size is set to %lu", |
|
|
1143 | (unsigned long)SvCUR (string), (unsigned long)DEC_SIZE (flags)); |
|
|
1144 | |
1138 | if (flags & F_UTF8) |
1145 | if (flags & F_UTF8) |
1139 | sv_utf8_downgrade (string, 0); |
1146 | sv_utf8_downgrade (string, 0); |
1140 | else |
1147 | else |
1141 | sv_utf8_upgrade (string); |
1148 | sv_utf8_upgrade (string); |
1142 | |
1149 | |
… | |
… | |
1276 | RETVAL = newSVsv (self); |
1283 | RETVAL = newSVsv (self); |
1277 | } |
1284 | } |
1278 | OUTPUT: |
1285 | OUTPUT: |
1279 | RETVAL |
1286 | RETVAL |
1280 | |
1287 | |
|
|
1288 | SV *max_size (SV *self, UV max_size = 0) |
|
|
1289 | CODE: |
|
|
1290 | { |
|
|
1291 | UV *uv = SvJSON (self); |
|
|
1292 | UV log2 = 0; |
|
|
1293 | |
|
|
1294 | if (max_size > 0x80000000UL) max_size = 0x80000000UL; |
|
|
1295 | if (max_size == 1) max_size = 2; |
|
|
1296 | |
|
|
1297 | while ((1UL << log2) < max_size) |
|
|
1298 | ++log2; |
|
|
1299 | |
|
|
1300 | *uv = *uv & ~F_MAXSIZE | (log2 << S_MAXSIZE); |
|
|
1301 | |
|
|
1302 | RETVAL = newSVsv (self); |
|
|
1303 | } |
|
|
1304 | OUTPUT: |
|
|
1305 | RETVAL |
|
|
1306 | |
1281 | void encode (SV *self, SV *scalar) |
1307 | void encode (SV *self, SV *scalar) |
1282 | PPCODE: |
1308 | PPCODE: |
1283 | XPUSHs (encode_json (scalar, *SvJSON (self))); |
1309 | XPUSHs (encode_json (scalar, *SvJSON (self))); |
1284 | |
1310 | |
1285 | void decode (SV *self, SV *jsonstr) |
1311 | void decode (SV *self, SV *jsonstr) |