@@ -79,9 +79,35 @@ int cmark_parser_attach_syntax_extension(cmark_parser *parser,
79
79
return 1 ;
80
80
}
81
81
82
- cmark_parser * cmark_parser_new (int options ) {
83
- cmark_parser * parser = (cmark_parser * )malloc (sizeof (cmark_parser ));
82
+ static void cmark_parser_dispose (cmark_parser * parser ) {
83
+ if (parser -> root )
84
+ cmark_node_free (parser -> root );
85
+
86
+ if (parser -> curline ) {
87
+ cmark_strbuf_free (parser -> curline );
88
+ free (parser -> curline );
89
+ }
90
+
91
+ if (parser -> linebuf ) {
92
+ cmark_strbuf_free (parser -> linebuf );
93
+ free (parser -> linebuf );
94
+ }
95
+
96
+ if (parser -> refmap )
97
+ cmark_reference_map_free (parser -> refmap );
98
+ }
99
+
100
+ static void cmark_parser_reset (cmark_parser * parser ) {
101
+ cmark_llist * saved_exts = parser -> syntax_extensions ;
102
+ cmark_llist * saved_inline_exts = parser -> inline_syntax_extensions ;
103
+ int saved_options = parser -> options ;
104
+
105
+ cmark_parser_dispose (parser );
106
+
107
+ memset (parser , 0 , sizeof (cmark_parser ));
108
+
84
109
cmark_node * document = make_document ();
110
+
85
111
cmark_strbuf * line = (cmark_strbuf * )malloc (sizeof (cmark_strbuf ));
86
112
cmark_strbuf * buf = (cmark_strbuf * )malloc (sizeof (cmark_strbuf ));
87
113
cmark_strbuf_init (line , 256 );
@@ -90,31 +116,26 @@ cmark_parser *cmark_parser_new(int options) {
90
116
parser -> refmap = cmark_reference_map_new ();
91
117
parser -> root = document ;
92
118
parser -> current = document ;
93
- parser -> line_number = 0 ;
94
- parser -> offset = 0 ;
95
- parser -> column = 0 ;
96
- parser -> first_nonspace = 0 ;
97
- parser -> first_nonspace_column = 0 ;
98
- parser -> indent = 0 ;
99
- parser -> blank = false;
100
- parser -> partially_consumed_tab = false;
101
119
parser -> curline = line ;
102
- parser -> last_line_length = 0 ;
103
120
parser -> linebuf = buf ;
104
- parser -> options = options ;
121
+
105
122
parser -> last_buffer_ended_with_cr = false;
106
- parser -> syntax_extensions = NULL ;
107
- parser -> inline_syntax_extensions = NULL ;
123
+
124
+ parser -> syntax_extensions = saved_exts ;
125
+ parser -> inline_syntax_extensions = saved_inline_exts ;
126
+ parser -> options = saved_options ;
127
+ }
128
+
129
+ cmark_parser * cmark_parser_new (int options ) {
130
+ cmark_parser * parser = (cmark_parser * )calloc (1 , sizeof (cmark_parser ));
131
+ cmark_parser_reset (parser );
132
+ parser -> options = options ;
108
133
109
134
return parser ;
110
135
}
111
136
112
137
void cmark_parser_free (cmark_parser * parser ) {
113
- cmark_strbuf_free (parser -> curline );
114
- free (parser -> curline );
115
- cmark_strbuf_free (parser -> linebuf );
116
- free (parser -> linebuf );
117
- cmark_reference_map_free (parser -> refmap );
138
+ cmark_parser_dispose (parser );
118
139
cmark_llist_free (parser -> syntax_extensions );
119
140
cmark_llist_free (parser -> inline_syntax_extensions );
120
141
free (parser );
@@ -1249,6 +1270,12 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
1249
1270
}
1250
1271
1251
1272
cmark_node * cmark_parser_finish (cmark_parser * parser ) {
1273
+ cmark_node * res ;
1274
+
1275
+ /* Parser was already finished once */
1276
+ if (parser -> root == NULL )
1277
+ return NULL ;
1278
+
1252
1279
if (parser -> linebuf -> size ) {
1253
1280
S_process_line (parser , parser -> linebuf -> ptr , parser -> linebuf -> size );
1254
1281
cmark_strbuf_clear (parser -> linebuf );
@@ -1267,7 +1294,13 @@ cmark_node *cmark_parser_finish(cmark_parser *parser) {
1267
1294
abort ();
1268
1295
}
1269
1296
#endif
1270
- return parser -> root ;
1297
+
1298
+ res = parser -> root ;
1299
+ parser -> root = NULL ;
1300
+
1301
+ cmark_parser_reset (parser );
1302
+
1303
+ return res ;
1271
1304
}
1272
1305
1273
1306
int cmark_parser_get_line_number (cmark_parser * parser ) {
0 commit comments