handling header blocks
[taskasaur.git] / parser.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <md4c.h>
5
6 typedef struct TodoItem {
7     char* name;
8     char* description;
9     char* due;
10     char** items;
11 } TodoItem;
12
13 char* read_file(char* file_name, long* size);
14
15 /* callbacks to parser */
16 int enter_block(MD_BLOCKTYPE type, void* detail, void* userdata);
17 int leave_block(MD_BLOCKTYPE type, void* detail, void* userdata);
18 int enter_span(MD_SPANTYPE type, void* detail, void* userdata);
19 int leave_span(MD_SPANTYPE type, void* detail, void* userdata);
20 int text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata);
21 void debug_log(const char* msg, void* userdata);
22 void syntax(void);
23
24 const MD_PARSER parser = {
25     0,
26     MD_DIALECT_COMMONMARK,
27     &enter_block,
28     &leave_block,
29     &enter_span,
30     &leave_span,
31     &text,
32     &debug_log,
33     &syntax
34 };
35
36 int
37 main(int argc, char** argv)
38 {
39     const char* input_buffer;
40     long input_size;
41
42     input_buffer = read_file("test_board.md", &input_size);
43
44     int out = md_parse(input_buffer, input_size, &parser, NULL);
45
46     return 0;    
47 }
48
49 char*
50 read_file(char* file_name, long* size) 
51 { // apparently using seek isnt the greatest, may change to chunk reading later
52     FILE* file;
53     char* output;
54     long fsize;
55
56     file = fopen(file_name, "r");
57     if (file == NULL) {
58         printf("Something went wrong opening file\n");
59         return NULL;
60     }
61
62     fseek(file, 0, SEEK_END);
63     fsize = ftell(file);
64     fseek(file, 0, SEEK_SET);
65
66     output = malloc(fsize+1); // maybe error check malloc
67     fread(output, 1, fsize, file);
68     if (ferror(file)) {
69         printf("Something went wrong reading file\n");
70         fclose(file);
71         free(output);
72         return NULL;
73     }
74     output[fsize] = 0; // add null terminator
75     
76     /* clean up */
77     fclose(file);
78
79     /* return */
80     *size = fsize;
81     return output;
82 }
83
84 int
85 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
86 {
87     switch (type) {
88         case MD_BLOCK_H:
89             printf("Found h%d block\n", ((MD_BLOCK_H_DETAIL*)detail)->level);
90             break;
91
92         // no need for default case for now :>
93     }
94     return 0;
95 }
96
97 int
98 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
99 {
100     return 0;
101 }
102
103 int
104 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
105 {
106     return 0;
107 }
108
109 int
110 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
111 {
112     return 0;
113 }
114
115 int
116 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
117     return 0;
118 }
119
120 void
121 debug_log(const char* msg, void* userdata)
122 {
123     printf(msg);
124     return;
125 }
126
127 void 
128 syntax(void)
129 {
130     return;
131 }