@@ -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 ;
@@ -505,6 +504,7 @@ static void push_delimiter(subject *subj, unsigned char c, bool can_open,
505
504
delim -> can_open = can_open ;
506
505
delim -> can_close = can_close ;
507
506
delim -> inl_text = inl_text ;
507
+ delim -> position = subj -> pos ;
508
508
delim -> length = inl_text -> as .literal .len ;
509
509
delim -> previous = subj -> last_delim ;
510
510
delim -> next = NULL ;
@@ -525,7 +525,6 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
525
525
b -> active = true;
526
526
b -> inl_text = inl_text ;
527
527
b -> previous = subj -> last_bracket ;
528
- b -> previous_delimiter = subj -> last_delim ;
529
528
b -> position = subj -> pos ;
530
529
b -> bracket_after = false;
531
530
if (image ) {
@@ -640,12 +639,12 @@ static cmark_syntax_extension *get_extension_for_special_char(cmark_parser *pars
640
639
return NULL ;
641
640
}
642
641
643
- static void process_emphasis (cmark_parser * parser , subject * subj , delimiter * stack_bottom ) {
642
+ static void process_emphasis (cmark_parser * parser , subject * subj , bufsize_t stack_bottom ) {
644
643
delimiter * closer = subj -> last_delim ;
645
644
delimiter * opener ;
646
645
delimiter * old_closer ;
647
646
bool opener_found ;
648
- delimiter * openers_bottom [3 ][128 ];
647
+ bufsize_t openers_bottom [3 ][128 ];
649
648
int i ;
650
649
651
650
// initialize openers_bottom:
@@ -658,7 +657,9 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
658
657
}
659
658
660
659
// move back to first relevant delim.
661
- while (closer != NULL && closer -> previous != stack_bottom ) {
660
+ while (closer != NULL &&
661
+ closer -> previous != NULL &&
662
+ closer -> previous -> position >= stack_bottom ) {
662
663
closer = closer -> previous ;
663
664
}
664
665
@@ -669,8 +670,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
669
670
// Now look backwards for first matching opener:
670
671
opener = closer -> previous ;
671
672
opener_found = false;
672
- while (opener != NULL && opener ! = stack_bottom &&
673
- opener ! = openers_bottom [closer -> length % 3 ][closer -> delim_char ]) {
673
+ while (opener != NULL && opener -> position > = stack_bottom &&
674
+ opener -> position > = openers_bottom [closer -> length % 3 ][closer -> delim_char ]) {
674
675
if (opener -> can_open && opener -> delim_char == closer -> delim_char ) {
675
676
// interior closer of size 2 can't match opener of size 1
676
677
// or of size 1 can't match 2
@@ -716,7 +717,7 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
716
717
if (!opener_found ) {
717
718
// set lower bound for future searches for openers
718
719
openers_bottom [old_closer -> length % 3 ][old_closer -> delim_char ] =
719
- old_closer -> previous ;
720
+ old_closer -> position ;
720
721
if (!old_closer -> can_open ) {
721
722
// we can remove a closer that can't be an
722
723
// opener, once we've seen there's no
@@ -729,7 +730,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
729
730
}
730
731
}
731
732
// free all delimiters in list until stack_bottom:
732
- while (subj -> last_delim != NULL && subj -> last_delim != stack_bottom ) {
733
+ while (subj -> last_delim != NULL &&
734
+ subj -> last_delim -> position >= stack_bottom ) {
733
735
remove_delimiter (subj , subj -> last_delim );
734
736
}
735
737
}
@@ -1193,7 +1195,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
1193
1195
// being replacing the opening '[' text node with a `^footnote-ref]` node.
1194
1196
cmark_node_insert_before (opener -> inl_text , fnref );
1195
1197
1196
- process_emphasis (parser , subj , opener -> previous_delimiter );
1198
+ process_emphasis (parser , subj , opener -> position );
1197
1199
// sometimes, the footnote reference text gets parsed into multiple nodes
1198
1200
// i.e. '[^example]' parsed into '[', '^exam', 'ple]'.
1199
1201
// this happens for ex with the autolink extension. when the autolinker
@@ -1245,7 +1247,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
1245
1247
// Free the bracket [:
1246
1248
cmark_node_free (opener -> inl_text );
1247
1249
1248
- process_emphasis (parser , subj , opener -> previous_delimiter );
1250
+ process_emphasis (parser , subj , opener -> position );
1249
1251
pop_bracket (subj );
1250
1252
1251
1253
// Now, if we have a link, we also want to deactivate earlier link
@@ -1470,7 +1472,7 @@ void cmark_parse_inlines(cmark_parser *parser,
1470
1472
while (!is_eof (& subj ) && parse_inline (parser , & subj , parent , options ))
1471
1473
;
1472
1474
1473
- process_emphasis (parser , & subj , NULL );
1475
+ process_emphasis (parser , & subj , 0 );
1474
1476
// free bracket and delim stack
1475
1477
while (subj .last_delim ) {
1476
1478
remove_delimiter (& subj , subj .last_delim );
0 commit comments