Skip to content

Commit b11ee97

Browse files
committed
Implement '===' for HEADING_1
1 parent eb2f81b commit b11ee97

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

parser.c

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <fcntl.h>
22
#include <stdio.h>
33
#include <stdlib.h>
4+
#include <string.h>
45
#include <sys/mman.h>
56
#include <sys/stat.h>
67

@@ -39,7 +40,8 @@ typedef struct {
3940

4041
#define is_whitespace(c) ((c) == ' ' || (c) == '\t' || c == '\n')
4142

42-
char advance_char (char **c, int *col, int *row)
43+
char
44+
advance_char (char **c, int *col, int *row)
4345
{
4446
(*c)++;
4547

@@ -55,12 +57,11 @@ char advance_char (char **c, int *col, int *row)
5557
int
5658
parse (int fd, int len, const char *error)
5759
{
58-
char *c;
60+
char *c, *file;
5961
Token current_token;
6062
Element *list;
6163
Element *current_element;
62-
int is_start_of_line = 1;
63-
int row, col;
64+
int is_start_of_line = 1, row, col;
6465

6566
#define next_element() \
6667
current_element++; \
@@ -84,7 +85,7 @@ parse (int fd, int len, const char *error)
8485

8586
current_element->type = NONE;
8687

87-
c = (char *) mmap (NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
88+
file = c = (char *) mmap (NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
8889

8990
if (c == MAP_FAILED)
9091
return 0;
@@ -95,15 +96,15 @@ parse (int fd, int len, const char *error)
9596

9697
switch (*c) {
9798
case '{':
98-
finish_none_element ();
99-
100-
if (!is_start_of_line)
99+
// only parse if it's the very first element
100+
if (list != current_element)
101101
break;
102102

103+
finish_none_element ();
104+
103105
current_element->type = HEADER;
104106
current_element->data = c;
105107

106-
// just assume header and skip for now
107108
while (next_char () != '}') {
108109
if (*c == '\0') {
109110
error = "Header not terminated";
@@ -117,6 +118,45 @@ parse (int fd, int len, const char *error)
117118
next_char ();
118119
next_element ();
119120
break;
121+
case '=':
122+
{
123+
char *linebreak, *cur, *ret, *prev;
124+
int prev_len;
125+
126+
if (!is_start_of_line)
127+
break;
128+
129+
if (current_element->len < 1)
130+
break;
131+
132+
cur = current_element->data;
133+
while ((ret = strstr (cur, "\n"))) {
134+
cur = ret + 1;
135+
if (ret >= current_element->data + current_element->len - 1) {
136+
ret = prev;
137+
break;
138+
}
139+
140+
prev = ret;
141+
}
142+
143+
if (!ret)
144+
break;
145+
146+
prev_len = current_element->len;
147+
current_element->len = ret - current_element->data;
148+
149+
finish_none_element ();
150+
151+
current_element->type = HEADING_1;
152+
current_element->data = (char *) ret;
153+
current_element->len = c - ret - 1;
154+
155+
while (*c == '=') next_char ();
156+
157+
next_element ();
158+
}
159+
break;
120160
case '*':
121161
finish_none_element ();
122162

@@ -241,6 +281,9 @@ parse (int fd, int len, const char *error)
241281
printf ("%i, %.*s\n", i->type, i->len, i->data);
242282
}
243283

284+
if (munmap (file, len) != 0)
285+
return 0;
286+
244287
return 1;
245288
}
246289

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)