2 #include "headers/parser.h"
6 TodoList* cur_todolist;
7 TodoItem* cur_todoitem;
8 /* for use during processing */
12 char* read_file(char* file_name, long* size);
15 void enter_todolist(State* state, char* list_name);
16 void exit_todolist(State* state);
18 void enter_todoitem(State* state, char* item_name);
19 void exit_todoitem(State* state);
21 void set_description(State* state, char* description);
22 void set_due(State* state, char* due); // make an acc date struct later
23 void add_subtask(State* state, char* subtask_name, SubTaskState subtask_state);
25 /* callbacks to parser */
26 int enter_block(MD_BLOCKTYPE type, void* detail, void* userdata);
27 int leave_block(MD_BLOCKTYPE type, void* detail, void* userdata);
28 int enter_span(MD_SPANTYPE type, void* detail, void* userdata);
29 int leave_span(MD_SPANTYPE type, void* detail, void* userdata);
30 int text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata);
31 void debug_log(const char* msg, void* userdata);
34 const MD_PARSER parser = {
47 read_file(char* file_name, long* size)
48 { // apparently using seek isnt the greatest, may change to chunk reading later
53 file = fopen(file_name, "r");
55 printf("Something went wrong opening file\n");
59 fseek(file, 0, SEEK_END);
61 fseek(file, 0, SEEK_SET);
63 output = malloc(fsize+1); // maybe error check malloc
64 fread(output, 1, fsize, file);
66 printf("Something went wrong reading file\n");
71 output[fsize] = 0; // add null terminator
82 begin_parse(char* board_path)
84 const char* input_buffer;
89 /* read entire file */
90 input_buffer = read_file(board_path, &input_size);
93 state = malloc(sizeof(State));
94 state->cur_todolist = NULL;
95 state->cur_todoitem = NULL;
97 new_board = malloc(sizeof(Board));
98 new_board->todolist_list = malloc(0);
99 new_board->todolist_count = 0;
100 state->board = new_board;
102 md_parse(input_buffer, input_size, &parser, state);
105 exit_todolist(state);
107 free((char*)input_buffer);
113 enter_todolist(State* state, char* list_name)
115 TodoList* new_todolist;
117 new_todolist = malloc(sizeof(TodoList));
118 new_todolist->list_name = list_name;
119 new_todolist->item_list = malloc(0);
120 new_todolist->item_count = 0;
122 state->cur_todolist = new_todolist;
126 exit_todolist(State* state)
129 TodoList** todolist_list;
131 if (state->cur_todolist == NULL) {
135 exit_todoitem(state);
137 /* append new todolist to board */
138 board = state->board;
139 todolist_list = board->todolist_list;
141 board->todolist_count += 1;
142 todolist_list = realloc(todolist_list, board->todolist_count*sizeof(TodoList*));
143 todolist_list[board->todolist_count-1] = state->cur_todolist;
144 state->cur_todolist = NULL;
147 board->todolist_list = todolist_list;
152 enter_todoitem(State* state, char* item_name)
154 TodoItem* new_todoitem;
156 new_todoitem = malloc(sizeof(TodoItem));
157 new_todoitem->item_name = item_name;
158 new_todoitem->description = NULL;
159 new_todoitem->due = NULL;
160 new_todoitem->subtask_list = malloc(0);
161 new_todoitem->subtask_count = 0;
163 state->cur_todoitem = new_todoitem;
168 exit_todoitem(State* state)
171 TodoItem** item_list;
173 if (state->cur_todoitem == NULL) {
177 /* append current item to todo list */
178 todolist = state->cur_todolist;
179 item_list = todolist->item_list;
181 todolist->item_count += 1;
182 item_list = realloc(item_list, todolist->item_count*sizeof(TodoItem*));
183 item_list[todolist->item_count-1] = state->cur_todoitem;
184 state->cur_todoitem = NULL;
187 todolist->item_list = item_list;
192 set_description(State* state, char* description)
194 state->cur_todoitem->description = description;
198 set_due(State* state, char* due)
204 add_subtask(State* state, char* subtask_name, SubTaskState subtask_state)
206 SubTask* new_subtask;
207 SubTask** subtask_list;
209 /* create new subtask */
210 new_subtask = malloc(sizeof(SubTask));
211 new_subtask->subtask_name = subtask_name;
212 new_subtask->done = subtask_state;
215 subtask_list = state->cur_todoitem->subtask_list;
217 state->cur_todoitem->subtask_count += 1;
218 subtask_list = realloc(subtask_list, state->cur_todoitem->subtask_count*sizeof(SubTask*));
219 subtask_list[state->cur_todoitem->subtask_count-1] = new_subtask;
221 state->cur_todoitem->subtask_list = subtask_list;
226 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
232 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
235 state = (State*)userdata;
241 MD_BLOCK_H_DETAIL* h_detail;
242 h_detail = ((MD_BLOCK_H_DETAIL*)detail);
244 switch(h_detail->level) {
250 exit_todolist(state);
251 enter_todolist(state, state->last_block_text);
255 exit_todoitem(state);
256 enter_todoitem(state, state->last_block_text);
263 set_description(state, state->last_block_text);
267 MD_BLOCK_LI_DETAIL* li_detail;
270 li_detail = ((MD_BLOCK_LI_DETAIL*)detail);
272 assert(li_detail->is_task != 0); // all lists should be task lists
274 done = li_detail->task_mark == ' ' ? SubTaskState_todo : SubTaskState_done;
276 add_subtask(state, state->last_block_text, done);
279 // no need for default case for now :>
285 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
293 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
296 state = (State*)userdata;
300 printf("date, %s\n", state->last_block_text);
307 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
312 state = (State*)userdata;
314 content = malloc(size*sizeof(char)+1);
315 memcpy(content, text, size);
318 /* printf("%s\n", content); */
319 state->last_block_text = content;
325 debug_log(const char* msg, void* userdata)