[PATCH v2] less: fix display of line numbers
Denys Vlasenko
vda.linux at googlemail.com
Sun Jul 19 20:48:36 UTC 2015
Applied, thanks!
On Sat, Jul 18, 2015 at 5:20 PM, Ron Yorston <rmy at frippery.org> wrote:
> Line numbers are displayed incorrectly on lines that have a search
> pattern highlighted. The problem can be fixed by moving the call to
> lineno_str in print_found above the while loop that alters the value
> of the line pointer. However, a more substantial rewrite results in
> savings.
>
> function old new delta
> buffer_print 688 697 +9
> .rodata 156077 156045 -32
> lineno_str 85 - -85
> ------------------------------------------------------------------------------
> (add/remove: 0/1 grow/shrink: 1/1 up/down: 9/-117) Total: -108 bytes
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
> miscutils/less.c | 35 +++++++++++------------------------
> 1 file changed, 11 insertions(+), 24 deletions(-)
>
> diff --git a/miscutils/less.c b/miscutils/less.c
> index d5a68d1..87cff40 100644
> --- a/miscutils/less.c
> +++ b/miscutils/less.c
> @@ -665,27 +665,21 @@ static const char ctrlconv[] ALIGN1 =
> "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x40\x4b\x4c\x4d\x4e\x4f"
> "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f";
>
> -static void lineno_str(char *nbuf9, const char *line)
> +static void print_lineno(const char *line)
> {
> - nbuf9[0] = '\0';
> - if (option_mask32 & FLAG_N) {
> - const char *fmt;
> - unsigned n;
> -
> - if (line == empty_line_marker) {
> - memset(nbuf9, ' ', 8);
> - nbuf9[8] = '\0';
> - return;
> - }
> + const char *fmt = " ";
> + unsigned n = n; /* for compiler */
> +
> + if (line != empty_line_marker) {
> /* Width of 7 preserves tab spacing in the text */
> fmt = "%7u ";
> n = LINENO(line) + 1;
> - if (n > 9999999) {
> + if (n > 9999999 && MAXLINES > 9999999) {
> n %= 10000000;
> fmt = "%07u ";
> }
> - sprintf(nbuf9, fmt, n);
> }
> + printf(fmt, n);
> }
>
>
> @@ -698,7 +692,6 @@ static void print_found(const char *line)
> regmatch_t match_structs;
>
> char buf[width];
> - char nbuf9[9];
> const char *str = line;
> char *p = buf;
> size_t n;
> @@ -748,12 +741,7 @@ static void print_found(const char *line)
> match_status = 1;
> }
>
> - lineno_str(nbuf9, line);
> - if (!growline) {
> - printf(CLEAR_2_EOL"%s%s\n", nbuf9, str);
> - return;
> - }
> - printf(CLEAR_2_EOL"%s%s%s\n", nbuf9, growline, str);
> + printf("%s%s\n", growline ? growline : "", str);
> free(growline);
> }
> #else
> @@ -763,13 +751,9 @@ void print_found(const char *line);
> static void print_ascii(const char *str)
> {
> char buf[width];
> - char nbuf9[9];
> char *p;
> size_t n;
>
> - lineno_str(nbuf9, str);
> - printf(CLEAR_2_EOL"%s", nbuf9);
> -
> while (*str) {
> n = strcspn(str, controls);
> if (n) {
> @@ -803,6 +787,9 @@ static void buffer_print(void)
>
> move_cursor(0, 0);
> for (i = 0; i <= max_displayed_line; i++) {
> + printf(CLEAR_2_EOL);
> + if (option_mask32 & FLAG_N)
> + print_lineno(buffer[i]);
> if (pattern_valid)
> print_found(buffer[i]);
> else
> --
> 2.4.3
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list