Ping?

Also, any thoughts on the editline.3 diff[1] sent later in this thread?

[1] http://marc.info/?l=openbsd-tech&m=145150775627284&w=2

Ingo Schwarze wrote:

> Hi Christian & Michael,
> 
> Michael McConville wrote on Thu, Dec 24, 2015 at 04:19:03PM -0500:
> > Christian Heckendorf wrote:
> 
> >> A couple of somewhat recent changes in NetBSD's libedit permit
> >> el_gets(3) to accept multibyte characters if the locale supports
> >> it.
> 
> Ugh.  The amount of indirection in that code is disturbing, and the
> amount of contortion is disgusting.  Such stuff is highly error
> prone, in particular since the manual is way below OpenBSD standards
> (functions mentioned in the SYNOPSIS but not actually documented,
> vague statements, confusion regarding bytes versus characters, ...).
> Besides, it's not completely clear which parts of the interface are
> public and which are internal to the library.
> 
> In the vicinity of this particular diff:  The IGNORE_EXTCHARS flag
> appears to be private to the library, the users seems to have no
> way to change it.  Otherwise, the existing code in el_getc(3)
> would already be broken because it clears the flag on exit even
> if it was set on entry.  But as an internal flag, it's completely
> pointless.  If CHARSET_IS_UTF8 is set, the present diff makes
> sure it is never set.  If CHARSET_IS_UTF8 is not set, it has no
> effect because the only place where it is used also checks "bytes > 1",
> which cannot happen in the C locale.
> 
> But if we want to stay in sync with upstream, freely borrowing Bob's
> whale flensing knife may not be the best idea.
> 
> Also note that el_gets(3) is documented to return the number of
> characters read, but actually, callers assume it returns the
> number of *bytes* read, so what your diff is doing makes sense.
> 
> Michael, as you already looked at NetBSD, is there a documentation
> update to go with this diff?
> 
> >> A notable user of this function is sftp(1) which will allow users to
> >> input multibyte characters, in filenames for example, once the diff
> >> is applied.
> 
> I inspected your diff and found it to be both correct and in line
> with the existing (horrible) style.  In particular, it is very
> similar to the code already used in el_getc(3).  I also tested
> it with ftp(1) - adding setlocale(LC_CTYPE, "") to that program,
> though it's quite unclear where exactly that call should go, so
> no diff for that just yet.
> 
> But i would like to commit this eln.c diff, if i get any OK for it.
> 
> > I remember someone recently mentioning that libedit is due for an
> > update.  Maybe we should try to include this in a full sync.
> 
> Sure.  But let's not deny focussed, non-intrusive diffs that make
> specific, well-defined things better just because there are rumours
> about grand plans.  Besides, cherry-picking from upstream hardly
> complicates later merges.
> 
> OK?
> 
> Yours,
>   Ingo
> 
> 
> >> Index: eln.c
> >> ===================================================================
> >> RCS file: /cvs/src/lib/libedit/eln.c,v
> >> retrieving revision 1.4
> >> diff -u -p -r1.4 eln.c
> >> --- eln.c  20 May 2014 11:59:03 -0000      1.4
> >> +++ eln.c  24 Dec 2015 19:34:09 -0000
> >> @@ -74,9 +74,18 @@ el_gets(EditLine *el, int *nread)
> >>  {
> >>    const wchar_t *tmp;
> >>  
> >> -  el->el_flags |= IGNORE_EXTCHARS;
> >> +  if (!(el->el_flags & CHARSET_IS_UTF8))
> >> +          el->el_flags |= IGNORE_EXTCHARS;
> >>    tmp = el_wgets(el, nread);
> >> -  el->el_flags &= ~IGNORE_EXTCHARS;
> >> +  if (tmp != NULL) {
> >> +          size_t nwread = 0;
> >> +          int i;
> >> +          for (i = 0; i < *nread; i++)
> >> +                  nwread += ct_enc_width(tmp[i]);
> >> +          *nread = (int)nwread;
> >> +  }
> >> +  if (!(el->el_flags & CHARSET_IS_UTF8))
> >> +          el->el_flags &= ~IGNORE_EXTCHARS;
> >>    return ct_encode_string(tmp, &el->el_lgcyconv);
> >>  }
> >>  
> >> 
> 

Reply via email to