diff options
Diffstat (limited to 'more.c')
-rw-r--r-- | more.c | 199 |
1 files changed, 102 insertions, 97 deletions
@@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * Mini more implementation for busybox * @@ -45,19 +46,20 @@ static const char more_usage[] = "more [file ...]\n"; # define stty(fd,argp) tcsetattr(fd,TCSANOW,argp) #endif - FILE *cin; - struct termios initial_settings, new_settings; +FILE *cin; +struct termios initial_settings, new_settings; - void gotsig(int sig) { - stty(fileno(cin), &initial_settings); - fprintf(stdout, "\n"); - exit( TRUE); - } +void gotsig(int sig) +{ + stty(fileno(cin), &initial_settings); + fprintf(stdout, "\n"); + exit(TRUE); +} #endif -#define TERMINAL_WIDTH 79 /* not 80 in case terminal has linefold bug */ +#define TERMINAL_WIDTH 79 /* not 80 in case terminal has linefold bug */ #define TERMINAL_HEIGHT 24 @@ -72,118 +74,121 @@ static int terminal_width = 0, terminal_height = 0; extern int more_main(int argc, char **argv) { - int c, lines=0, input=0; - int next_page=0; - struct stat st; - FILE *file; + int c, lines = 0, input = 0; + int next_page = 0; + struct stat st; + FILE *file; + #ifdef BB_FEATURE_AUTOWIDTH - struct winsize win = {0,0}; + struct winsize win = { 0, 0 }; #endif - argc--; - argv++; - - if ( argc > 0 && (strcmp(*argv,"--help")==0 || strcmp(*argv,"-h")==0) ) { - usage (more_usage); - } - do { - if (argc==0) { - file = stdin; - } - else - file = fopen(*argv, "r"); + argc--; + argv++; - if (file == NULL) { - perror(*argv); - exit(FALSE); + if (argc > 0 + && (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) { + usage(more_usage); } - fstat(fileno(file), &st); + do { + if (argc == 0) { + file = stdin; + } else + file = fopen(*argv, "r"); + + if (file == NULL) { + perror(*argv); + exit(FALSE); + } + fstat(fileno(file), &st); #ifdef BB_FEATURE_USE_TERMIOS - cin = fopen("/dev/tty", "r"); - if (!cin) - cin = fopen("/dev/console", "r"); + cin = fopen("/dev/tty", "r"); + if (!cin) + cin = fopen("/dev/console", "r"); #ifdef USE_OLD_TERMIO - ioctl(fileno(cin),TCGETA,&initial_settings); + ioctl(fileno(cin), TCGETA, &initial_settings); #else - tcgetattr(fileno(cin),&initial_settings); + tcgetattr(fileno(cin), &initial_settings); #endif - new_settings = initial_settings; - new_settings.c_lflag &= ~ICANON; - new_settings.c_lflag &= ~ECHO; - stty(fileno(cin), &new_settings); - -#ifdef BB_FEATURE_AUTOWIDTH - ioctl(fileno(stdout), TIOCGWINSZ, &win); - if (win.ws_row > 4) - terminal_height = win.ws_row - 2; - if (win.ws_col > 0) - terminal_width = win.ws_col - 1; + new_settings = initial_settings; + new_settings.c_lflag &= ~ICANON; + new_settings.c_lflag &= ~ECHO; + stty(fileno(cin), &new_settings); + +#ifdef BB_FEATURE_AUTOWIDTH + ioctl(fileno(stdout), TIOCGWINSZ, &win); + if (win.ws_row > 4) + terminal_height = win.ws_row - 2; + if (win.ws_col > 0) + terminal_width = win.ws_col - 1; #endif - (void) signal(SIGINT, gotsig); - (void) signal(SIGQUIT, gotsig); - (void) signal(SIGTERM, gotsig); + (void) signal(SIGINT, gotsig); + (void) signal(SIGQUIT, gotsig); + (void) signal(SIGTERM, gotsig); #endif - while ((c = getc(file)) != EOF) { - if ( next_page ) { - int len=0; - next_page = 0; - lines=0; - len = fprintf(stdout, "--More-- "); - if (file != stdin) { - len += fprintf(stdout, "(%d%% of %ld bytes)", - (int) (100*( (double) ftell(file) / (double) st.st_size )), - st.st_size); - } - len += fprintf(stdout, "%s", + while ((c = getc(file)) != EOF) { + if (next_page) { + int len = 0; + + next_page = 0; + lines = 0; + len = fprintf(stdout, "--More-- "); + if (file != stdin) { + len += fprintf(stdout, "(%d%% of %ld bytes)", + (int) (100 * + ((double) ftell(file) / + (double) st.st_size)), + st.st_size); + } + len += fprintf(stdout, "%s", #ifdef BB_FEATURE_USE_TERMIOS - "" + "" #else - "\n" + "\n" #endif - ); + ); - fflush(stdout); - input = getc( cin); + fflush(stdout); + input = getc(cin); #ifdef BB_FEATURE_USE_TERMIOS - /* Erase the "More" message */ - while(--len >= 0) - putc('\b', stdout); - while(++len <= terminal_width) - putc(' ', stdout); - while(--len >= 0) - putc('\b', stdout); - fflush(stdout); + /* Erase the "More" message */ + while (--len >= 0) + putc('\b', stdout); + while (++len <= terminal_width) + putc(' ', stdout); + while (--len >= 0) + putc('\b', stdout); + fflush(stdout); #endif - } - if (c == '\n' ) { - switch(input) { - case 'q': - goto end; - case '\n': - /* increment by just one line if we are at - * the end of this line*/ - next_page = 1; - break; + } + if (c == '\n') { + switch (input) { + case 'q': + goto end; + case '\n': + /* increment by just one line if we are at + * the end of this line*/ + next_page = 1; + break; + } + if (++lines == terminal_height) + next_page = 1; + } + putc(c, stdout); } - if ( ++lines == terminal_height ) - next_page = 1; - } - putc(c, stdout); - } - fclose(file); - fflush(stdout); + fclose(file); + fflush(stdout); - argv++; - } while (--argc > 0); -end: + argv++; + } while (--argc > 0); + end: #ifdef BB_FEATURE_USE_TERMIOS - gotsig(0); -#endif - exit(TRUE); + gotsig(0); +#endif + exit(TRUE); } - |