@@ -566,6 +566,18 @@ void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len) {
566
566
S_parser_feed (parser , (const unsigned char * )buffer , len , false);
567
567
}
568
568
569
+ void cmark_parser_feed_reentrant (cmark_parser * parser , const char * buffer , size_t len ) {
570
+ cmark_strbuf * saved_linebuf = parser -> linebuf ;
571
+ cmark_strbuf * buf = (cmark_strbuf * )malloc (sizeof (cmark_strbuf ));
572
+ cmark_strbuf_init (buf , 0 );
573
+
574
+ parser -> linebuf = buf ;
575
+ S_parser_feed (parser , (const unsigned char * )buffer , len , true);
576
+ cmark_strbuf_free (buf );
577
+
578
+ parser -> linebuf = saved_linebuf ;
579
+ }
580
+
569
581
static void S_parser_feed (cmark_parser * parser , const unsigned char * buffer ,
570
582
size_t len , bool eof ) {
571
583
const unsigned char * end = buffer + len ;
@@ -1216,6 +1228,9 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
1216
1228
bool all_matched = true;
1217
1229
cmark_node * container ;
1218
1230
cmark_chunk input ;
1231
+ cmark_node * current ;
1232
+
1233
+ cmark_strbuf_clear (parser -> curline );
1219
1234
1220
1235
if (parser -> options & CMARK_OPT_VALIDATE_UTF8 )
1221
1236
cmark_utf8proc_check (parser -> curline , buffer , bytes );
@@ -1248,9 +1263,13 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
1248
1263
if (parser -> blank && container -> last_line_blank )
1249
1264
break_out_of_lists (parser , & container );
1250
1265
1266
+ current = parser -> current ;
1267
+
1251
1268
open_new_blocks (parser , & container , & input , all_matched );
1252
1269
1253
- add_text_to_container (parser , container , last_matched_container , & input );
1270
+ /* parser->current might have changed if feed_reentrant was called */
1271
+ if (current == parser -> current )
1272
+ add_text_to_container (parser , container , last_matched_container , & input );
1254
1273
1255
1274
finished :
1256
1275
parser -> last_line_length = input .len ;
0 commit comments