diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-10-24 22:43:27 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-10-24 22:43:27 +0000 |
| commit | 53c80f09723fa5e9bccd6fbab9c11b14ed520404 (patch) | |
| tree | 1c05b9eb8166124b0ac9fb74587aca6459634755 | |
| parent | aa2a1c000c360d89c36c9b1138473ab5f57a946f (diff) | |
| download | busybox-w32-53c80f09723fa5e9bccd6fbab9c11b14ed520404.tar.gz busybox-w32-53c80f09723fa5e9bccd6fbab9c11b14ed520404.tar.bz2 busybox-w32-53c80f09723fa5e9bccd6fbab9c11b14ed520404.zip | |
less: add optional line number toggle and resizing on SIGWINCH.
| -rw-r--r-- | TODO_config_nommu | 2 | ||||
| -rw-r--r-- | miscutils/Config.in | 20 | ||||
| -rw-r--r-- | miscutils/less.c | 151 | ||||
| -rw-r--r-- | scripts/defconfig | 2 |
4 files changed, 108 insertions, 67 deletions
diff --git a/TODO_config_nommu b/TODO_config_nommu index 35546897f..df51dc05a 100644 --- a/TODO_config_nommu +++ b/TODO_config_nommu | |||
| @@ -575,7 +575,7 @@ CONFIG_LESS=y | |||
| 575 | CONFIG_FEATURE_LESS_MAXLINES=9999999 | 575 | CONFIG_FEATURE_LESS_MAXLINES=9999999 |
| 576 | CONFIG_FEATURE_LESS_BRACKETS=y | 576 | CONFIG_FEATURE_LESS_BRACKETS=y |
| 577 | CONFIG_FEATURE_LESS_FLAGS=y | 577 | CONFIG_FEATURE_LESS_FLAGS=y |
| 578 | CONFIG_FEATURE_LESS_FLAGCS=y | 578 | CONFIG_FEATURE_LESS_DASHCMD=y |
| 579 | CONFIG_FEATURE_LESS_MARKS=y | 579 | CONFIG_FEATURE_LESS_MARKS=y |
| 580 | CONFIG_FEATURE_LESS_REGEXP=y | 580 | CONFIG_FEATURE_LESS_REGEXP=y |
| 581 | CONFIG_HDPARM=y | 581 | CONFIG_HDPARM=y |
diff --git a/miscutils/Config.in b/miscutils/Config.in index 15f677a73..40edf23a2 100644 --- a/miscutils/Config.in +++ b/miscutils/Config.in | |||
| @@ -293,13 +293,13 @@ config FEATURE_LESS_FLAGS | |||
| 293 | The -M flag enables a more sophisticated status line. | 293 | The -M flag enables a more sophisticated status line. |
| 294 | The -m flag enables a simpler status line with a percentage. | 294 | The -m flag enables a simpler status line with a percentage. |
| 295 | 295 | ||
| 296 | config FEATURE_LESS_FLAGCS | 296 | config FEATURE_LESS_DASHCMD |
| 297 | bool "Enable flag changes" | 297 | bool "Enable flag changes ('-' command)" |
| 298 | default n | 298 | default n |
| 299 | depends on LESS | 299 | depends on LESS |
| 300 | help | 300 | help |
| 301 | This enables the ability to change command-line flags within | 301 | This enables the ability to change command-line flags within |
| 302 | less itself. | 302 | less itself ('-' keyboard command). |
| 303 | 303 | ||
| 304 | config FEATURE_LESS_MARKS | 304 | config FEATURE_LESS_MARKS |
| 305 | bool "Enable marks" | 305 | bool "Enable marks" |
| @@ -315,6 +315,20 @@ config FEATURE_LESS_REGEXP | |||
| 315 | help | 315 | help |
| 316 | Enable regular expressions, allowing complex file searches. | 316 | Enable regular expressions, allowing complex file searches. |
| 317 | 317 | ||
| 318 | config FEATURE_LESS_LINENUMS | ||
| 319 | bool "Enable dynamic switching of line numbers" | ||
| 320 | default n | ||
| 321 | depends on LESS | ||
| 322 | help | ||
| 323 | Enable "-N" command. | ||
| 324 | |||
| 325 | config FEATURE_LESS_WINCH | ||
| 326 | bool "Enable automatic resizing on window size changes" | ||
| 327 | default n | ||
| 328 | depends on LESS | ||
| 329 | help | ||
| 330 | Makes less track window size changes. | ||
| 331 | |||
| 318 | config HDPARM | 332 | config HDPARM |
| 319 | bool "hdparm" | 333 | bool "hdparm" |
| 320 | default n | 334 | default n |
diff --git a/miscutils/less.c b/miscutils/less.c index 1af9685bf..f367b0ebc 100644 --- a/miscutils/less.c +++ b/miscutils/less.c | |||
| @@ -28,13 +28,6 @@ | |||
| 28 | #include "xregex.h" | 28 | #include "xregex.h" |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | /* In progress */ | ||
| 32 | #define ENABLE_FEATURE_LESS_REWRAP 0 | ||
| 33 | |||
| 34 | /* FIXME: currently doesn't work right */ | ||
| 35 | #undef ENABLE_FEATURE_LESS_FLAGCS | ||
| 36 | #define ENABLE_FEATURE_LESS_FLAGCS 0 | ||
| 37 | |||
| 38 | /* The escape codes for highlighted and normal text */ | 31 | /* The escape codes for highlighted and normal text */ |
| 39 | #define HIGHLIGHT "\033[7m" | 32 | #define HIGHLIGHT "\033[7m" |
| 40 | #define NORMAL "\033[0m" | 33 | #define NORMAL "\033[0m" |
| @@ -77,14 +70,14 @@ enum { | |||
| 77 | 70 | ||
| 78 | /* Command line options */ | 71 | /* Command line options */ |
| 79 | enum { | 72 | enum { |
| 80 | FLAG_E = 1, | 73 | FLAG_E = 1 << 0, |
| 81 | FLAG_M = 1 << 1, | 74 | FLAG_M = 1 << 1, |
| 82 | FLAG_m = 1 << 2, | 75 | FLAG_m = 1 << 2, |
| 83 | FLAG_N = 1 << 3, | 76 | FLAG_N = 1 << 3, |
| 84 | FLAG_TILDE = 1 << 4, | 77 | FLAG_TILDE = 1 << 4, |
| 85 | FLAG_I = 1 << 5, | 78 | FLAG_I = 1 << 5, |
| 79 | FLAG_S = (1 << 6) * ENABLE_FEATURE_LESS_DASHCMD, | ||
| 86 | /* hijack command line options variable for internal state vars */ | 80 | /* hijack command line options variable for internal state vars */ |
| 87 | LESS_STATE_NO_WRAP = 1 << 14, | ||
| 88 | LESS_STATE_MATCH_BACKWARDS = 1 << 15, | 81 | LESS_STATE_MATCH_BACKWARDS = 1 << 15, |
| 89 | }; | 82 | }; |
| 90 | 83 | ||
| @@ -98,10 +91,13 @@ struct globals { | |||
| 98 | int less_gets_pos; | 91 | int less_gets_pos; |
| 99 | /* last position in last line, taking into account tabs */ | 92 | /* last position in last line, taking into account tabs */ |
| 100 | size_t linepos; | 93 | size_t linepos; |
| 101 | unsigned max_displayed_line; | ||
| 102 | unsigned max_fline; | 94 | unsigned max_fline; |
| 103 | unsigned max_lineno; /* this one tracks linewrap */ | 95 | unsigned max_lineno; /* this one tracks linewrap */ |
| 96 | unsigned max_displayed_line; | ||
| 104 | unsigned width; | 97 | unsigned width; |
| 98 | #if ENABLE_FEATURE_LESS_WINCH | ||
| 99 | unsigned winch_counter; | ||
| 100 | #endif | ||
| 105 | ssize_t eof_error; /* eof if 0, error if < 0 */ | 101 | ssize_t eof_error; /* eof if 0, error if < 0 */ |
| 106 | ssize_t readpos; | 102 | ssize_t readpos; |
| 107 | ssize_t readeof; /* must be signed */ | 103 | ssize_t readeof; /* must be signed */ |
| @@ -132,10 +128,11 @@ struct globals { | |||
| 132 | #define kbd_fd (G.kbd_fd ) | 128 | #define kbd_fd (G.kbd_fd ) |
| 133 | #define less_gets_pos (G.less_gets_pos ) | 129 | #define less_gets_pos (G.less_gets_pos ) |
| 134 | #define linepos (G.linepos ) | 130 | #define linepos (G.linepos ) |
| 135 | #define max_displayed_line (G.max_displayed_line) | ||
| 136 | #define max_fline (G.max_fline ) | 131 | #define max_fline (G.max_fline ) |
| 137 | #define max_lineno (G.max_lineno ) | 132 | #define max_lineno (G.max_lineno ) |
| 133 | #define max_displayed_line (G.max_displayed_line) | ||
| 138 | #define width (G.width ) | 134 | #define width (G.width ) |
| 135 | #define winch_counter (G.winch_counter ) | ||
| 139 | #define eof_error (G.eof_error ) | 136 | #define eof_error (G.eof_error ) |
| 140 | #define readpos (G.readpos ) | 137 | #define readpos (G.readpos ) |
| 141 | #define readeof (G.readeof ) | 138 | #define readeof (G.readeof ) |
| @@ -218,7 +215,7 @@ static void less_exit(int code) | |||
| 218 | exit(code); | 215 | exit(code); |
| 219 | } | 216 | } |
| 220 | 217 | ||
| 221 | #if ENABLE_FEATURE_LESS_REWRAP | 218 | #if ENABLE_FEATURE_LESS_LINENUMS || ENABLE_FEATURE_LESS_WINCH |
| 222 | static void re_wrap(void) | 219 | static void re_wrap(void) |
| 223 | { | 220 | { |
| 224 | int w = width; | 221 | int w = width; |
| @@ -297,6 +294,7 @@ static void re_wrap(void) | |||
| 297 | linepos = 0; // XXX | 294 | linepos = 0; // XXX |
| 298 | cur_fline = new_cur_fline; | 295 | cur_fline = new_cur_fline; |
| 299 | /* max_lineno is screen-size independent */ | 296 | /* max_lineno is screen-size independent */ |
| 297 | pattern_valid = 0; | ||
| 300 | } | 298 | } |
| 301 | #endif | 299 | #endif |
| 302 | 300 | ||
| @@ -426,7 +424,11 @@ static void read_lines(void) | |||
| 426 | eof_error = 0; /* Pretend we saw EOF */ | 424 | eof_error = 0; /* Pretend we saw EOF */ |
| 427 | break; | 425 | break; |
| 428 | } | 426 | } |
| 429 | if (max_fline > cur_fline + max_displayed_line) { | 427 | if (!(option_mask32 & FLAG_S) |
| 428 | ? (max_fline > cur_fline + max_displayed_line) | ||
| 429 | : (max_fline >= cur_fline | ||
| 430 | && max_lineno > LINENO(flines[cur_fline]) + max_displayed_line) | ||
| 431 | ) { | ||
| 430 | #if !ENABLE_FEATURE_LESS_REGEXP | 432 | #if !ENABLE_FEATURE_LESS_REGEXP |
| 431 | break; | 433 | break; |
| 432 | #else | 434 | #else |
| @@ -719,18 +721,19 @@ static void buffer_print(void) | |||
| 719 | status_print(); | 721 | status_print(); |
| 720 | } | 722 | } |
| 721 | 723 | ||
| 722 | #if ENABLE_FEATURE_LESS_REWRAP | ||
| 723 | static void buffer_fill_and_print(void) | 724 | static void buffer_fill_and_print(void) |
| 724 | { | 725 | { |
| 725 | unsigned i = 0; | 726 | unsigned i; |
| 726 | int fpos = cur_fline + i; | 727 | #if ENABLE_FEATURE_LESS_DASHCMD |
| 728 | int fpos = cur_fline; | ||
| 727 | 729 | ||
| 728 | if (option_mask32 & LESS_STATE_NO_WRAP) { | 730 | if (option_mask32 & FLAG_S) { |
| 729 | /* Go back to the beginning of this line */ | 731 | /* Go back to the beginning of this line */ |
| 730 | while (fpos && LINENO(flines[fpos]) == LINENO(flines[fpos-1])) | 732 | while (fpos && LINENO(flines[fpos]) == LINENO(flines[fpos-1])) |
| 731 | fpos--; | 733 | fpos--; |
| 732 | } | 734 | } |
| 733 | 735 | ||
| 736 | i = 0; | ||
| 734 | while (i <= max_displayed_line && fpos <= max_fline) { | 737 | while (i <= max_displayed_line && fpos <= max_fline) { |
| 735 | int lineno = LINENO(flines[fpos]); | 738 | int lineno = LINENO(flines[fpos]); |
| 736 | buffer[i] = flines[fpos]; | 739 | buffer[i] = flines[fpos]; |
| @@ -738,28 +741,20 @@ static void buffer_fill_and_print(void) | |||
| 738 | do { | 741 | do { |
| 739 | fpos++; | 742 | fpos++; |
| 740 | } while ((fpos <= max_fline) | 743 | } while ((fpos <= max_fline) |
| 741 | && (option_mask32 & LESS_STATE_NO_WRAP) | 744 | && (option_mask32 & FLAG_S) |
| 742 | && lineno == LINENO(flines[fpos]) | 745 | && lineno == LINENO(flines[fpos]) |
| 743 | ); | 746 | ); |
| 744 | } | 747 | } |
| 745 | for (; i <= max_displayed_line; i++) { | ||
| 746 | buffer[i] = empty_line_marker; | ||
| 747 | } | ||
| 748 | buffer_print(); | ||
| 749 | } | ||
| 750 | #else | 748 | #else |
| 751 | static void buffer_fill_and_print(void) | ||
| 752 | { | ||
| 753 | unsigned i; | ||
| 754 | for (i = 0; i <= max_displayed_line && cur_fline + i <= max_fline; i++) { | 749 | for (i = 0; i <= max_displayed_line && cur_fline + i <= max_fline; i++) { |
| 755 | buffer[i] = flines[cur_fline + i]; | 750 | buffer[i] = flines[cur_fline + i]; |
| 756 | } | 751 | } |
| 752 | #endif | ||
| 757 | for (; i <= max_displayed_line; i++) { | 753 | for (; i <= max_displayed_line; i++) { |
| 758 | buffer[i] = empty_line_marker; | 754 | buffer[i] = empty_line_marker; |
| 759 | } | 755 | } |
| 760 | buffer_print(); | 756 | buffer_print(); |
| 761 | } | 757 | } |
| 762 | #endif | ||
| 763 | 758 | ||
| 764 | /* Move the buffer up and down in the file in order to scroll */ | 759 | /* Move the buffer up and down in the file in order to scroll */ |
| 765 | static void buffer_down(int nlines) | 760 | static void buffer_down(int nlines) |
| @@ -857,7 +852,19 @@ static ssize_t getch_nowait(char* input, int sz) | |||
| 857 | if (less_gets_pos >= 0) | 852 | if (less_gets_pos >= 0) |
| 858 | move_cursor(max_displayed_line + 2, less_gets_pos + 1); | 853 | move_cursor(max_displayed_line + 2, less_gets_pos + 1); |
| 859 | fflush(stdout); | 854 | fflush(stdout); |
| 855 | #if ENABLE_FEATURE_LESS_WINCH | ||
| 856 | while (1) { | ||
| 857 | int r; | ||
| 858 | r = poll(pfd + rd, 2 - rd, -1); | ||
| 859 | if (/*r < 0 && errno == EINTR &&*/ winch_counter) { | ||
| 860 | input[0] = '\\'; /* anything which has no defined function */ | ||
| 861 | return 1; | ||
| 862 | } | ||
| 863 | if (r) break; | ||
| 864 | } | ||
| 865 | #else | ||
| 860 | safe_poll(pfd + rd, 2 - rd, -1); | 866 | safe_poll(pfd + rd, 2 - rd, -1); |
| 867 | #endif | ||
| 861 | 868 | ||
| 862 | input[0] = '\0'; | 869 | input[0] = '\0'; |
| 863 | rd = safe_read(kbd_fd, input, sz); /* NB: kbd_fd is in O_NONBLOCK mode */ | 870 | rd = safe_read(kbd_fd, input, sz); /* NB: kbd_fd is in O_NONBLOCK mode */ |
| @@ -1114,7 +1121,7 @@ static void regex_process(void) | |||
| 1114 | 1121 | ||
| 1115 | /* Compile the regex and check for errors */ | 1122 | /* Compile the regex and check for errors */ |
| 1116 | err = regcomp_or_errmsg(&pattern, uncomp_regex, | 1123 | err = regcomp_or_errmsg(&pattern, uncomp_regex, |
| 1117 | option_mask32 & FLAG_I ? REG_ICASE : 0); | 1124 | (option_mask32 & FLAG_I) ? REG_ICASE : 0); |
| 1118 | free(uncomp_regex); | 1125 | free(uncomp_regex); |
| 1119 | if (err) { | 1126 | if (err) { |
| 1120 | print_statusline(err); | 1127 | print_statusline(err); |
| @@ -1208,7 +1215,7 @@ static void number_process(int first_digit) | |||
| 1208 | } | 1215 | } |
| 1209 | } | 1216 | } |
| 1210 | 1217 | ||
| 1211 | #if ENABLE_FEATURE_LESS_FLAGCS | 1218 | #if ENABLE_FEATURE_LESS_DASHCMD |
| 1212 | static void flag_change(void) | 1219 | static void flag_change(void) |
| 1213 | { | 1220 | { |
| 1214 | int keypress; | 1221 | int keypress; |
| @@ -1230,6 +1237,17 @@ static void flag_change(void) | |||
| 1230 | case '~': | 1237 | case '~': |
| 1231 | option_mask32 ^= FLAG_TILDE; | 1238 | option_mask32 ^= FLAG_TILDE; |
| 1232 | break; | 1239 | break; |
| 1240 | case 'S': | ||
| 1241 | option_mask32 ^= FLAG_S; | ||
| 1242 | buffer_fill_and_print(); | ||
| 1243 | break; | ||
| 1244 | #if ENABLE_FEATURE_LESS_LINENUMS | ||
| 1245 | case 'N': | ||
| 1246 | option_mask32 ^= FLAG_N; | ||
| 1247 | re_wrap(); | ||
| 1248 | buffer_fill_and_print(); | ||
| 1249 | break; | ||
| 1250 | #endif | ||
| 1233 | } | 1251 | } |
| 1234 | } | 1252 | } |
| 1235 | 1253 | ||
| @@ -1467,7 +1485,7 @@ static void keypress_process(int keypress) | |||
| 1467 | regex_process(); | 1485 | regex_process(); |
| 1468 | break; | 1486 | break; |
| 1469 | #endif | 1487 | #endif |
| 1470 | #if ENABLE_FEATURE_LESS_FLAGCS | 1488 | #if ENABLE_FEATURE_LESS_DASHCMD |
| 1471 | case '-': | 1489 | case '-': |
| 1472 | flag_change(); | 1490 | flag_change(); |
| 1473 | buffer_print(); | 1491 | buffer_print(); |
| @@ -1487,25 +1505,6 @@ static void keypress_process(int keypress) | |||
| 1487 | case ':': | 1505 | case ':': |
| 1488 | colon_process(); | 1506 | colon_process(); |
| 1489 | break; | 1507 | break; |
| 1490 | #if ENABLE_FEATURE_LESS_REWRAP | ||
| 1491 | case '*': /* Should be -N command / option */ | ||
| 1492 | option_mask32 ^= FLAG_N; | ||
| 1493 | get_terminal_width_height(kbd_fd, &width, &max_displayed_line); | ||
| 1494 | if (width < 20) /* 20: two tabstops + 4 */ | ||
| 1495 | width = 20; | ||
| 1496 | if (max_displayed_line < 3) | ||
| 1497 | max_displayed_line = 3; | ||
| 1498 | max_displayed_line -= 2; | ||
| 1499 | free(buffer); | ||
| 1500 | buffer = xmalloc((max_displayed_line+1) * sizeof(char *)); | ||
| 1501 | re_wrap(); | ||
| 1502 | buffer_fill_and_print(); | ||
| 1503 | break; | ||
| 1504 | case '&': /* Should be -S command / option */ | ||
| 1505 | option_mask32 ^= LESS_STATE_NO_WRAP; | ||
| 1506 | buffer_fill_and_print(); | ||
| 1507 | break; | ||
| 1508 | #endif | ||
| 1509 | } | 1508 | } |
| 1510 | 1509 | ||
| 1511 | if (isdigit(keypress)) | 1510 | if (isdigit(keypress)) |
| @@ -1517,6 +1516,13 @@ static void sig_catcher(int sig) | |||
| 1517 | less_exit(- sig); | 1516 | less_exit(- sig); |
| 1518 | } | 1517 | } |
| 1519 | 1518 | ||
| 1519 | #if ENABLE_FEATURE_LESS_WINCH | ||
| 1520 | static void sigwinch_handler(int sig UNUSED_PARAM) | ||
| 1521 | { | ||
| 1522 | winch_counter++; | ||
| 1523 | } | ||
| 1524 | #endif | ||
| 1525 | |||
| 1520 | int less_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1526 | int less_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 1521 | int less_main(int argc, char **argv) | 1527 | int less_main(int argc, char **argv) |
| 1522 | { | 1528 | { |
| @@ -1527,7 +1533,7 @@ int less_main(int argc, char **argv) | |||
| 1527 | /* TODO: -x: do not interpret backspace, -xx: tab also */ | 1533 | /* TODO: -x: do not interpret backspace, -xx: tab also */ |
| 1528 | /* -xxx: newline also */ | 1534 | /* -xxx: newline also */ |
| 1529 | /* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */ | 1535 | /* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */ |
| 1530 | getopt32(argv, "EMmN~I"); | 1536 | getopt32(argv, "EMmN~I" USE_FEATURE_LESS_DASHCMD("S")); |
| 1531 | argc -= optind; | 1537 | argc -= optind; |
| 1532 | argv += optind; | 1538 | argv += optind; |
| 1533 | num_files = argc; | 1539 | num_files = argc; |
| @@ -1537,10 +1543,6 @@ int less_main(int argc, char **argv) | |||
| 1537 | * is not a tty and turns into cat. This makes sense. */ | 1543 | * is not a tty and turns into cat. This makes sense. */ |
| 1538 | if (!isatty(STDOUT_FILENO)) | 1544 | if (!isatty(STDOUT_FILENO)) |
| 1539 | return bb_cat(argv); | 1545 | return bb_cat(argv); |
| 1540 | kbd_fd = open(CURRENT_TTY, O_RDONLY); | ||
| 1541 | if (kbd_fd < 0) | ||
| 1542 | return bb_cat(argv); | ||
| 1543 | ndelay_on(kbd_fd); | ||
| 1544 | 1546 | ||
| 1545 | if (!num_files) { | 1547 | if (!num_files) { |
| 1546 | if (isatty(STDIN_FILENO)) { | 1548 | if (isatty(STDIN_FILENO)) { |
| @@ -1548,19 +1550,18 @@ int less_main(int argc, char **argv) | |||
| 1548 | bb_error_msg("missing filename"); | 1550 | bb_error_msg("missing filename"); |
| 1549 | bb_show_usage(); | 1551 | bb_show_usage(); |
| 1550 | } | 1552 | } |
| 1551 | } else | 1553 | } else { |
| 1552 | filename = xstrdup(files[0]); | 1554 | filename = xstrdup(files[0]); |
| 1555 | } | ||
| 1553 | 1556 | ||
| 1554 | get_terminal_width_height(kbd_fd, &width, &max_displayed_line); | ||
| 1555 | /* 20: two tabstops + 4 */ | ||
| 1556 | if (width < 20 || max_displayed_line < 3) | ||
| 1557 | return bb_cat(argv); | ||
| 1558 | max_displayed_line -= 2; | ||
| 1559 | |||
| 1560 | buffer = xmalloc((max_displayed_line+1) * sizeof(char *)); | ||
| 1561 | if (option_mask32 & FLAG_TILDE) | 1557 | if (option_mask32 & FLAG_TILDE) |
| 1562 | empty_line_marker = ""; | 1558 | empty_line_marker = ""; |
| 1563 | 1559 | ||
| 1560 | kbd_fd = open(CURRENT_TTY, O_RDONLY); | ||
| 1561 | if (kbd_fd < 0) | ||
| 1562 | return bb_cat(argv); | ||
| 1563 | ndelay_on(kbd_fd); | ||
| 1564 | |||
| 1564 | tcgetattr(kbd_fd, &term_orig); | 1565 | tcgetattr(kbd_fd, &term_orig); |
| 1565 | term_less = term_orig; | 1566 | term_less = term_orig; |
| 1566 | term_less.c_lflag &= ~(ICANON | ECHO); | 1567 | term_less.c_lflag &= ~(ICANON | ECHO); |
| @@ -1569,11 +1570,37 @@ int less_main(int argc, char **argv) | |||
| 1569 | term_less.c_cc[VMIN] = 1; | 1570 | term_less.c_cc[VMIN] = 1; |
| 1570 | term_less.c_cc[VTIME] = 0; | 1571 | term_less.c_cc[VTIME] = 0; |
| 1571 | 1572 | ||
| 1573 | get_terminal_width_height(kbd_fd, &width, &max_displayed_line); | ||
| 1574 | /* 20: two tabstops + 4 */ | ||
| 1575 | if (width < 20 || max_displayed_line < 3) | ||
| 1576 | return bb_cat(argv); | ||
| 1577 | max_displayed_line -= 2; | ||
| 1578 | |||
| 1572 | /* We want to restore term_orig on exit */ | 1579 | /* We want to restore term_orig on exit */ |
| 1573 | bb_signals(BB_FATAL_SIGS, sig_catcher); | 1580 | bb_signals(BB_FATAL_SIGS, sig_catcher); |
| 1581 | #if ENABLE_FEATURE_LESS_WINCH | ||
| 1582 | signal(SIGWINCH, sigwinch_handler); | ||
| 1583 | #endif | ||
| 1574 | 1584 | ||
| 1585 | buffer = xmalloc((max_displayed_line+1) * sizeof(char *)); | ||
| 1575 | reinitialize(); | 1586 | reinitialize(); |
| 1576 | while (1) { | 1587 | while (1) { |
| 1588 | #if ENABLE_FEATURE_LESS_WINCH | ||
| 1589 | if (winch_counter) { | ||
| 1590 | winch_counter--; | ||
| 1591 | get_terminal_width_height(kbd_fd, &width, &max_displayed_line); | ||
| 1592 | /* 20: two tabstops + 4 */ | ||
| 1593 | if (width < 20) | ||
| 1594 | width = 20; | ||
| 1595 | if (max_displayed_line < 3) | ||
| 1596 | max_displayed_line = 3; | ||
| 1597 | max_displayed_line -= 2; | ||
| 1598 | free(buffer); | ||
| 1599 | buffer = xmalloc((max_displayed_line+1) * sizeof(char *)); | ||
| 1600 | re_wrap(); | ||
| 1601 | buffer_fill_and_print(); | ||
| 1602 | } | ||
| 1603 | #endif | ||
| 1577 | keypress = less_getch(-1); /* -1: do not position cursor */ | 1604 | keypress = less_getch(-1); /* -1: do not position cursor */ |
| 1578 | keypress_process(keypress); | 1605 | keypress_process(keypress); |
| 1579 | } | 1606 | } |
diff --git a/scripts/defconfig b/scripts/defconfig index dc926c8e0..5a5a23fb6 100644 --- a/scripts/defconfig +++ b/scripts/defconfig | |||
| @@ -573,7 +573,7 @@ CONFIG_LESS=y | |||
| 573 | CONFIG_FEATURE_LESS_MAXLINES=9999999 | 573 | CONFIG_FEATURE_LESS_MAXLINES=9999999 |
| 574 | CONFIG_FEATURE_LESS_BRACKETS=y | 574 | CONFIG_FEATURE_LESS_BRACKETS=y |
| 575 | CONFIG_FEATURE_LESS_FLAGS=y | 575 | CONFIG_FEATURE_LESS_FLAGS=y |
| 576 | CONFIG_FEATURE_LESS_FLAGCS=y | 576 | CONFIG_FEATURE_LESS_DASHCMD=y |
| 577 | CONFIG_FEATURE_LESS_MARKS=y | 577 | CONFIG_FEATURE_LESS_MARKS=y |
| 578 | CONFIG_FEATURE_LESS_REGEXP=y | 578 | CONFIG_FEATURE_LESS_REGEXP=y |
| 579 | CONFIG_HDPARM=y | 579 | CONFIG_HDPARM=y |
