#include "articles.h" #ifdef CONFIG_ARTICLES //TODO add checkout on size of art it will fix, // warn about cutted images int bbs_article( term_screen *ts, const char *fname ) { int ret=-1; int i=0; 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; } bbs_log_article( NULL ); if ( fname != NULL ) { f = fopen( fname, "r" ); if ( f == NULL ) { printf("Cannot open article file\n"); return -1; } fret = 1; i = 0; while ( (fret > 0) && (quit_loop == 0) ) { fret = getline( &str, &str_size, f ); if ( fret > 0 ) { printf("%s", str); i += 1; } //if ( ((i > 0) && (fret == -1)) || // ((fret > 0) && (i > max_x-1)) ) if ( i >= max_y-1 ) { printf("(N)ext,(D)ump,(Q)uit:"); ret_len = getline( &in_buf, &in_size, stdin ); if ( ret_len > 0 ) { 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': { 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 ); } } i = 0; break; default: printf("Try more\n"); } } } if ( (fret == -1) ) break; } fclose( f ); ret = 0; } return ret; } //just for full fill libc example static int dir_article_selector (const struct dirent *unused) { return 1; } 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; //list dir struct stat path_node; struct dirent **eps; int n; //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 ) { //should have some bugs be carefull n = scandir( dir_name, &eps, dir_article_selector, alphasort ); if ( n >= 0) { int cnt; for ( cnt=0; cntd_name ); char *cnct_path = malloc( tmp_size + strlen(dir_name)+1); memcpy( cnct_path, dir_name, strlen(dir_name)); memcpy( cnct_path+sizeof(dir_name)+2, eps[cnt]->d_name, tmp_size+1 ); //check if its file if ( stat( cnct_path, &path_node ) == 0 ) { if ( path_node.st_mode & S_IFREG ) { llist_push( dir_list, cnct_path ); } } } } else { printf("Err\n"); ERROR("Cannot open article directory\n"); } ret = 0; } i = 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 ) { char ch = in_buf[0]; switch( ch ) { case 'q': case 'Q': quit_loop = 1; break; case 'l': case 'L': { //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; } } break; case 'r': case 'R': { //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 ) { if ( cnt == article_number ) { bbs_article( ts, iter->val ); break; } cnt += 1; iter = iter->next; } } } break; default: printf("Try more\n"); } } } llist_free( dir_list ); return ret; } #endif