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 /* append new todolist to board */
136 board = state->board;
137 todolist_list = board->todolist_list;
139 board->todolist_count += 1;
140 todolist_list = realloc(todolist_list, board->todolist_count*sizeof(TodoList*));
141 todolist_list[board->todolist_count-1] = state->cur_todolist;
142 state->cur_todolist = NULL;
145 board->todolist_list = todolist_list;
150 enter_todoitem(State* state, char* item_name)
156 exit_todoitem(State* state)
162 set_description(State* state, char* description)
168 set_due(State* state, char* due)
174 add_subtask(State* state, char* subtask_name, SubTaskState subtask_state)
180 enter_block(MD_BLOCKTYPE type, void* detail, void* userdata)
186 leave_block(MD_BLOCKTYPE type, void* detail, void* userdata)
189 state = (State*)userdata;
195 switch(((MD_BLOCK_H_DETAIL*)detail)->level) {
198 printf("leave h1, %s\n", state->last_block_text);
201 exit_todolist(state);
202 enter_todolist(state, state->last_block_text);
203 printf("leave h2, %s\n", state->last_block_text);
206 printf("leave h3, %s\n", state->last_block_text);
214 printf("blockquote, %s\n", state->last_block_text);
218 printf("todo, %s\n", state->last_block_text);
221 // no need for default case for now :>
227 enter_span(MD_SPANTYPE type, void* detail, void* userdata)
235 leave_span(MD_SPANTYPE type, void* detail, void* userdata)
238 state = (State*)userdata;
242 printf("date, %s\n", state->last_block_text);
249 text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata){
254 state = (State*)userdata;
256 content = malloc(size*sizeof(char)+1);
257 memcpy(content, text, size);
260 /* printf("%s\n", content); */
261 state->last_block_text = content;
267 debug_log(const char* msg, void* userdata)