The NetBSD Project

CVS log for src/lib/libedit/keymacro.c

[BACK] Up to [cvs.NetBSD.org] / src / lib / libedit

Request diff between arbitrary revisions


Default branch: MAIN


Revision 1.23 / (download) - annotate - [select for diffs], Tue May 24 15:00:45 2016 UTC (2 days, 21 hours ago) by christos
Branch: MAIN
CVS Tags: HEAD
Changes since 1.22: +5 -7 lines
Diff to previous 1.22 (colored)

From Ingo Schwarze:

Reduce obfuscation of errno handling. There is only one purpose
non-local errno handling is needed for:  Inside el_wgets(), several
functions call down indirectly to el_wgetc(), many of them via the
dispatch table.  When el_wgetc() fails, it does properly report
failure, but then various cleanup is done which may clobber errno.
But when returning due to failure, el_wgets() wants to have errno
set to the reason of the original read failure, not to the reason
of some subsequent failure of some cleanup operation.  So el_wgetc()
needs to save errno, and if it's non-zero, el_wgets() needs to
restore it on failure.

This core logic is currently obscured by the fact that el_errno
is set and inspected at some additional places where it isn't needed.
Besides, since el_wgetc() and and el_wgets() are both in read.c,
el_errno does not need to be in struct editline, it can and should
be local to read.c in struct el_read_t.

Let's look at what can be simplified.

 1. keymacro_get() abuses el_errno instead of having a proper
    error return code.  Adding that error return code is easy
    because node_trav() already detects the condition and an
    adequate code is already defined.  Returning it, testing
    for it in read_getcmd(), and returning with error from there
    removes the need to inspect el_errno from el_wgets() after
    calling read_getcmd().
    Note that resetting lastchar and cursor and clearing buffer[0]
    is irrelevant.  The code returns from el_wgets() right afterwards.
    Outside el_wgets(), these variables are no longer relevant.
    When el_wgets() is called the next time, it will call ch_reset()
    anyway, resetting the two pointers.  And as long as lastchar
    points to the beginning of the buffer, the contents of the
    buffer won't be used for anything.

 2. read_getcmd() doesn't need to set el_errno again after el_wgetc()
    failure since el_wgetc() already did so.  While here, remove
    the silly "if EOF or error" comments from the el_wgetc()
    return value tests.  It's a public interface documented in a
    manual, so people working on the implementation can obviously
    be expected to know how it works.  It's a case of

      count++;  /* Increment count. */

 3. In the two code paths of el_wgets() that lead up to "goto noedit",
    there is no need to save the errno because nothing that might
    change it happens before returning.

For clarity, since el_wgets() is the function restoring the errno,
also move initializing it to the same function.

Finally, note that restoring errno when the saved value is zero is
wrong.  No library code is ever allowed to clear a previously set
value of errno.  Only application programs are allowed to do that,
and even they usually don't need to do so, except when using certain
ill-designed interfaces like strtol(3).

I tested that the behaviour remains sane in the following cases,
all during execution of el_wgets(3) and with a signal handler
for USR1 installed without SA_RESTART.

 * Enter some text and maybe move around a bit.
   Then send a USR1 signal.
   The signal gets processed, then read_char() resumes reading.
   Send another USR1 signal.
   Now el_wgets() sets errno=EINTR and returns -1.

 * Press Ctrl-V to activate ed-quoted-insert.
   Then send a USR1 signal.
   The signal gets processed, then read_char() resumes reading.
   Send another USR1 signal.
   ed_quoted_insert() returns ed_end_of_file(), i.e. CC_EOF,
   and el_wgets() returns 0.

 * Press a key starting a keyboard macro.
   Then send a USR1 signal.
   The signal gets processed, then read_char() resumes reading.
   Send another USR1 signal.
   Now el_wgets() sets errno=EINTR and returns -1.

 * Press : to enter builtin command mode.
   Start typing a command.
   Then send a USR1 signal.
   The signal gets processed, then read_char() resumes reading.
   Send another USR1 signal.
   Now c_gets() returns -1, ed_command() beeps and returns CC_REFRESH,
   and el_wgets() resumes operation as it should.

I also tested with "el_set(el, EL_EDITMODE, 0)", and it returns
the right value and sets errno correctly.

Revision 1.22 / (download) - annotate - [select for diffs], Mon May 9 21:46:56 2016 UTC (2 weeks, 3 days ago) by christos
Branch: MAIN
Changes since 1.21: +14 -14 lines
Diff to previous 1.21 (colored)

s/protected/libedit_private/g

Revision 1.21 / (download) - annotate - [select for diffs], Mon Apr 18 17:01:19 2016 UTC (5 weeks, 3 days ago) by christos
Branch: MAIN
Changes since 1.20: +3 -2 lines
Diff to previous 1.20 (colored)

From Ingo Schwarze:
 * Replace fcns.c by a shorter and simpler func.h
   and include it only in the one file needing it, map.c.
 * Combine help.h and help.c into a simplified help.h
   and include it only in the one file needing it, map.c.
 * Check the very simple, static files editline.c, historyn.c, and
   tokenizern.c into CVS rather than needlessly generating them.
 * So we no longer autogenerate any C files.  :-)
 * Shorten and simplify makelist by deleting the options -n, -e, -bc,
   and -m; the latter was unused and useless in the first place.
 * Move the declaration of el_func_t from fcns.h to the header
   actually needing it, map.h.  Since that header is already
   included by el.h for unrelated reasons, that makes el_func_t
   just as globally available as before.
 * No longer include the simplified fcns.h into el.h,
   include it directly into the *.c files needing it.

Revision 1.20 / (download) - annotate - [select for diffs], Tue Apr 12 00:16:06 2016 UTC (6 weeks, 3 days ago) by christos
Branch: MAIN
Changes since 1.19: +4 -8 lines
Diff to previous 1.19 (colored)

From Ingo Schwarze:

 * Delete the stubs of the XK_EXE mechanism that was never implemented.
   From a security, stability, and simplicity perspective, i would
   consider implementing it a truly terrible idea, so let's better
   get rid of it.

 * Do not use the local variable "num" in el_wgets() alternately for
   two completely different purposes.  Only use it for the number
   of characters read, as stated in the comment (or -1 as long as
   that number is still unknown), not for the (more or less boolean)
   return value of read_getcmd().  Actually, there is no need at
   all to save the latter return value after testing it once.

 * The function read_getcmd() has very unusual return values:
   It returns -1 for success and 0 for EOF/error.  Switch that around
   to 0 for success and -1 for EOF/error to be less confusing, and
   get rid of the OKCMD preprocessor macro.

 * Get rid of one #ifdef section in el_wgets() by using
   el->el_chared.c_macro directly at the only place
   where it is used.

 * Delete the unused MIN() macro.

Revision 1.19 / (download) - annotate - [select for diffs], Mon Apr 11 18:56:31 2016 UTC (6 weeks, 3 days ago) by christos
Branch: MAIN
Changes since 1.18: +18 -18 lines
Diff to previous 1.18 (colored)

Get rid of private/public; keep protected (Ingo Schwarze)

Revision 1.18 / (download) - annotate - [select for diffs], Mon Apr 11 00:50:13 2016 UTC (6 weeks, 4 days ago) by christos
Branch: MAIN
Changes since 1.17: +30 -27 lines
Diff to previous 1.17 (colored)

Char -> wchar_t from Ingo Schwarze.

Revision 1.17 / (download) - annotate - [select for diffs], Mon Apr 11 00:22:48 2016 UTC (6 weeks, 4 days ago) by christos
Branch: MAIN
Changes since 1.16: +3 -3 lines
Diff to previous 1.16 (colored)

more macro WIDECHAR undoing from Ingo Schwarze.

Revision 1.16 / (download) - annotate - [select for diffs], Sat Apr 9 18:43:17 2016 UTC (6 weeks, 5 days ago) by christos
Branch: MAIN
Changes since 1.15: +5 -5 lines
Diff to previous 1.15 (colored)

More WIDECHAR elimination (Ingo Schwarze)

Revision 1.15 / (download) - annotate - [select for diffs], Wed Mar 23 22:27:48 2016 UTC (2 months ago) by christos
Branch: MAIN
Changes since 1.14: +2 -4 lines
Diff to previous 1.14 (colored)

Start removing the WIDECHAR ifdefs; building without it has stopped working
anyway. (Ingo Schwarze)

Revision 1.14 / (download) - annotate - [select for diffs], Wed Feb 24 14:25:38 2016 UTC (3 months ago) by christos
Branch: MAIN
Changes since 1.13: +5 -3 lines
Diff to previous 1.13 (colored)

Get split el_getc and el_wgetc completely and call el_wgetc internally.
Change some character constants to they wide versions. (Ingo Schwarze)

Revision 1.13 / (download) - annotate - [select for diffs], Wed Feb 17 19:47:49 2016 UTC (3 months, 1 week ago) by christos
Branch: MAIN
Changes since 1.12: +8 -8 lines
Diff to previous 1.12 (colored)

whitespace and header sorting changes (Ingo Schwarze). No functional changes.

Revision 1.12 / (download) - annotate - [select for diffs], Tue Feb 16 15:53:48 2016 UTC (3 months, 1 week ago) by christos
Branch: MAIN
Changes since 1.11: +2 -4 lines
Diff to previous 1.11 (colored)

From Ingo Scharze:
Let "el.h" include everything needed for struct editline,
and don't include that stuff multiple times.  That also improves
consistency, also avoids circular inclusions, and also makes it
easier to follow what is going on, even though not quite as nice.
But it seems like the best we can do...

Revision 1.11 / (download) - annotate - [select for diffs], Tue Feb 16 14:08:25 2016 UTC (3 months, 1 week ago) by christos
Branch: MAIN
Changes since 1.10: +3 -2 lines
Diff to previous 1.10 (colored)

cleanup chartype.h includes (Ingo Schwarze)

Revision 1.10 / (download) - annotate - [select for diffs], Tue Feb 16 14:06:05 2016 UTC (3 months, 1 week ago) by christos
Branch: MAIN
Changes since 1.9: +3 -2 lines
Diff to previous 1.9 (colored)

cleanup inclusion of histedit.h (Ingo Schwarze)

Revision 1.9 / (download) - annotate - [select for diffs], Sun Feb 14 14:49:34 2016 UTC (3 months, 1 week ago) by christos
Branch: MAIN
Changes since 1.8: +4 -4 lines
Diff to previous 1.8 (colored)

From Ingo Schwarze:

As we have seen before, "histedit.h" can never get rid of including
the <wchar.h> header because using the data types defined there is
deeply ingrained in the public interfaces of libedit.

Now POSIX unconditionally requires that <wchar.h> defines the type
wint_t.  Consequently, it can be used unconditionally, no matter
whether WIDECHAR is active or not.  Consequently, the #define Int
is pointless.

Note that removing it is not gratuitious churn.  Auditing for
integer signedness problems is already hard when only fundamental
types like "int" and "unsigned" are involved.  It gets very hard
when types come into the picture that have platform-dependent
signedness, like "char" and "wint_t".  Adding yet another layer
on top, changing both the signedness and the width in a platform-
dependent way, makes auditing yet harder, which IMHO is really
dangerous.  Note that while removing the #define, i already found
one bug caused by this excessive complication - in the function
re_putc() in refresh.c.  If WIDECHAR was defined, it printed an
Int = wint_t value with %c.  Fortunately, that bug only affects
debugging, not production.  The fix is contained in the patch.

With WIDECHAR, this doesn't change anything.  For the case without
WIDECHAR, i checked that none of the places wants to store values
that might not fit in wint_t.

This only changes internal interfaces; public ones remain unchanged.

Revision 1.8 / (download) - annotate - [select for diffs], Thu Feb 11 19:21:04 2016 UTC (3 months, 2 weeks ago) by christos
Branch: MAIN
Changes since 1.7: +3 -3 lines
Diff to previous 1.7 (colored)

- Add some more Char casts
- reduce ifdefs by providing empty defs for nls functions (Ingo Schwarze)

