Skip to content

Commit efcedbd

Browse files
committed
Merge branch 'master' of github.com:HopelessProgrammingInterns/mdtex
Conflicts: parser.c
2 parents e872970 + b11ee97 commit efcedbd

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

parser.c

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ strdup (char *str, int len)
6161
return ret;
6262
}
6363

64-
char advance_char (char **c, int *col, int *row)
64+
char
65+
advance_char (char **c, int *col, int *row)
6566
{
6667
(*c)++;
6768

@@ -150,13 +151,12 @@ parse_header (Element *header_element, DocInfo *info)
150151
int
151152
parse (int fd, int len, const char *error)
152153
{
153-
char *c;
154+
char *c, *file;
154155
DocInfo doc_info;
155156
Token current_token;
156157
Element *list;
157158
Element *current_element;
158-
int is_start_of_line = 1;
159-
int row, col;
159+
int is_start_of_line = 1, row, col;
160160

161161
#define next_element() \
162162
current_element++; \
@@ -182,7 +182,7 @@ parse (int fd, int len, const char *error)
182182

183183
current_element->type = NONE;
184184

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);
186186

187187
if (c == MAP_FAILED)
188188
return 0;
@@ -193,15 +193,15 @@ parse (int fd, int len, const char *error)
193193

194194
switch (*c) {
195195
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)
199198
break;
200199

200+
finish_none_element ();
201+
201202
current_element->type = HEADER;
202203
current_element->data = c;
203204

204-
// just assume header and skip for now
205205
while (next_char () != '}') {
206206
if (*c == '\0') {
207207
error = "Header not terminated";
@@ -215,6 +215,45 @@ parse (int fd, int len, const char *error)
215215
next_char ();
216216
next_element ();
217217
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;
218257
case '*':
219258
finish_none_element ();
220259

@@ -349,6 +388,9 @@ parse (int fd, int len, const char *error)
349388
printf ("%i, %.*s\n", i->type, i->len, i->data);
350389
}
351390

391+
if (munmap (file, len) != 0)
392+
return 0;
393+
352394
return 1;
353395
}
354396

test.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
"date": "now"
44
}
55

6+
Blub blub
7+
68
Aufgabe 1
79
=========
810

11+
blah
12+
913
# Subtitle
1014

1115
Das ist ein Text, mit *fetter* Schrift.

0 commit comments

Comments
 (0)