#include "twit.h" #ifdef CONFIG_TWIT int bbs_twit( term_screen *ts, char *fn ) { int ret = 0; char *fname = CONFIG_TWIT_DEFAULT_FILE; int menu_input = 0; char menu_cmd; int row; int quit_loop = 0; if ( fn != NULL ) fname = fn; List *twit_list = llist_new(); f_file *file = f_file_open( fname, F_FILE_READ ); if ( file != NULL ) { const int l_s = 128; int r_v; { cycle0:; char *l = malloc( l_s ); r_v = f_file_readl( file, l_s, l ); if ( r_v < 0 ) goto exit_cycle0; l[r_v] = '\0'; llist_push( twit_list, l ); goto cycle0; exit_cycle0:; if ( l != NULL ) free( l ); } } f_file_close( file ); //log that someone use twit bbs_log( NULL, "visited TWIT" ); while( (quit_loop == 0) ) { term_clr_scr( ts ); term_cur_set_c( ts, 0 ); term_printf( ts, "(A)dd,(Q)uit"); //dispaly todo list row = term_get_maxrow( ts ); term_cur_set_c( ts, 0 ); { struct ListNode *iter=twit_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_twit_add( ts, twit_list, fname ); break; default: term_printf( ts, "Try more\n"); } } llist_free( twit_list ); return ret; } int bbs_twit_add( term_screen *ts, List *twit, 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, "Put new twit:\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( twit, l ); bbs_twit_save( fname, twit ); ret = 0; } else { return -1; } if ( ret == 0 ) if ( llist_length(twit) > TWIT_MAX_MESSAGES ) { char *ptr = llist_popf( twit ); if ( ptr != NULL ) free( ptr ); } return ret; } int bbs_twit_save( const char *fname, List *twit ) { int ret=-1; f_file *f=NULL; struct ListNode *iter=twit->first; f = f_file_open( fname, F_FILE_WRITE ); while ( iter != NULL ) { size_t str_size=strlen( iter->val )+2; char *str = malloc( str_size ); memcpy( str, iter->val, str_size-2); str[str_size-1] = '\0'; str[str_size-2] = '\n'; f_file_write( f, strlen(str), str ); printf( "%s\n", str ); fflush( stdout ); free( str ); iter = iter->next; } f_file_close( f ); return ret; } #endif