MCPcopy Create free account
hub / github.com/commonmark/cmark / S_parser_feed

Function S_parser_feed

src/blocks.c:576–651  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

574}
575
576static 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

Callers 3

cmark_parse_fileFunction · 0.85
cmark_parse_documentFunction · 0.85
cmark_parser_feedFunction · 0.85

Calls 4

cmark_strbuf_putFunction · 0.85
S_process_lineFunction · 0.85
cmark_strbuf_clearFunction · 0.85
S_is_line_end_charFunction · 0.70

Tested by

no test coverage detected