working on parser
[taskasaur.git] / parser.c
1
2 #include "headers/parser.h"
3
4 typedef struct State {
5     Board* board;
6     TodoList* cur_todolist;
7     TodoItem* cur_todoitem;
8     /* for use during processing */
9     char* last_block_text;
10 } State;
11
12 char* read_file(char* file_name, long* size);
13
14 /* processing */
15 void enter_todolist();
16 void exit_todolist();
17
18 void enter_todoitem();
19 void exit_todoitem();
20
21 /* callbacks to parser */
22 int enter_block(MD_BLOCKTYPE type, void* detail, void* userdata);
23 int leave_block(MD_BLOCKTYPE type, void* detail, void* userdata);
24 int enter_span(MD_SPANTYPE type, void* detail, void* userdata);
25 int leave_span(MD_SPANTYPE type, void* detail, void* userdata);
26 int text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata);
27 void debug_log(const char* msg, void* userdata);
28 void syntax(void);
29
30 const MD_PARSER parser = {
31     0,
32     MD_DIALECT_COMMONMARK,
33     &enter_block,
34     &leave_block,
35     &enter_span,
36     &leave_span,
37     &text,
38     &debug_log,
39     &syntax
40 };
41
42 char*
43 read_file(char* file_name, long* size) 
44 { // apparently using seek isnt the greatest, may change to chunk reading later
45     FILE* file;
46     char* output;
47     long fsize;
48
49     file = fopen(file_name, "r");
50     if (file == NULL) {
51         printf("Something went wrong opening file\n");
52         return NULL;
53     }
54
55     fseek(file, 0, SEEK_END);
56     fsize = ftell(file);
57     fseek(file, 0, SEEK_SET);
58
59     output = malloc(fsize+1); // maybe error check malloc
60     fread(output, 1, fsize, file);
61     if (ferror(file)) {
62         printf("Something went wrong reading file\n");
63         fclose(file);
64         free(output);
65         return NULL;
66     }
67     output[fsize] = 0; // add null terminator
68     
69     /* clean up */
70     fclose(file);
71
72     /* return */
73     *size = fsize;
74     return output;
75 }
76
77 Board*
78 begin_parse(char* board_path)
79 {
80     const char* input_buffer;
81     long input_size;
82     State* state;
83
84     /* read entire file */
85     input_buffer = read_file(board_path, &input_size);
86
87     /* setup state */
88     state = malloc(sizeof(State));
89     state->cur_todolist = NULL;
90     state->cur_todoitem = NULL;
91
92     state->board = malloc(sizeof(Board));
93     state->board->todolist_list = malloc(0);
94     state->board->todolist_count = 0;
95
96     md_parse(input_buffer, input_size, &parser, state);
97
98     free((char*)input_buffer);
99
100     return state->board;
101 }
102
103 int
104 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
105 {
106     return 0;
107 }
108
109 int
110 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
111 {
112     State* state;
113     state = (State*)userdata;
114
115     switch (type) {
116
117         case MD_BLOCK_H:
118
119             switch(((MD_BLOCK_H_DETAIL*)detail)->level) {
120
121                 case 1:
122                     printf("leave h1, %s\n", state->last_block_text);
123                 
124                 case 2:
125                     printf("leave h2, %s\n", state->last_block_text);
126                     break;
127                 case 3:
128                     printf("leave h3, %s\n", state->last_block_text);
129                     break;
130
131             }
132
133             break;
134
135         // no need for default case for now :>
136     }
137     return 0;
138 }
139
140 int
141 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
142 {
143     return 0;
144 }
145
146 int
147 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
148 {
149     return 0;
150 }
151
152 int
153 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
154
155     State* state;
156     char* content;
157
158     state = (State*)userdata;
159
160     content = malloc(size*sizeof(char)+1);
161     memcpy(content, text, size);
162     content[size] = 0;
163
164     /* printf("%s\n", content); */
165     state->last_block_text = content;
166     
167     return 0;
168 }
169
170 void
171 debug_log(const char* msg, void* userdata)
172 {
173     printf(msg);
174     return;
175 }
176
177 void 
178 syntax(void)
179 {
180     return;
181 }