#include "todo.h" #ifdef CONFIG_TODO int bbs_todo( term_screen *ts, const char *fname) { int ret=0; int quit_loop=0; int menu_input = 0; char menu_cmd = 0; int row = 0; const char *todo_fname = NULL; if ( ts == NULL ) return ret; if ( fname == NULL ) { todo_fname = CONFIG_TODO_DEFAULT_FILE; } else { todo_fname = fname; } List *todo_list = llist_new(); bbs_todo_load( todo_fname, todo_list ); //log that someone use todo bbs_log( NULL, "visited TODO" ); while( (quit_loop == 0) ) { term_clr_scr( ts ); term_cur_set_c( ts, 0 ); term_printf( ts, "(A)dd,(R)emove,(Q)uit"); //dispaly todo list row = term_get_maxrow( ts ); term_cur_set_c( ts, 0 ); { struct ListNode *iter=todo_list->first; int cnt = 1; while ( (iter != NULL) || ( cnt > row - 2)) { term_cur_set_c( ts, 0 ); term_cur_set_r( ts, 1+cnt ); term_printf( ts, "[%02d] -> %s\n", cnt, (char *)iter->val); cnt += 1; iter = iter->next; } } term_cur_set_c( ts, 0 ); term_cur_set_r( ts, term_get_maxrow( ts ) ); term_printf( ts, ":"); menu_input = term_getc( ts ); //if something whent wrong dont know why, need to get some test case if ( menu_input == -1 ) continue; menu_cmd = (char)menu_input; switch( menu_cmd ) { case 'q': case 'Q': quit_loop = 1; break; case 'a': case 'A': bbs_todo_add( ts, todo_list, todo_fname ); break; case 's': case 'S': { struct ListNode *iter=todo_list->first; int cnt = 1; while (iter != NULL) { term_printf( ts, "[%02d] -> %s\n", cnt, (char *)iter->val); cnt += 1; iter = iter->next; } } break; case 'r': case 'R': { bbs_todo_remove( ts, todo_list, todo_fname ); } break; default: term_printf( ts, "Try more\n"); } } llist_free( todo_list ); return ret; } int bbs_todo_add( term_screen *ts, List *todo, const char *fname) { int ret = -1; int fret = -1; const int buf_size = 64; char buf[buf_size]; if ( ts == NULL ) return -1; if ( fname == NULL ) return -1; term_clr_scr( ts ); term_cur_set_c( ts, 0 ); term_cur_set_r( ts, 0 ); term_printf( ts, "Add new todo task:\n"); memset( buf, 0, buf_size ); term_cur_set_c( ts, 0 ); fret = term_readline( ts, buf, buf_size, READLINE_TEXT ); if ( fret > 0 ) { char *l = malloc( fret+1 ); memcpy( l, buf, fret ); l[fret]='\0'; llist_push( todo, l ); bbs_todo_save( fname, todo ); ret = 0; } else { return -1; } return ret; } int bbs_todo_remove( term_screen *ts, List *todo, const char *fname ) { int ret=-1; if ( ts == NULL ) return ret; if ( todo == NULL ) return ret; if ( fname == NULL ) return ret; term_clr_scr( ts ); term_cur_set_c( ts, 0 ); term_cur_set_r( ts, 0 ); term_printf( ts, "Remove entry from todo:\n"); return ret; } int bbs_todo_save( const char *fname, List *todo ) { FILE *f; struct ListNode *iter=todo->first; int count_max = 0; f = fopen( fname, "w" ); if ( f == NULL ) { return -1; } while ( iter != NULL ) { netbyte_store nb; nb_u8arr td; int er=0; uint8_t *res=NULL; size_t str_size = strlen( iter->val ); char *str = malloc( str_size ); memcpy( str, iter->val, str_size ); nb_init( &nb ); er = nb_u8arr_create( &td, str_size, (uint8_t *)str ); if (er) printf("er create u8arr: %d\n",er); er = nb_add_u8arr( &nb, &td ); if (er) printf("er add u8arr: %d\n",er); res = nb_create( &nb ); fwrite( res, 1, nb.size, f ); free( str ); free( res ); iter = iter->next; if ( count_max > 128 ) break; count_max += 1; } fclose( f ); return 0; } int bbs_todo_load( const char *fname, List *todo ) { FILE *f; int i; __nb_type t; netbyte_store nb; nb_init( &nb ); f = fopen( fname, "r" ); if ( f == NULL ) { return -1; } while (nb_fread( &nb, fileno(f) ) == 0) { for ( i=0; ilen ); memcpy( u, l->val, l->len ); llist_push( todo, u ); } } } fclose( f ); return 0; } #endif