@@ -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 ;
@@ -1211,6 +1223,9 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
1211
1223
bool all_matched = true;
1212
1224
cmark_node * container ;
1213
1225
cmark_chunk input ;
1226
+ cmark_node * current ;
1227
+
1228
+ cmark_strbuf_clear (parser -> curline );
1214
1229
1215
1230
if (parser -> options & CMARK_OPT_VALIDATE_UTF8 )
1216
1231
cmark_utf8proc_check (parser -> curline , buffer , bytes );
@@ -1242,9 +1257,13 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
1242
1257
if (parser -> blank && container -> last_line_blank )
1243
1258
break_out_of_lists (parser , & container );
1244
1259
1260
+ current = parser -> current ;
1261
+
1245
1262
open_new_blocks (parser , & container , & input , all_matched );
1246
1263
1247
- add_text_to_container (parser , container , last_matched_container , & input );
1264
+ /* parser->current might have changed if feed_reentrant was called */
1265
+ if (current == parser -> current )
1266
+ add_text_to_container (parser , container , last_matched_container , & input );
1248
1267
1249
1268
finished :
1250
1269
parser -> last_line_length = input .len ;
0 commit comments