X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=more.c;h=821427dda35b206a89c7f5b6f9ef7fbb3e56fc7b;hb=3695052813a0c9af6b891387e688fc07e4761c99;hp=72d58a6f4c1551204d15661cae7980c1e75b937e;hpb=ef8b6c757de9684f5d88eff4b014527e87121137;p=oweals%2Fbusybox.git diff --git a/more.c b/more.c index 72d58a6f4..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,29 +24,20 @@ * */ - -/* 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[] = "[file ...]"; - +static const char more_usage[] = "more [file ...]\n"; /* ED: sparc termios is broken: revert back to old termio handling. */ -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS - -#if defined (__sparc__) +#if #cpu(sparc) # define USE_OLD_TERMIO # include -# include # define termios termio # define stty(fd,argp) ioctl(fd,TCSETAF,argp) #else @@ -54,24 +50,43 @@ static const char more_usage[] = "[file ...]"; 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_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; struct stat st; 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; } @@ -84,7 +99,7 @@ extern int more_main(int argc, char **argv) } fstat(fileno(file), &st); -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS cin = fopen("/dev/tty", "r"); if (!cin) cin = fopen("/dev/console", "r"); @@ -97,8 +112,18 @@ extern int more_main(int argc, char **argv) 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); #endif while ((c = getc(file)) != EOF) { @@ -113,7 +138,7 @@ extern int more_main(int argc, char **argv) st.st_size); } len += fprintf(stdout, "%s", -#ifdef BB_MORE_TERM +#ifdef BB_FEATURE_USE_TERMIOS "" #else "\n" @@ -123,34 +148,40 @@ extern int more_main(int argc, char **argv) fflush(stdout); 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++ < 79) + 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 == 24 ) - 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);