Revision 1.7 / (download) - annotate - [select for diffs], Tue Aug 16 16:25:15 2011 UTC (4 years, 9 months ago) by christos
Branch: MAIN
CVS Tags: yamt-pagecache-tag8, yamt-pagecache-base9, yamt-pagecache-base8, yamt-pagecache-base7, yamt-pagecache-base6, yamt-pagecache-base5, yamt-pagecache-base4, yamt-pagecache-base3, yamt-pagecache-base2, yamt-pagecache-base, yamt-pagecache, tls-maxphys-base, tls-maxphys, tls-earlyentropy-base, tls-earlyentropy, riastradh-xf86-video-intel-2-7-1-pre-2-21-15, riastradh-drm2-base3, riastradh-drm2-base2, riastradh-drm2-base1, riastradh-drm2-base, riastradh-drm2, netbsd-7-base, netbsd-7-0-RELEASE, netbsd-7-0-RC3, netbsd-7-0-RC2, netbsd-7-0-RC1, netbsd-7-0-1-RELEASE, netbsd-7-0, netbsd-7, netbsd-6-base, netbsd-6-1-RELEASE, netbsd-6-1-RC4, netbsd-6-1-RC3, netbsd-6-1-RC2, netbsd-6-1-RC1, netbsd-6-1-5-RELEASE, netbsd-6-1-4-RELEASE, netbsd-6-1-3-RELEASE, netbsd-6-1-2-RELEASE, netbsd-6-1-1-RELEASE, netbsd-6-1, netbsd-6-0-RELEASE, netbsd-6-0-RC2, netbsd-6-0-RC1, netbsd-6-0-6-RELEASE, netbsd-6-0-5-RELEASE, netbsd-6-0-4-RELEASE, netbsd-6-0-3-RELEASE, netbsd-6-0-2-RELEASE, netbsd-6-0-1-RELEASE, netbsd-6-0, netbsd-6, matt-nb6-plus-nbase, matt-nb6-plus-base, matt-nb6-plus, agc-symver-base, agc-symver
Changes since 1.6: +7 -7 lines
Diff to previous 1.6 (colored)

re-enable -Wconversion

Revision 1.6 / (download) - annotate - [select for diffs], Fri Jul 29 23:44:44 2011 UTC (4 years, 9 months ago) by christos
Branch: MAIN
Changes since 1.5: +3 -3 lines
Diff to previous 1.5 (colored)

pass -Wconversion

Revision 1.5 / (download) - annotate - [select for diffs], Fri Jul 29 15:16:33 2011 UTC (4 years, 9 months ago) by christos
Branch: MAIN
Changes since 1.4: +31 -31 lines
Diff to previous 1.4 (colored)

KNF return (\1); -> return \1;

Revision 1.4 / (download) - annotate - [select for diffs], Thu Jul 28 20:50:55 2011 UTC (4 years, 10 months ago) by christos
Branch: MAIN
Changes since 1.3: +8 -8 lines
Diff to previous 1.3 (colored)

kill ptr_t and ioctl_t, add  * sizeof(*foo) to all allocations.

Revision 1.3 / (download) - annotate - [select for diffs], Thu Jul 28 03:52:19 2011 UTC (4 years, 10 months ago) by christos
Branch: MAIN
Changes since 1.2: +3 -3 lines
Diff to previous 1.2 (colored)

whitespace

Revision 1.2 / (download) - annotate - [select for diffs], Thu Jul 28 03:48:46 2011 UTC (4 years, 10 months ago) by christos
Branch: MAIN
Changes since 1.1: +38 -32 lines
Diff to previous 1.1 (colored)

whitespace

Revision 1.1 / (download) - annotate - [select for diffs], Thu Jul 28 01:56:27 2011 UTC (4 years, 10 months ago) by christos
Branch: MAIN

Rename key to keymacro to avoid conflicts with term.h. The renaming of term
to terminal was again to avoid conflicts with term.h. term.h is a moving
namespace violation.

This form allows you to request diff's between any two revisions of a file. You may select a symbolic revision name using the selection box or you may type in a numeric name using the type-in text box.




CVSweb <webmaster@jp.NetBSD.org>