Vladimir's last_patch_15
This commit is contained in:
parent
addabd6f16
commit
78b0e379d7
15 changed files with 275 additions and 253 deletions
|
@ -9,6 +9,8 @@
|
|||
* based on the original more implementation by Bruce, and code from the
|
||||
* Debian boot-floppies team.
|
||||
*
|
||||
* Termios corrects by Vladimir Oleynik <vodz@usa.net>
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
|
@ -29,29 +31,26 @@
|
|||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include "busybox.h"
|
||||
|
||||
/* ED: sparc termios is broken: revert back to old termio handling. */
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
# if #cpu(sparc)
|
||||
# include <termio.h>
|
||||
# define termios termio
|
||||
# define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp)
|
||||
# define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp)
|
||||
# else
|
||||
# include <termios.h>
|
||||
# define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
|
||||
# define getTermSettings(fd,argp) tcgetattr(fd, argp);
|
||||
# endif
|
||||
|
||||
static FILE *cin;
|
||||
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
#include <termios.h>
|
||||
#define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
|
||||
#define getTermSettings(fd,argp) tcgetattr(fd, argp);
|
||||
|
||||
static struct termios initial_settings, new_settings;
|
||||
|
||||
static void gotsig(int sig)
|
||||
static void set_tty_to_initial_mode(void)
|
||||
{
|
||||
setTermSettings(fileno(cin), &initial_settings);
|
||||
}
|
||||
|
||||
static void gotsig(int sig)
|
||||
{
|
||||
putchar('\n');
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
@ -65,7 +64,7 @@ static int terminal_height = 24;
|
|||
extern int more_main(int argc, char **argv)
|
||||
{
|
||||
int c, lines, input = 0;
|
||||
int please_display_more_prompt;
|
||||
int please_display_more_prompt = -1;
|
||||
struct stat st;
|
||||
FILE *file;
|
||||
int len, page_height;
|
||||
|
@ -77,46 +76,57 @@ extern int more_main(int argc, char **argv)
|
|||
argc--;
|
||||
argv++;
|
||||
|
||||
|
||||
/* not use inputing from terminal if usage: more > outfile */
|
||||
if(isatty(fileno(stdout))) {
|
||||
cin = fopen("/dev/tty", "r");
|
||||
if (!cin)
|
||||
cin = xfopen("/dev/console", "r");
|
||||
please_display_more_prompt = 0;
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
getTermSettings(fileno(cin), &initial_settings);
|
||||
new_settings = initial_settings;
|
||||
new_settings.c_lflag &= ~ICANON;
|
||||
new_settings.c_lflag &= ~ECHO;
|
||||
#ifndef linux
|
||||
/* Hmm, in linux c_cc[] not parsed if set ~ICANON */
|
||||
new_settings.c_cc[VMIN] = 1;
|
||||
new_settings.c_cc[VTIME] = 0;
|
||||
#endif
|
||||
setTermSettings(fileno(cin), &new_settings);
|
||||
atexit(set_tty_to_initial_mode);
|
||||
(void) signal(SIGINT, gotsig);
|
||||
(void) signal(SIGQUIT, gotsig);
|
||||
(void) signal(SIGTERM, gotsig);
|
||||
#endif
|
||||
}
|
||||
|
||||
do {
|
||||
if (argc == 0) {
|
||||
file = stdin;
|
||||
} else
|
||||
file = xfopen(*argv, "r");
|
||||
|
||||
file = wfopen(*argv, "r");
|
||||
if(file==0)
|
||||
goto loop;
|
||||
|
||||
fstat(fileno(file), &st);
|
||||
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
cin = fopen("/dev/tty", "r");
|
||||
if (!cin)
|
||||
cin = xfopen("/dev/console", "r");
|
||||
getTermSettings(fileno(cin), &initial_settings);
|
||||
new_settings = initial_settings;
|
||||
new_settings.c_cc[VMIN] = 1;
|
||||
new_settings.c_cc[VTIME] = 0;
|
||||
new_settings.c_lflag &= ~ICANON;
|
||||
new_settings.c_lflag &= ~ECHO;
|
||||
setTermSettings(fileno(cin), &new_settings);
|
||||
if(please_display_more_prompt>0)
|
||||
please_display_more_prompt = 0;
|
||||
|
||||
# ifdef BB_FEATURE_AUTOWIDTH
|
||||
#if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS
|
||||
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
|
||||
len=0;
|
||||
lines = 0;
|
||||
page_height = terminal_height;
|
||||
please_display_more_prompt = 0;
|
||||
while ((c = getc(file)) != EOF) {
|
||||
|
||||
if (please_display_more_prompt) {
|
||||
if (please_display_more_prompt>0) {
|
||||
len = printf("--More-- ");
|
||||
if (file != stdin) {
|
||||
#if _FILE_OFFSET_BITS == 64
|
||||
|
@ -129,13 +139,6 @@ extern int more_main(int argc, char **argv)
|
|||
(double) st.st_size)), (long)st.st_size);
|
||||
#endif
|
||||
}
|
||||
len += printf("%s",
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
""
|
||||
#else
|
||||
"\n"
|
||||
#endif
|
||||
);
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
|
@ -143,20 +146,16 @@ extern int more_main(int argc, char **argv)
|
|||
* We've just displayed the "--More--" prompt, so now we need
|
||||
* to get input from the user.
|
||||
*/
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
input = getc(cin);
|
||||
#else
|
||||
input = getc(stdin);
|
||||
#ifndef BB_FEATURE_USE_TERMIOS
|
||||
printf("\033[A"); /* up cursor */
|
||||
#endif
|
||||
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
/* Erase the "More" message */
|
||||
putc('\r', stdout);
|
||||
while (--len >= 0)
|
||||
putc(' ', stdout);
|
||||
putc('\r', stdout);
|
||||
fflush(stdout);
|
||||
#endif
|
||||
len=0;
|
||||
lines = 0;
|
||||
page_height = terminal_height;
|
||||
|
@ -180,6 +179,7 @@ extern int more_main(int argc, char **argv)
|
|||
/* increment by just one line if we are at
|
||||
* the end of this line */
|
||||
if (input == '\n')
|
||||
if(please_display_more_prompt==0)
|
||||
please_display_more_prompt = 1;
|
||||
/* Adjust the terminal height for any overlap, so that
|
||||
* no lines get lost off the top. */
|
||||
|
@ -195,6 +195,7 @@ extern int more_main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
if (++lines >= page_height) {
|
||||
if(please_display_more_prompt==0)
|
||||
please_display_more_prompt = 1;
|
||||
}
|
||||
len=0;
|
||||
|
@ -208,12 +209,9 @@ extern int more_main(int argc, char **argv)
|
|||
}
|
||||
fclose(file);
|
||||
fflush(stdout);
|
||||
|
||||
loop:
|
||||
argv++;
|
||||
} while (--argc > 0);
|
||||
end:
|
||||
#ifdef BB_FEATURE_USE_TERMIOS
|
||||
setTermSettings(fileno(cin), &initial_settings);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue