| 574 | } |
| 575 | |
| 576 | static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer, |
| 577 | size_t len, bool eof) { |
| 578 | const unsigned char *end = buffer + len; |
| 579 | static const uint8_t repl[] = {239, 191, 189}; |
| 580 | |
| 581 | if (len > UINT_MAX - parser->total_size) |
| 582 | parser->total_size = UINT_MAX; |
| 583 | else |
| 584 | parser->total_size += (int)len; |
| 585 | |
| 586 | // Skip UTF-8 BOM if present; see #334 |
| 587 | if (parser->line_number == 0 && parser->column == 0 && len >= 3 && |
| 588 | *buffer == 0xEF && *(buffer + 1) == 0xBB && |
| 589 | *(buffer + 2) == 0xBF) { |
| 590 | buffer += 3; |
| 591 | } else if (parser->last_buffer_ended_with_cr && *buffer == '\n') { |
| 592 | // skip NL if last buffer ended with CR ; see #117 |
| 593 | buffer++; |
| 594 | } |
| 595 | |
| 596 | parser->last_buffer_ended_with_cr = false; |
| 597 | while (buffer < end) { |
| 598 | const unsigned char *eol; |
| 599 | bufsize_t chunk_len; |
| 600 | bool process = false; |
| 601 | for (eol = buffer; eol < end; ++eol) { |
| 602 | if (S_is_line_end_char(*eol)) { |
| 603 | process = true; |
| 604 | break; |
| 605 | } |
| 606 | if (*eol == '\0' && eol < end) { |
| 607 | break; |
| 608 | } |
| 609 | } |
| 610 | if (eol >= end && eof) { |
| 611 | process = true; |
| 612 | } |
| 613 | |
| 614 | chunk_len = (eol - buffer); |
| 615 | if (process) { |
| 616 | if (parser->linebuf.size > 0) { |
| 617 | cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); |
| 618 | S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size); |
| 619 | cmark_strbuf_clear(&parser->linebuf); |
| 620 | } else { |
| 621 | S_process_line(parser, buffer, chunk_len); |
| 622 | } |
| 623 | } else { |
| 624 | if (eol < end && *eol == '\0') { |
| 625 | // omit NULL byte |
| 626 | cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); |
| 627 | // add replacement character |
| 628 | cmark_strbuf_put(&parser->linebuf, repl, 3); |
| 629 | } else { |
| 630 | cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); |
| 631 | } |
| 632 | } |
| 633 |
no test coverage detected