"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
Re: [rfc] tog horizontal scroll (diff & blame view)
To:
Stefan Sperling <stsp@stsp.name>
Cc:
Mark Jamsek <mark@jamsek.com>, gameoftrees@openbsd.org
Date:
Thu, 16 Jun 2022 15:45:40 +0200

Download raw body.

Thread
  • Mark Jamsek:

    [rfc] tog horizontal scroll (diff & blame view)

  • Stefan Sperling <stsp@stsp.name> wrote:
    > On Thu, Jun 16, 2022 at 01:38:16PM +0200, Stefan Sperling wrote:
    > > On Thu, Jun 16, 2022 at 09:16:05PM +1000, Mark Jamsek wrote:
    > > > On 22-06-16 12:33pm, Stefan Sperling wrote:
    > > > > This new helper could be part of format_line(), but for now I wanted
    > > > > to keep it seperate. Otherwise I would need to update all existing
    > > > > callers of format_line() in the same patch.
    > > > > 
    > > > 
    > > > I think that's a good idea too; it makes sense doing this in
    > > > format_line().
    > > 
    > > Yes, I'll try to this later once things have settled a bit.
    > 
    > Well, why not do it now.
    > 
    > Having this functionality built into format_line() should make it
    > easier to fix the other views for unicode.
    > 
    > ok?
    
    looking at this i thought of simplifying the loop around wcwidth.
    
    wcwidth can't really fail, it either returns 0, 1, 2 or -1 and doesn't
    set errno.  Furthermore, we're repeating most of the bits around...
    
    (while here also a bit of style(9): not declare and initialize vars with
    a function call, as pointed out by tb@ in a previous mail about a
    different bit.)
    
    ok?
    
    diff ccda2f4db6c3f1c5132eefc87f1fc2dbd5298cc4 /home/op/w/got
    blob - 285021accb225e5cc858097d09e1a68d4b32e1ca
    file + tog/tog.c
    --- tog/tog.c
    +++ tog/tog.c
    @@ -1261,47 +1261,35 @@ expand_tab(char **ptr, const char *src)
      * Skip leading nscroll columns of a wide character string.
      * Returns the index to the first character of the scrolled string.
      */
    -static const struct got_error *
    +static void
     scroll_wline(int *scrollx , wchar_t *wline, int nscroll,
         int col_tab_align)
     {
    -	int cols = 0;
    -	size_t wlen = wcslen(wline);
    +	int width, cols = 0;
    +	size_t wlen;
     	int i = 0;
     
    +	wlen = wcslen(wline);
     	*scrollx = 0;
     
     	while (i < wlen && cols < nscroll) {
    -		int width = wcwidth(wline[i]);
    +		width = wcwidth(wline[i]);
    +		if (wline[i] == L'\t')
    +			width = TABSIZE - ((cols + col_tab_align) % TABSIZE);
     
    -		if (width == 0) {
    -			i++;
    -			continue;
    +		if (width == -1) {
    +			width = 1;
    +			wline[i] = L'.';
     		}
     
    -		if (width == 1 || width == 2) {
    -			if (cols + width > nscroll)
    -				break;
    -			cols += width;
    -			i++;
    -		} else if (width == -1) {
    -			if (wline[i] == L'\t') {
    -				width = TABSIZE -
    -				    ((cols + col_tab_align) % TABSIZE);
    -			} else {
    -				width = 1;
    -				wline[i] = L'.';
    -			}
    -			if (cols + width > nscroll)
    -				break;
    -			cols += width;
    -			i++;
    -		} else
    -			return got_error_from_errno("wcwidth");
    +		if (cols + width > nscroll)
    +			break;
    +
    +		cols += width;
    +		i++;
     	}
     
     	*scrollx = i;
    -	return NULL;
     }
     
     /*
    @@ -1334,9 +1322,7 @@ format_line(wchar_t **wlinep, int *widthp, int *scroll
     	if (err)
     		return err;
     
    -	err = scroll_wline(&scrollx, wline, nscroll, col_tab_align);
    -	if (err)
    -		goto done;
    +	scroll_wline(&scrollx, wline, nscroll, col_tab_align);
     
     	if (wlen > 0 && wline[wlen - 1] == L'\n') {
     		wline[wlen - 1] = L'\0';
    @@ -1349,41 +1335,28 @@ format_line(wchar_t **wlinep, int *widthp, int *scroll
     
     	i = scrollx;
     	while (i < wlen) {
    -		int width = wcwidth(wline[i]);
    +		int width;
     
    -		if (width == 0) {
    -			i++;
    -			continue;
    -		}
    +		width = wcwidth(wline[i]);
    +		if (wline[i] == L'\t')
    +			width = TABSIZE - ((cols + col_tab_align) % TABSIZE);
     
    -		if (width == 1 || width == 2) {
    -			if (cols + width > wlimit)
    -				break;
    -			cols += width;
    -			i++;
    -		} else if (width == -1) {
    -			if (wline[i] == L'\t') {
    -				width = TABSIZE -
    -				    ((cols + col_tab_align) % TABSIZE);
    -			} else {
    -				width = 1;
    -				wline[i] = L'.';
    -			}
    -			if (cols + width > wlimit)
    -				break;
    -			cols += width;
    -			i++;
    -		} else {
    -			err = got_error_from_errno("wcwidth");
    -			goto done;
    +		if (width == -1) {
    +			width = 1;
    +			wline[i] = L'.';
     		}
    +
    +		if (cols + width > wlimit)
    +			break;
    +
    +		cols += width;
    +		i++;
     	}
     	wline[i] = L'\0';
     	if (widthp)
     		*widthp = cols;
     	if (scrollxp)
     		*scrollxp = scrollx;
    -done:
     	if (err)
     		free(wline);
     	else
    
    
    
    
    
  • Mark Jamsek:

    [rfc] tog horizontal scroll (diff & blame view)