… | |
… | |
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 | ALIAS: |
|
|
1454 | incr_parse_multiple = 1 |
1453 | PPCODE: |
1455 | PPCODE: |
1454 | { |
1456 | { |
1455 | if (SvUTF8 (cborstr)) |
1457 | if (SvUTF8 (cborstr)) |
1456 | sv_utf8_downgrade (cborstr, 0); |
1458 | sv_utf8_downgrade (cborstr, 0); |
1457 | |
1459 | |
… | |
… | |
1462 | self->incr_need = 1; |
1464 | self->incr_need = 1; |
1463 | |
1465 | |
1464 | av_push (self->incr_count, newSViv (1)); |
1466 | av_push (self->incr_count, newSViv (1)); |
1465 | } |
1467 | } |
1466 | |
1468 | |
1467 | for (;;) |
1469 | do |
1468 | { |
1470 | { |
1469 | if (!incr_parse (self, cborstr)) |
1471 | if (!incr_parse (self, cborstr)) |
1470 | { |
1472 | { |
1471 | if (self->incr_need > self->max_size && self->max_size) |
1473 | 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", |
1474 | 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); |
1475 | (unsigned long)self->incr_need, (unsigned long)self->max_size); |
1474 | |
1476 | |
1475 | break; |
1477 | break; |
1476 | } |
1478 | } |
1477 | |
1479 | |
1478 | SV *sv; |
1480 | SV *sv; |
1479 | char *offset; |
1481 | char *offset; |
1480 | |
1482 | |
1481 | PUTBACK; sv = decode_cbor (cborstr, self, &offset); SPAGAIN; |
1483 | PUTBACK; sv = decode_cbor (cborstr, self, &offset); SPAGAIN; |
1482 | XPUSHs (sv); |
1484 | XPUSHs (sv); |
1483 | |
1485 | |
|
|
1486 | sv_chop (cborstr, offset); |
|
|
1487 | |
1484 | av_clear (self->incr_count); |
1488 | av_clear (self->incr_count); |
1485 | av_push (self->incr_count, newSViv (1)); |
1489 | av_push (self->incr_count, newSViv (1)); |
1486 | |
1490 | |
1487 | if (chop) |
|
|
1488 | { |
|
|
1489 | self->incr_pos = 0; |
1491 | 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; |
1492 | self->incr_need = self->incr_pos + 1; |
1496 | } |
1493 | } |
|
|
1494 | while (ix); |
1497 | } |
1495 | } |
1498 | |
1496 | |
1499 | void incr_reset (CBOR *self) |
1497 | void incr_reset (CBOR *self) |
1500 | CODE: |
1498 | CODE: |
1501 | { |
1499 | { |