+ state.cur_todolist = NULL;
+ state.cur_todoitem = NULL;
+
+ new_board = malloc(sizeof(Board));
+ new_board->todolist_list = malloc(0);
+ new_board->todolist_count = 0;
+ state.board = new_board;
+
+ md_parse(input_buffer, input_size, &parser, &state);
+
+ /* finish calls */
+ exit_todolist(&state);
+
+ free((char*)input_buffer);
+
+ return state.board;
+}
+
+void
+enter_todolist(State* state, char* list_name)
+{
+ TodoList* new_todolist;
+
+ new_todolist = malloc(sizeof(TodoList));
+ new_todolist->list_name = list_name;
+ new_todolist->item_list = malloc(0);
+ new_todolist->item_count = 0;
+
+ state->cur_todolist = new_todolist;
+}
+
+void
+exit_todolist(State* state)
+{
+ #define sb state->board
+
+ if (state->cur_todolist == NULL) return;
+
+ exit_todoitem(state);
+
+ sb->todolist_count += 1;
+ sb->todolist_list = realloc(sb->todolist_list, sb->todolist_count*sizeof(TodoList*));
+ sb->todolist_list[sb->todolist_count-1] = state->cur_todolist;