summaryrefslogtreecommitdiffstats
path: root/articles.c
diff options
context:
space:
mode:
authorFreeArtMan <dos21h@gmail.com>2015-01-09 17:00:35 +0900
committerFreeArtMan <dos21h@gmail.com>2015-01-09 17:00:35 +0900
commit3e989921c29534d38dbf6009851389fc4f4e226e (patch)
tree0f9e9c97e87c90ce90c596b5a9c0230d063e2952 /articles.c
parent8522c8656c313a9a3b956b0e6c816a8e54d15b7b (diff)
downloadmicrobbs-3e989921c29534d38dbf6009851389fc4f4e226e.tar.gz
microbbs-3e989921c29534d38dbf6009851389fc4f4e226e.zip
Mem leak fixes, warning fixes
Diffstat (limited to 'articles.c')
-rw-r--r--articles.c227
1 files changed, 118 insertions, 109 deletions
diff --git a/articles.c b/articles.c
index e7586dc..b572e8a 100644
--- a/articles.c
+++ b/articles.c
@@ -12,21 +12,10 @@ int bbs_article( term_screen *ts, const char *fname )
FILE *f;
size_t str_size=0, fret=1;
char *str=NULL;
- size_t in_size=0;
- char *in_buf=NULL;
- int max_x, max_y, ret_len;
int quit_loop=0;
-
- if ( ts->mode == SCREEN_MODE_80x24 )
- {
- max_x = 80;
- max_y = 24;
- } else
- {
- printf("Unknown mode\n");
- max_x = 80;
- max_y = 24;
- }
+ int max_row=0;
+ int menu_input=0;
+ char menu_cmd=0;
bbs_log_article( NULL );
@@ -39,6 +28,9 @@ int bbs_article( term_screen *ts, const char *fname )
return -1;
}
+ term_clr_scr( ts );
+ max_row = term_get_maxrow( ts );
+
fret = 1;
i = 0;
while ( (fret > 0) && (quit_loop == 0) )
@@ -46,55 +38,63 @@ int bbs_article( term_screen *ts, const char *fname )
fret = getline( &str, &str_size, f );
if ( fret > 0 )
{
+ term_cur_set_c( ts, 0 );
printf("%s", str);
i += 1;
}
- //if ( ((i > 0) && (fret == -1)) ||
- // ((fret > 0) && (i > max_x-1)) )
- if ( i >= max_y-1 )
+ if ( i >= max_row )
{
- printf("(N)ext,(D)ump,(Q)uit:");
- ret_len = getline( &in_buf, &in_size, stdin );
- if ( ret_len > 0 )
+ term_cur_set_c( ts, 0 );
+ term_cur_set_r( ts, max_row );
+ printf("(N)ext,(D)ump,(Q)uit:"); fflush( stdout );
+
+ 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 )
{
- char ch = in_buf[0];
- switch( ch )
- {
- case 'q':
- case 'Q':
- quit_loop = 1;
- break;
- case 'n':
- case 'N':
- i = 0;
- break;
- //dump whole file to the screen
- case 'd':
- case 'D':
+ case 'q':
+ case 'Q':
+ quit_loop = 1;
+ break;
+ case 'n':
+ case 'N':
+ i = 0;
+ break;
+ //dump whole file to the screen
+ case 'd':
+ case 'D':
+ {
+ char *dump_line=NULL;
+ size_t dump_line_size=0;
+ size_t tmp_size=-1;
+ fseek( f, 0, SEEK_SET );
+ while( (tmp_size = getline(&dump_line, &dump_line_size, f)) != -1 )
{
- char tmp_buf[81];
- size_t tmp_size;
- fseek( f, 0, SEEK_SET );
- while ( (tmp_size = fread( &tmp_buf, 1, 80, f )) > 0 )
- {
- tmp_buf[ tmp_size ] = 0;
- printf( "%s", tmp_buf );
- }
+ term_cur_set_c( ts, 0 );
+ printf("%s", dump_line);
}
- i = 0;
- break;
- default:
- printf("Try more\n");
- }
+ FREE( dump_line );
+ term_getc( ts );
+ }
+ i = 0;
+ break;
+ default:
+ printf("Try more\n");
}
}
if ( (fret == -1) )
+ term_getc( ts );
+ if ( (fret == -1) )
break;
}
-
+ FREE( str );
fclose( f );
ret = 0;
}
@@ -112,14 +112,9 @@ static int dir_article_selector (const struct dirent *unused)
int bbs_article_list( term_screen *ts, const char *dir_name )
{
int ret=-1;
- int max_x=-1, max_y=-1;
- size_t str_size=0,fret=-1;
- int ret_len;
- char *str=NULL;
- size_t in_size=0;
- char *in_buf=NULL;
int quit_loop=0;
- int i;
+ int menu_input = 0;
+ char menu_cmd = 0;
//list dir
struct stat path_node;
@@ -129,17 +124,6 @@ int bbs_article_list( term_screen *ts, const char *dir_name )
//get all articles names in list and use list every time needed
List *dir_list = llist_new();
- if ( ts->mode == SCREEN_MODE_80x24 )
- {
- max_x = 80;
- max_y = 24;
- } else
- {
- printf("Unknown mode\n");
- max_x = 80;
- max_y = 24;
- }
-
bbs_log_article_list( NULL );
if ( dir_name != NULL )
@@ -163,9 +147,17 @@ int bbs_article_list( term_screen *ts, const char *dir_name )
if ( path_node.st_mode & S_IFREG )
{
llist_push( dir_list, cnct_path );
+ } else
+ {
+ free( cnct_path );
}
+ } else
+ {
+ free( cnct_path );
}
+ free( eps[cnt] );
}
+ free( eps );
} else
{
printf("Err\n");
@@ -175,60 +167,77 @@ int bbs_article_list( term_screen *ts, const char *dir_name )
}
- i = 0;
+ quit_loop = 0;
while ( (quit_loop == 0) )
{
- printf("(L)ist articles,(R)read article,(Q)uit:");
- ret_len = getline( &in_buf, &in_size, stdin );
- if ( ret_len > 0 )
+ term_clr_scr( ts );
+ term_cur_set_c( ts, 0 );
+ printf("(L)ist articles,(R)read article,(Q)uit");
+ fflush( stdout );
+
+ term_cur_set_c( ts, 0 );
+ term_cur_set_r( ts, term_get_maxrow( ts ) );
+ printf(":"); fflush( stdout );
+
+ 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 )
{
- char ch = in_buf[0];
- switch( ch )
- {
- case 'q':
- case 'Q':
- quit_loop = 1;
- break;
- case 'l':
- case 'L':
+ case 'q':
+ case 'Q':
+ quit_loop = 1;
+ break;
+ case 'l':
+ case 'L':
+ {
+ term_cur_set_r( ts, 2 );
+ //print list of articles
+ struct ListNode *iter=dir_list->first;
+ int cnt = 1;
+ while (iter != NULL)
{
- //print list of articles
- struct ListNode *iter=dir_list->first;
- int cnt = 1;
- while (iter != NULL)
- {
- printf( "%d%s\n", cnt, (char *)iter->val);
- cnt += 1;
- iter = iter->next;
- }
+ term_cur_set_c( ts, 0 );
+ printf( "[%02d] %s\n", cnt, (char *)iter->val);
+ cnt += 1;
+ iter = iter->next;
}
- break;
- case 'r':
- case 'R':
+ term_getc( ts );
+ }
+ break;
+ case 'r':
+ case 'R':
+ {
+ //while there is no more 10 articles use only 1 number
+ //TODO fix that
+ term_cur_set_c( ts, 0 );
+ printf("Input article number 0-9:"); fflush( stdout );
+ int article_input = term_getc( ts );
+ //if something whent wrong dont know why, need to get some test case
+ char article_number = (char)article_input-'0';
+
+ if ( article_number > 0 && article_number < 10)
{
- //while there is no more 10 articles use only 1 number
- //TODO fix that
- int article_number = in_buf[1]-'0';
- if ( article_number > 0 && article_number < 10)
+ struct ListNode *iter = dir_list->first;
+ int cnt = 1;
+ while ( iter != NULL )
{
- struct ListNode *iter = dir_list->first;
- int cnt = 1;
- while ( iter != NULL )
+ if ( cnt == article_number )
{
- if ( cnt == article_number )
- {
- bbs_article( ts, iter->val );
- break;
- }
- cnt += 1;
- iter = iter->next;
+ bbs_article( ts, iter->val );
+ break;
}
+ cnt += 1;
+ iter = iter->next;
}
}
- break;
- default:
- printf("Try more\n");
- }
+ }
+ break;
+ default:
+ printf("Try more\n");
}
}