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.cur_todolist = NULL;
94 state.cur_todoitem = NULL;
96 new_board = malloc(sizeof(Board));
97 new_board->todolist_list = malloc(0);
98 new_board->todolist_count = 0;
99 state.board = new_board;
101 md_parse(input_buffer, input_size, &parser, &state);
104 exit_todolist(&state);
106 free((char*)input_buffer);
112 enter_todolist(State* state, char* list_name)
114 TodoList* new_todolist;
116 new_todolist = malloc(sizeof(TodoList));
117 new_todolist->list_name = list_name;
118 new_todolist->item_list = malloc(0);
119 new_todolist->item_count = 0;
121 state->cur_todolist = new_todolist;
125 exit_todolist(State* state)
127 #define sb state->board
129 if (state->cur_todolist == NULL) return;
131 exit_todoitem(state);
133 sb->todolist_count += 1;
134 sb->todolist_list = realloc(sb->todolist_list, sb->todolist_count*sizeof(TodoList*));
135 sb->todolist_list[sb->todolist_count-1] = state->cur_todolist;
136 state->cur_todolist = NULL;
141 enter_todoitem(State* state, char* item_name)
143 TodoItem* new_todoitem;
145 new_todoitem = malloc(sizeof(TodoItem));
146 new_todoitem->item_name = item_name;
147 new_todoitem->description = NULL;
148 new_todoitem->due = NULL;
149 new_todoitem->subtask_list = malloc(0);
150 new_todoitem->subtask_count = 0;
152 state->cur_todoitem = new_todoitem;
157 exit_todoitem(State* state)
159 #define st state->cur_todolist
162 TodoItem** item_list;
164 if (state->cur_todoitem == NULL) return;
166 /* append current item to todo list */
167 todolist = state->cur_todolist;
168 item_list = todolist->item_list;
171 st->item_list = realloc(st->item_list, st->item_count*sizeof(TodoItem*));
172 st->item_list[st->item_count-1] = state->cur_todoitem;
173 state->cur_todoitem = NULL;
178 set_description(State* state, char* description)
180 state->cur_todoitem->description = description;
184 set_due(State* state, char* due)
190 add_subtask(State* state, char* subtask_name, SubTaskState subtask_state)
192 SubTask* new_subtask;
193 SubTask** subtask_list;
195 /* create new subtask */
196 new_subtask = malloc(sizeof(SubTask));
197 new_subtask->subtask_name = subtask_name;
198 new_subtask->done = subtask_state;
201 subtask_list = state->cur_todoitem->subtask_list;
203 state->cur_todoitem->subtask_count += 1;
204 subtask_list = realloc(subtask_list, state->cur_todoitem->subtask_count*sizeof(SubTask*));
205 subtask_list[state->cur_todoitem->subtask_count-1] = new_subtask;
207 state->cur_todoitem->subtask_list = subtask_list;
212 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
218 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
221 state = (State*)userdata;
227 MD_BLOCK_H_DETAIL* h_detail;
228 h_detail = ((MD_BLOCK_H_DETAIL*)detail);
230 switch(h_detail->level) {
236 exit_todolist(state);
237 enter_todolist(state, state->last_block_text);
241 exit_todoitem(state);
242 enter_todoitem(state, state->last_block_text);
249 set_description(state, state->last_block_text);
253 MD_BLOCK_LI_DETAIL* li_detail;
256 li_detail = ((MD_BLOCK_LI_DETAIL*)detail);
258 assert(li_detail->is_task != 0); // all lists should be task lists
260 done = li_detail->task_mark == ' ' ? SubTaskState_todo : SubTaskState_done;
262 add_subtask(state, state->last_block_text, done);
265 // no need for default case for now :>
271 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
279 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
282 state = (State*)userdata;
286 printf("date, %s\n", state->last_block_text);
293 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
298 state = (State*)userdata;
300 content = malloc(size*sizeof(char)+1);
301 memcpy(content, text, size);
304 /* printf("%s\n", content); */
305 state->last_block_text = content;
311 debug_log(const char* msg, void* userdata)