Re: Trimming top's header to display width

From: Andre Guibert de Bruet <andy_at_siliconlandmark.com>
Date: Fri, 13 May 2005 08:33:32 -0400 (EDT)
On Thu, 12 May 2005, Giorgos Keramidas wrote:

> The following patch trims the header printed by top(1) to the
> display_width.  A lot of people have complained how top's header wraps
> around when some columns are too wide, with the more recent thread
> related to this being:
>
> http://lists.freebsd.org/pipermail/freebsd-current/2005-May/050014.html
>
> Does the diff below look like a good way to fix this?
>
> %%%
> Index: contrib/top/display.c
> ===================================================================
> RCS file: /tmp/cvsroot/src/contrib/top/display.c,v
> retrieving revision 1.1.1.1
> retrieving revision 1.2
> diff -u -r1.1.1.1 -r1.2
> --- contrib/top/display.c	12 May 2005 01:15:45 -0000	1.1.1.1
> +++ contrib/top/display.c	12 May 2005 11:06:21 -0000	1.2
> _at__at_ -626,6 +626,33 _at__at_
> static int header_length;
>
> /*
> + * Trim a header string to the current display width and return a newly
> + * allocated area with the trimmed header.
> + */
> +
> +char *
> +trim_header(text)
> +
> +char *text;
> +
> +{
> +	char *s;
> +	int width;
> +
> +	s = NULL;

Setting s to NULL is useless because malloc returns either NULL on failure 
or a pointer to the allocated memory segment.

> +	width = display_width;
> +	header_length = strlen(text);
> +	if (header_length >= width) {
> +		s = malloc((width + 1) * sizeof(char));
> +		if (s == NULL)
> +			return (NULL);
> +		strncpy(s, text, width);
> +		s[width] = '\0';
> +	}
> +	return (s);
> +}
> +
> +/*
>  *  *_header(text) - print the header for the process area
>  *
>  *  Assumptions:  cursor is on the previous line and lastline is consistent
> _at__at_ -636,7 +663,12 _at__at_
> char *text;
>
> {
> -    header_length = strlen(text);
> +    char *s;
> +
> +    s = trim_header(text);
> +    if (s != NULL)
> +	text = s;
> +
>     if (header_status == ON)
>     {
> 	putchar('\n');
> _at__at_ -647,6 +679,7 _at__at_
>     {
> 	header_status = OFF;
>     }
> +    free(s);
> }
>
> /*ARGSUSED*/
> _at__at_ -655,6 +688,12 _at__at_
> char *text;		/* ignored */
>
> {
> +    char *s;
> +
> +    s = trim_header(text);
> +    if (s != NULL)
> +	text = s;
> +
>     if (header_status == ERASE)
>     {
> 	putchar('\n');
> _at__at_ -662,6 +701,7 _at__at_
> 	clear_eol(header_length);
> 	header_status = OFF;
>     }
> +    free(s);
> }
>
> /*
> %%%

Other than that pet-peeve, the patch looks good to me...

Andy

/*  Andre Guibert de Bruet  * 6f43 6564 7020 656f 2e74 4220 7469 6a20 */
/*   Code poet / Sysadmin   * 636f 656b 2e79 5320 7379 6461 696d 2e6e */
/*   GSM: +1 734 846 8758   * 5520 494e 2058 6c73 7565 6874 002e 0000 */
/* WWW: siliconlandmark.com *      Tormenting bytes since 1980.       */
Received on Fri May 13 2005 - 10:33:37 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:34 UTC