@@ -61,7 +61,8 @@ strdup (char *str, int len)
61
61
return ret ;
62
62
}
63
63
64
- char advance_char (char * * c , int * col , int * row )
64
+ char
65
+ advance_char (char * * c , int * col , int * row )
65
66
{
66
67
(* c )++ ;
67
68
@@ -150,13 +151,12 @@ parse_header (Element *header_element, DocInfo *info)
150
151
int
151
152
parse (int fd , int len , const char * error )
152
153
{
153
- char * c ;
154
+ char * c , * file ;
154
155
DocInfo doc_info ;
155
156
Token current_token ;
156
157
Element * list ;
157
158
Element * current_element ;
158
- int is_start_of_line = 1 ;
159
- int row , col ;
159
+ int is_start_of_line = 1 , row , col ;
160
160
161
161
#define next_element () \
162
162
current_element++; \
@@ -182,7 +182,7 @@ parse (int fd, int len, const char *error)
182
182
183
183
current_element -> type = NONE ;
184
184
185
- c = (char * ) mmap (NULL , len , PROT_READ , MAP_PRIVATE , fd , 0 );
185
+ file = c = (char * ) mmap (NULL , len , PROT_READ , MAP_PRIVATE , fd , 0 );
186
186
187
187
if (c == MAP_FAILED )
188
188
return 0 ;
@@ -193,15 +193,15 @@ parse (int fd, int len, const char *error)
193
193
194
194
switch (* c ) {
195
195
case '{' :
196
- finish_none_element ();
197
-
198
- if (!is_start_of_line )
196
+ // only parse if it's the very first element
197
+ if (list != current_element )
199
198
break ;
200
199
200
+ finish_none_element ();
201
+
201
202
current_element -> type = HEADER ;
202
203
current_element -> data = c ;
203
204
204
- // just assume header and skip for now
205
205
while (next_char () != '}' ) {
206
206
if (* c == '\0' ) {
207
207
error = "Header not terminated" ;
@@ -215,6 +215,45 @@ parse (int fd, int len, const char *error)
215
215
next_char ();
216
216
next_element ();
217
217
break ;
218
+ case '=' :
219
+ {
220
+ char * linebreak , * cur , * ret , * prev ;
221
+ int prev_len ;
222
+
223
+ if (!is_start_of_line )
224
+ break ;
225
+
226
+ if (current_element -> len < 1 )
227
+ break ;
228
+
229
+ cur = current_element -> data ;
230
+ while ((ret = strstr (cur , "\n" ))) {
231
+ cur = ret + 1 ;
232
+ if (ret >= current_element -> data + current_element -> len - 1 ) {
233
+ ret = prev ;
234
+ break ;
235
+ }
236
+
237
+ prev = ret ;
238
+ }
239
+
240
+ if (!ret )
241
+ break ;
242
+
243
+ prev_len = current_element -> len ;
244
+ current_element -> len = ret - current_element -> data ;
245
+
246
+ finish_none_element ();
247
+
248
+ current_element -> type = HEADING_1 ;
249
+ current_element -> data = (char * ) ret ;
250
+ current_element -> len = c - ret - 1 ;
251
+
252
+ while (* c == '=' ) next_char ();
253
+
254
+ next_element ();
255
+ }
256
+ break ;
218
257
case '*' :
219
258
finish_none_element ();
220
259
@@ -349,6 +388,9 @@ parse (int fd, int len, const char *error)
349
388
printf ("%i, %.*s\n" , i -> type , i -> len , i -> data );
350
389
}
351
390
391
+ if (munmap (file , len ) != 0 )
392
+ return 0 ;
393
+
352
394
return 1 ;
353
395
}
354
396
0 commit comments