Am 18.07.2015 11:06, schrieb Ron Yorston:
> 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 <[email protected]>
> ---
> miscutils/less.c | 39 +++++++++++++++------------------------
> 1 file changed, 15 insertions(+), 24 deletions(-)
>
> diff --git a/miscutils/less.c b/miscutils/less.c
> index d5a68d1..10d2104 100644
> --- a/miscutils/less.c
> +++ b/miscutils/less.c
> @@ -665,27 +665,24 @@ 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 */
> +
you can remove the else if you turn the compare on its head.
fmt = " ";
if ( line != empty_line_marker)
may be this helps so save a few bytes.
> + if (line == empty_line_marker) {
> + fmt = " ";
> + }
> + else {
> /* 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 ";
> }
could you explain in 1 line why the MAXLINES test is needed ?
> - sprintf(nbuf9, fmt, n);
> }
> + printf(fmt, n);
> }
>
>
> @@ -698,7 +695,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 +744,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 +754,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 +790,10 @@ 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]);
> + }
i guess you can remove the {}
> if (pattern_valid)
> print_found(buffer[i]);
> else
just my 2 cents,
re
wh
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox