X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=more.c;h=821427dda35b206a89c7f5b6f9ef7fbb3e56fc7b;hb=3695052813a0c9af6b891387e688fc07e4761c99;hp=772d51b18f8f7ee7ad0a33676c6db19aafd48a4b;hpb=e77ae3a2c0328590b43447550bdb1284650b8236;p=oweals%2Fbusybox.git diff --git a/more.c b/more.c index 772d51b18..821427dda 100644 --- a/more.c +++ b/more.c @@ -1,7 +1,12 @@ /* * Mini more implementation for busybox * - * Copyright (C) 1998 by Erik Andersen + * + * Copyright (C) 1995, 1996 by Bruce Perens . + * + * Latest version blended together by Erik Andersen , + * based on the original more implementation by Bruce, and code from the + * Debian boot-floppies team. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,74 +24,106 @@ * */ - -/* Turning this off makes things a bit smaller (and less pretty) */ -#define BB_MORE_TERM - - - #include "internal.h" #include +#include #include +#include +static const char more_usage[] = "more [file ...]\n"; -static const char more_usage[] = "[file ...]"; - +/* ED: sparc termios is broken: revert back to old termio handling. */ +#ifdef BB_FEATURE_USE_TERMIOS -#ifdef BB_MORE_TERM - #include - #include - #include +#if #cpu(sparc) +# define USE_OLD_TERMIO +# include +# define termios termio +# define stty(fd,argp) ioctl(fd,TCSETAF,argp) +#else +# include +# define stty(fd,argp) tcsetattr(fd,TCSANOW,argp) +#endif FILE *cin; struct termios initial_settings, new_settings; void gotsig(int sig) { - tcsetattr(fileno(cin), TCSANOW, &initial_settings); + 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_HEIGHT 24 + + +#if defined BB_FEATURE_AUTOWIDTH +static int terminal_width = 0, terminal_height = 0; +#else +#define terminal_width TERMINAL_WIDTH +#define terminal_height TERMINAL_HEIGHT +#endif + + + extern int more_main(int argc, char **argv) { int c, lines=0, input=0; - int next_page=0, rows = 24; -#ifdef BB_MORE_TERM - int cols=79; - struct winsize win; -#endif + int next_page=0; struct stat st; - FILE *file = stdin; + FILE *file; +#ifdef BB_FEATURE_AUTOWIDTH + struct winsize win = {0,0}; +#endif - if ( strcmp(*argv,"--help")==0 || strcmp(*argv,"-h")==0 ) { - usage (more_usage); - } argc--; argv++; - while (argc-- > 0) { + 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"); + if (file == NULL) { - perror("Can't open file"); + perror(*argv); exit(FALSE); } fstat(fileno(file), &st); - fprintf(stderr, "hi\n"); -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS cin = fopen("/dev/tty", "r"); + if (!cin) + cin = fopen("/dev/console", "r"); +#ifdef USE_OLD_TERMIO + ioctl(fileno(cin),TCGETA,&initial_settings); +#else tcgetattr(fileno(cin),&initial_settings); +#endif new_settings = initial_settings; new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ECHO; - tcsetattr(fileno(cin), TCSANOW, &new_settings); - - (void) signal(SIGINT, gotsig); - - ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); - if (win.ws_row > 4) rows = win.ws_row - 2; - if (win.ws_col > 0) cols = win.ws_col - 1; + 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); #endif while ((c = getc(file)) != EOF) { @@ -94,10 +131,14 @@ extern int more_main(int argc, char **argv) int len=0; next_page = 0; lines=0; - len = fprintf(stdout, "--More-- (%d%% of %ld bytes)%s", + 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, -#ifdef BB_MORE_TERM + st.st_size); + } + len += fprintf(stdout, "%s", +#ifdef BB_FEATURE_USE_TERMIOS "" #else "\n" @@ -105,36 +146,42 @@ extern int more_main(int argc, char **argv) ); fflush(stdout); - input = getc( stdin); + input = getc( cin); -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS /* Erase the "More" message */ - while(len-- > 0) + while(--len >= 0) putc('\b', stdout); - while(len++ < cols) + while(++len <= terminal_width) putc(' ', stdout); - while(len-- > 0) + while(--len >= 0) putc('\b', stdout); fflush(stdout); #endif } - if (input=='q') - goto end; - if (input==' ' && c == '\n' ) - next_page = 1; - if ( c == '\n' && ++lines == (rows + 1) ) - next_page = 1; + 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); } fclose(file); fflush(stdout); - argc--; argv++; - } + } while (--argc > 0); end: -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS gotsig(0); #endif exit(TRUE);