Trimming top's header to display width

Andre Guibert de Bruet andy at siliconlandmark.com
Fri May 13 05:33:37 PDT 2005


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
> @@ -626,6 +626,33 @@
> 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
> @@ -636,7 +663,12 @@
> char *text;
>
> {
> -    header_length = strlen(text);
> +    char *s;
> +
> +    s = trim_header(text);
> +    if (s != NULL)
> +	text = s;
> +
>     if (header_status == ON)
>     {
> 	putchar('\n');
> @@ -647,6 +679,7 @@
>     {
> 	header_status = OFF;
>     }
> +    free(s);
> }
>
> /*ARGSUSED*/
> @@ -655,6 +688,12 @@
> char *text;		/* ignored */
>
> {
> +    char *s;
> +
> +    s = trim_header(text);
> +    if (s != NULL)
> +	text = s;
> +
>     if (header_status == ERASE)
>     {
> 	putchar('\n');
> @@ -662,6 +701,7 @@
> 	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.       */


More information about the freebsd-current mailing list