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 = {
48 log_todo(Board* board)
50 for (int i = 0; i < board->todolist_count; i++) {
52 printf("List =-=-=-=-=-==-=-=-=-=-=-\n");
53 todolist = board->todolist_list[i];
54 printf("List name: %s\n", todolist->list_name);
55 printf("Num of items: %d\n", todolist->item_count);
57 for (int j = 0; j < todolist->item_count; j++) {
59 printf("Item =-=-=-=-=-\n");
60 todoitem = todolist->item_list[j];
61 printf("Item name: %s\n", todoitem->item_name);
62 printf("Description: %s\n", todoitem->description);
63 printf("Num of subtasks: %d\n", todoitem->subtask_count);
65 for (int k = 0; k < todoitem->subtask_count; k++) {
69 subtask = todoitem->subtask_list[k];
70 printf("Subtask: %s, %d\n", subtask->subtask_name, subtask->done);
77 begin_parse(char* board_path)
79 const char* input_buffer;
84 /* read entire file */
85 input_buffer = read_file(board_path, &input_size);
88 state.cur_todolist = NULL;
89 state.cur_todoitem = NULL;
91 new_board = malloc(sizeof(Board));
92 new_board->todolist_list = malloc(0);
93 new_board->todolist_count = 0;
94 state.board = new_board;
96 md_parse(input_buffer, input_size, &parser, &state);
99 exit_todolist(&state);
101 free((char*)input_buffer);
107 read_file(char* file_name, long* size)
108 { // apparently using seek isnt the greatest, may change to chunk reading later
113 file = fopen(file_name, "r");
115 printf("Something went wrong opening file\n");
119 fseek(file, 0, SEEK_END);
121 fseek(file, 0, SEEK_SET);
123 output = malloc(fsize+1); // maybe error check malloc
124 fread(output, 1, fsize, file);
126 printf("Something went wrong reading file\n");
131 output[fsize] = 0; // add null terminator
142 enter_todolist(State* state, char* list_name)
144 TodoList* new_todolist;
146 new_todolist = malloc(sizeof(TodoList));
147 new_todolist->list_name = list_name;
148 new_todolist->item_list = malloc(0);
149 new_todolist->item_count = 0;
151 state->cur_todolist = new_todolist;
155 exit_todolist(State* state)
157 #define sb state->board
159 if (state->cur_todolist == NULL) return;
161 exit_todoitem(state);
163 sb->todolist_count += 1;
164 sb->todolist_list = realloc(sb->todolist_list, sb->todolist_count*sizeof(TodoList*));
165 sb->todolist_list[sb->todolist_count-1] = state->cur_todolist;
166 state->cur_todolist = NULL;
171 enter_todoitem(State* state, char* item_name)
173 TodoItem* new_todoitem;
175 new_todoitem = malloc(sizeof(TodoItem));
176 new_todoitem->item_name = item_name;
177 new_todoitem->description = NULL;
178 new_todoitem->due = NULL;
179 new_todoitem->subtask_list = malloc(0);
180 new_todoitem->subtask_count = 0;
182 state->cur_todoitem = new_todoitem;
187 exit_todoitem(State* state)
189 #define st state->cur_todolist
192 TodoItem** item_list;
194 if (state->cur_todoitem == NULL) return;
196 /* append current item to todo list */
197 todolist = state->cur_todolist;
198 item_list = todolist->item_list;
201 st->item_list = realloc(st->item_list, st->item_count*sizeof(TodoItem*));
202 st->item_list[st->item_count-1] = state->cur_todoitem;
203 state->cur_todoitem = NULL;
208 set_description(State* state, char* description)
210 state->cur_todoitem->description = description;
214 set_due(State* state, char* due)
220 add_subtask(State* state, char* subtask_name, SubTaskState subtask_state)
222 SubTask* new_subtask;
223 SubTask** subtask_list;
225 /* create new subtask */
226 new_subtask = malloc(sizeof(SubTask));
227 new_subtask->subtask_name = subtask_name;
228 new_subtask->done = subtask_state;
231 subtask_list = state->cur_todoitem->subtask_list;
233 state->cur_todoitem->subtask_count += 1;
234 subtask_list = realloc(subtask_list, state->cur_todoitem->subtask_count*sizeof(SubTask*));
235 subtask_list[state->cur_todoitem->subtask_count-1] = new_subtask;
237 state->cur_todoitem->subtask_list = subtask_list;
242 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
248 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
251 state = (State*)userdata;
257 MD_BLOCK_H_DETAIL* h_detail;
258 h_detail = ((MD_BLOCK_H_DETAIL*)detail);
260 switch(h_detail->level) {
266 exit_todolist(state);
267 enter_todolist(state, state->last_block_text);
271 exit_todoitem(state);
272 enter_todoitem(state, state->last_block_text);
279 set_description(state, state->last_block_text);
283 MD_BLOCK_LI_DETAIL* li_detail;
286 li_detail = ((MD_BLOCK_LI_DETAIL*)detail);
288 assert(li_detail->is_task != 0); // all lists should be task lists
290 done = li_detail->task_mark == ' ' ? SubTaskState_todo : SubTaskState_done;
292 add_subtask(state, state->last_block_text, done);
295 // no need for default case for now :>
301 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
309 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
312 state = (State*)userdata;
316 printf("date, %s\n", state->last_block_text);
323 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
328 state = (State*)userdata;
330 content = malloc(size*sizeof(char)+1);
331 memcpy(content, text, size);
334 /* printf("%s\n", content); */
335 state->last_block_text = content;
341 debug_log(const char* msg, void* userdata)