… | |
… | |
1447 | EXTEND (SP, 2); |
1447 | EXTEND (SP, 2); |
1448 | PUSHs (sv); |
1448 | PUSHs (sv); |
1449 | PUSHs (sv_2mortal (newSVuv (offset - SvPVX (cborstr)))); |
1449 | PUSHs (sv_2mortal (newSVuv (offset - SvPVX (cborstr)))); |
1450 | } |
1450 | } |
1451 | |
1451 | |
1452 | void incr_parse (CBOR *self, SV *cborstr, int chop = 0) |
1452 | void incr_parse (CBOR *self, SV *cborstr) |
1453 | PPCODE: |
1453 | PPCODE: |
1454 | { |
1454 | { |
1455 | if (SvUTF8 (cborstr)) |
1455 | if (SvUTF8 (cborstr)) |
1456 | sv_utf8_downgrade (cborstr, 0); |
1456 | sv_utf8_downgrade (cborstr, 0); |
1457 | |
1457 | |
… | |
… | |
1462 | self->incr_need = 1; |
1462 | self->incr_need = 1; |
1463 | |
1463 | |
1464 | av_push (self->incr_count, newSViv (1)); |
1464 | av_push (self->incr_count, newSViv (1)); |
1465 | } |
1465 | } |
1466 | |
1466 | |
1467 | for (;;) |
1467 | do |
1468 | { |
1468 | { |
1469 | if (!incr_parse (self, cborstr)) |
1469 | if (!incr_parse (self, cborstr)) |
1470 | { |
1470 | { |
1471 | if (self->incr_need > self->max_size && self->max_size) |
1471 | if (self->incr_need > self->max_size && self->max_size) |
1472 | croak ("attempted decode of CBOR text of %lu bytes size, but max_size is set to %lu", |
1472 | croak ("attempted decode of CBOR text of %lu bytes size, but max_size is set to %lu", |
1473 | (unsigned long)self->incr_need, (unsigned long)self->max_size); |
1473 | (unsigned long)self->incr_need, (unsigned long)self->max_size); |
1474 | |
1474 | |
1475 | break; |
1475 | break; |
1476 | } |
1476 | } |
1477 | |
1477 | |
1478 | SV *sv; |
1478 | SV *sv; |
1479 | char *offset; |
1479 | char *offset; |
1480 | |
1480 | |
1481 | PUTBACK; sv = decode_cbor (cborstr, self, &offset); SPAGAIN; |
1481 | PUTBACK; sv = decode_cbor (cborstr, self, &offset); SPAGAIN; |
1482 | XPUSHs (sv); |
1482 | XPUSHs (sv); |
1483 | |
1483 | |
|
|
1484 | sv_chop (cborstr, offset); |
|
|
1485 | |
1484 | av_clear (self->incr_count); |
1486 | av_clear (self->incr_count); |
1485 | av_push (self->incr_count, newSViv (1)); |
1487 | av_push (self->incr_count, newSViv (1)); |
1486 | |
1488 | |
1487 | if (chop) |
|
|
1488 | { |
|
|
1489 | self->incr_pos = 0; |
1489 | self->incr_pos = 0; |
1490 | sv_chop (cborstr, offset); |
|
|
1491 | } |
|
|
1492 | else |
|
|
1493 | self->incr_pos = offset - SvPVX (cborstr); |
|
|
1494 | |
|
|
1495 | self->incr_need = self->incr_pos + 1; |
1490 | self->incr_need = self->incr_pos + 1; |
1496 | } |
1491 | } |
|
|
1492 | while (GIMME_V == G_ARRAY); |
1497 | } |
1493 | } |
1498 | |
1494 | |
1499 | void incr_reset (CBOR *self) |
1495 | void incr_reset (CBOR *self) |
1500 | CODE: |
1496 | CODE: |
1501 | { |
1497 | { |