@@ -35,7 +35,6 @@ static const char *RIGHTSINGLEQUOTE = "\xE2\x80\x99";
35
35
36
36
typedef struct bracket {
37
37
struct bracket * previous ;
38
- struct delimiter * previous_delimiter ;
39
38
cmark_node * inl_text ;
40
39
bufsize_t position ;
41
40
bool image ;
@@ -511,6 +510,7 @@ static void push_delimiter(subject *subj, unsigned char c, bool can_open,
511
510
delim -> can_open = can_open ;
512
511
delim -> can_close = can_close ;
513
512
delim -> inl_text = inl_text ;
513
+ delim -> position = subj -> pos ;
514
514
delim -> length = inl_text -> as .literal .len ;
515
515
delim -> previous = subj -> last_delim ;
516
516
delim -> next = NULL ;
@@ -531,7 +531,6 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
531
531
b -> active = true;
532
532
b -> inl_text = inl_text ;
533
533
b -> previous = subj -> last_bracket ;
534
- b -> previous_delimiter = subj -> last_delim ;
535
534
b -> position = subj -> pos ;
536
535
b -> bracket_after = false;
537
536
if (image ) {
@@ -646,12 +645,13 @@ static cmark_syntax_extension *get_extension_for_special_char(cmark_parser *pars
646
645
return NULL ;
647
646
}
648
647
649
- static void process_emphasis (cmark_parser * parser , subject * subj , delimiter * stack_bottom ) {
650
- delimiter * closer = subj -> last_delim ;
648
+ static void process_emphasis (cmark_parser * parser , subject * subj , bufsize_t stack_bottom ) {
649
+ delimiter * candidate ;
650
+ delimiter * closer = NULL ;
651
651
delimiter * opener ;
652
652
delimiter * old_closer ;
653
653
bool opener_found ;
654
- delimiter * openers_bottom [3 ][128 ];
654
+ bufsize_t openers_bottom [3 ][128 ];
655
655
int i ;
656
656
657
657
// initialize openers_bottom:
@@ -664,8 +664,10 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
664
664
}
665
665
666
666
// move back to first relevant delim.
667
- while (closer != NULL && closer -> previous != stack_bottom ) {
668
- closer = closer -> previous ;
667
+ candidate = subj -> last_delim ;
668
+ while (candidate != NULL && candidate -> position >= stack_bottom ) {
669
+ closer = candidate ;
670
+ candidate = candidate -> previous ;
669
671
}
670
672
671
673
// now move forward, looking for closers, and handling each
@@ -675,8 +677,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
675
677
// Now look backwards for first matching opener:
676
678
opener = closer -> previous ;
677
679
opener_found = false;
678
- while (opener != NULL && opener ! = stack_bottom &&
679
- opener ! = openers_bottom [closer -> length % 3 ][closer -> delim_char ]) {
680
+ while (opener != NULL && opener -> position > = stack_bottom &&
681
+ opener -> position > = openers_bottom [closer -> length % 3 ][closer -> delim_char ]) {
680
682
if (opener -> can_open && opener -> delim_char == closer -> delim_char ) {
681
683
// interior closer of size 2 can't match opener of size 1
682
684
// or of size 1 can't match 2
@@ -722,7 +724,7 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
722
724
if (!opener_found ) {
723
725
// set lower bound for future searches for openers
724
726
openers_bottom [old_closer -> length % 3 ][old_closer -> delim_char ] =
725
- old_closer -> previous ;
727
+ old_closer -> position ;
726
728
if (!old_closer -> can_open ) {
727
729
// we can remove a closer that can't be an
728
730
// opener, once we've seen there's no
@@ -735,7 +737,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
735
737
}
736
738
}
737
739
// free all delimiters in list until stack_bottom:
738
- while (subj -> last_delim != NULL && subj -> last_delim != stack_bottom ) {
740
+ while (subj -> last_delim != NULL &&
741
+ subj -> last_delim -> position >= stack_bottom ) {
739
742
remove_delimiter (subj , subj -> last_delim );
740
743
}
741
744
}
@@ -1251,7 +1254,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
1251
1254
// being replacing the opening '[' text node with a `^footnote-ref]` node.
1252
1255
cmark_node_insert_before (opener -> inl_text , fnref );
1253
1256
1254
- process_emphasis (parser , subj , opener -> previous_delimiter );
1257
+ process_emphasis (parser , subj , opener -> position );
1255
1258
// sometimes, the footnote reference text gets parsed into multiple nodes
1256
1259
// i.e. '[^example]' parsed into '[', '^exam', 'ple]'.
1257
1260
// this happens for ex with the autolink extension. when the autolinker
@@ -1303,7 +1306,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
1303
1306
// Free the bracket [:
1304
1307
cmark_node_free (opener -> inl_text );
1305
1308
1306
- process_emphasis (parser , subj , opener -> previous_delimiter );
1309
+ process_emphasis (parser , subj , opener -> position );
1307
1310
pop_bracket (subj );
1308
1311
1309
1312
// Now, if we have a link, we also want to deactivate earlier link
@@ -1528,7 +1531,7 @@ void cmark_parse_inlines(cmark_parser *parser,
1528
1531
while (!is_eof (& subj ) && parse_inline (parser , & subj , parent , options ))
1529
1532
;
1530
1533
1531
- process_emphasis (parser , & subj , NULL );
1534
+ process_emphasis (parser , & subj , 0 );
1532
1535
// free bracket and delim stack
1533
1536
while (subj .last_delim ) {
1534
1537
remove_delimiter (& subj , subj .last_delim );
0 commit comments