#include <stdlib.h>
#include <sys/ioctl.h>
#include "busybox.h"
-#define BB_DECLARE_EXTERN
-#define bb_need_help
-#include "messages.c"
/* ED: sparc termios is broken: revert back to old termio handling. */
#ifdef BB_FEATURE_USE_TERMIOS
extern int more_main(int argc, char **argv)
{
- int c, lines = 0, input = 0;
- int please_display_more_prompt = 0;
+ int c, lines, input = 0;
+ int please_display_more_prompt;
struct stat st;
FILE *file;
- int len;
+ int len, page_height;
#if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS
struct winsize win = { 0, 0, 0, 0 };
#ifdef BB_FEATURE_USE_TERMIOS
cin = fopen("/dev/tty", "r");
if (!cin)
- cin = fopen("/dev/console", "r");
+ cin = xfopen("/dev/console", "r");
getTermSettings(fileno(cin), &initial_settings);
new_settings = initial_settings;
new_settings.c_cc[VMIN] = 1;
(void) signal(SIGTERM, gotsig);
#endif
- len = 0;
+ len=0;
+ lines = 0;
+ page_height = terminal_height;
+ please_display_more_prompt = 0;
while ((c = getc(file)) != EOF) {
if (please_display_more_prompt) {
- lines = 0;
- please_display_more_prompt = 0;
len = printf("--More-- ");
if (file != stdin) {
#if _FILE_OFFSET_BITS == 64
len += printf("(%d%% of %lld bytes)",
+ (int) (100 * ((double) ftell(file) /
+ (double) st.st_size)), (long long)st.st_size);
#else
len += printf("(%d%% of %ld bytes)",
+ (int) (100 * ((double) ftell(file) /
+ (double) st.st_size)), (long)st.st_size);
#endif
- (int) (100 *
- ((double) ftell(file) /
- (double) st.st_size)),
- st.st_size);
}
len += printf("%s",
#ifdef BB_FEATURE_USE_TERMIOS
#ifdef BB_FEATURE_USE_TERMIOS
/* Erase the "More" message */
+ putc('\r', stdout);
while (--len >= 0)
- putc('\b', stdout);
- while (++len <= terminal_width)
putc(' ', stdout);
- while (--len >= 0)
- putc('\b', stdout);
+ putc('\r', stdout);
fflush(stdout);
#endif
len=0;
+ lines = 0;
+ page_height = terminal_height;
+ please_display_more_prompt = 0;
+
+ if (input == 'q')
+ goto end;
}
/*
* There are two input streams to worry about here:
*
- * c : the character we are reading from the file being "mored"
+ * c : the character we are reading from the file being "mored"
* input : a character received from the keyboard
*
* If we hit a newline in the _file_ stream, we want to test and
* allows the user to quit while in the middle of a file.
*/
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*/
+ /* increment by just one line if we are at
+ * the end of this line */
+ if (input == '\n')
please_display_more_prompt = 1;
- break;
- }
/* Adjust the terminal height for any overlap, so that
* no lines get lost off the top. */
- if (len) {
- div_t result = div( len, terminal_width);
- if (result.quot)
- terminal_height-=(result.quot-1);
+ if (len >= terminal_width) {
+ int quot, rem;
+ quot = len / terminal_width;
+ rem = len - (quot * terminal_width);
+ if (quot) {
+ if (rem)
+ page_height-=quot;
+ else
+ page_height-=(quot-1);
+ }
}
- if (++lines == terminal_height) {
+ if (++lines >= page_height) {
please_display_more_prompt = 1;
}
len=0;
} while (--argc > 0);
end:
#ifdef BB_FEATURE_USE_TERMIOS
- gotsig(0);
+ setTermSettings(fileno(cin), &initial_settings);
#endif
- return(TRUE);
+ return 0;
}