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

Comparing JSON-XS/XS.xs (file contents):
Revision 1.20 by root, Sun Mar 25 21:53:19 2007 UTC vs.
Revision 1.21 by root, Thu Mar 29 02:45:49 2007 UTC

21 21
22// F_SELFCONVERT? <=> to_json/toJson 22// F_SELFCONVERT? <=> to_json/toJson
23// F_BLESSED? <=> { $__class__$ => } 23// F_BLESSED? <=> { $__class__$ => }
24 24
25#define F_PRETTY F_INDENT | F_SPACE_BEFORE | F_SPACE_AFTER 25#define F_PRETTY F_INDENT | F_SPACE_BEFORE | F_SPACE_AFTER
26#define F_DEFAULT (13UL << S_MAXDEPTH) 26#define F_DEFAULT (12UL << S_MAXDEPTH)
27 27
28#define INIT_SIZE 32 // initial scalar size to be allocated 28#define INIT_SIZE 32 // initial scalar size to be allocated
29#define INDENT_STEP 3 // spaces per indentation level 29#define INDENT_STEP 3 // spaces per indentation level
30 30
31#define UTF8_MAX_LEN 11 // for perls UTF-X: max. number of octets per character 31#define UTF8_MAX_LEN 11 // for perls UTF-X: max. number of octets per character
268static void 268static void
269encode_av (enc_t *enc, AV *av) 269encode_av (enc_t *enc, AV *av)
270{ 270{
271 int i, len = av_len (av); 271 int i, len = av_len (av);
272 272
273 if (enc->indent >= enc->maxdepth)
274 croak ("data structure too deep (hit recursion limit)");
275
273 encode_ch (enc, '['); encode_nl (enc); 276 encode_ch (enc, '['); encode_nl (enc);
274 ++enc->indent; 277 ++enc->indent;
275 278
276 for (i = 0; i <= len; ++i) 279 for (i = 0; i <= len; ++i)
277 { 280 {
342 345
343static void 346static void
344encode_hv (enc_t *enc, HV *hv) 347encode_hv (enc_t *enc, HV *hv)
345{ 348{
346 int count, i; 349 int count, i;
350
351 if (enc->indent >= enc->maxdepth)
352 croak ("data structure too deep (hit recursion limit)");
347 353
348 encode_ch (enc, '{'); encode_nl (enc); ++enc->indent; 354 encode_ch (enc, '{'); encode_nl (enc); ++enc->indent;
349 355
350 if ((count = hv_iterinit (hv))) 356 if ((count = hv_iterinit (hv)))
351 { 357 {
420 } 426 }
421 427
422 --enc->indent; encode_indent (enc); encode_ch (enc, '}'); 428 --enc->indent; encode_indent (enc); encode_ch (enc, '}');
423} 429}
424 430
431// encode objects, arrays and special \0=false and \1=true values.
432static void
433encode_rv (enc_t *enc, SV *sv)
434{
435 SvGETMAGIC (sv);
436
437 svtype svt = SvTYPE (sv);
438
439 if (svt == SVt_PVHV)
440 encode_hv (enc, (HV *)sv);
441 else if (svt == SVt_PVAV)
442 encode_av (enc, (AV *)sv);
443 else if (svt < SVt_PVAV)
444 {
445 if (SvNIOK (sv) && SvIV (sv) == 0)
446 encode_str (enc, "false", 5, 0);
447 else if (SvNIOK (sv) && SvIV (sv) == 1)
448 encode_str (enc, "true", 4, 0);
449 else
450 croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1",
451 SvPV_nolen (sv_2mortal (newRV_inc (sv))));
452 }
453 else
454 croak ("encountered %s, but JSON can only represent references to arrays or hashes",
455 SvPV_nolen (sv_2mortal (newRV_inc (sv))));
456}
457
425static void 458static void
426encode_sv (enc_t *enc, SV *sv) 459encode_sv (enc_t *enc, SV *sv)
427{ 460{
428 SvGETMAGIC (sv); 461 SvGETMAGIC (sv);
429 462
448 SvIsUV(sv) 481 SvIsUV(sv)
449 ? snprintf (enc->cur, 64, "%"UVuf, (UV)SvUVX (sv)) 482 ? snprintf (enc->cur, 64, "%"UVuf, (UV)SvUVX (sv))
450 : snprintf (enc->cur, 64, "%"IVdf, (IV)SvIVX (sv)); 483 : snprintf (enc->cur, 64, "%"IVdf, (IV)SvIVX (sv));
451 } 484 }
452 else if (SvROK (sv)) 485 else if (SvROK (sv))
453 { 486 encode_rv (enc, SvRV (sv));
454 SV *rv = SvRV (sv);
455
456 if (enc->indent >= enc->maxdepth)
457 croak ("data structure too deep (hit recursion limit)");
458
459 switch (SvTYPE (rv))
460 {
461 case SVt_PVAV: encode_av (enc, (AV *)rv); break;
462 case SVt_PVHV: encode_hv (enc, (HV *)rv); break;
463
464 default:
465 croak ("encountered %s, but JSON can only represent references to arrays or hashes",
466 SvPV_nolen (sv));
467 }
468 }
469 else if (!SvOK (sv)) 487 else if (!SvOK (sv))
470 encode_str (enc, "null", 4, 0); 488 encode_str (enc, "null", 4, 0);
471 else 489 else
472 croak ("encountered perl type (%s,0x%x) that JSON cannot handle, you might want to report this", 490 croak ("encountered perl type (%s,0x%x) that JSON cannot handle, you might want to report this",
473 SvPV_nolen (sv), SvFLAGS (sv)); 491 SvPV_nolen (sv), SvFLAGS (sv));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines