#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