Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

New zsh input routines



I realise I've been writing far too many patches recently for anyone
to keep up, but I thought I'd better get this one off before I
modified  beta 10 too much in other ways.  The alpha tester (me)
hasn't spotted any problems, so it would be nice if some other people
would try it.

This is the start of a project to rewrite the code currently in hist.c
so that it looks like the inside of a shell instead of a spaghetti
factory.  At the moment, the history code has its tentacles virtually
everywhere else and I'd very much like to clean this up so that the
input code interfaces more directly with the lexer, with the history
code just being used where necessary.

I don't expect the change in the size and performance etc. to be too
large; `size' suggests the executable is only a few dozen bytes
different from the previous version (at least on the Alpha) and though
I haven't done detailed timings and memory size checking it looks like
those are pretty similar, certainly no worse.  The main point is that
the code is now more legible and maintainable; it also encourages a
slightly less hair-raising programming style in other parts of the
code which use this.

In this first installment, the main change is to move the lower level
routines from hist.c into a new file, input.c, and rewrite them.  I've
made some consequent changes in other parts of the code and tidied up
hist.c where it comes into contact with input.c (for example, there
are now no goto's in either file --- not that they are always bad, but
in all the cases here they turned out to be unnecessary).

Here's a more detailed list of what I've done.  I probably won't do
any more to hist.c until this set of changes has appeared in the
archive.

1) Moved input routines from hist.c to input.c.  To reflect the
change, those routines now in input.c have been renamed, e.g. hgetch
-> ingetc (it was rather confusing to have both hgetc and hgetch
before).

2) The old hack `hungets' which force-fed input code into a single
input buffer has been replaced by a more respectable mechanism with a
stack of buffers.  In the new code, only the input actually passed to
input.c ever appears in the input buffer, not a copy of it.  This
reduces copying and should simplify memory management.  For example,
the replacement text for aliases is read directly from permanent
storage.  The input code does not modify the string while it is being
unread.  Whether or not the input is freed after being read depends on
a flag passed with the input.

3) Flags in the new input stack replace the other gratuitous uses of
hungets(): there is a flag to read an extra space at the end to trick
the lexer when reading a string and one to mark the end of alias or
history expansion.  The latter means that no bogus tokens (\201) are
now forced back into the input stream, so that zsh is now that bit
closer to being 8-bit clean.  (The next step is to add code to
gettok() and untokenize() to handle characters which clash with
tokens, e.g. stick a token marking the next character as plain text
and then de-metafy it.  That would handle basic cases; to complete the
job might be harder.  The problem is in places where the code is
untokenised before the end of processing, e.g. {..,..} expansions.)

4) Resulting changes have been made elsewhere in code which used hungets().
Only in zle_tricky.c (surprise) has this meant a little extra code to
circumvent the hacks using hungets().  That just means a few extra
bytes of heap usage, so probably won't even be noticeable.

5) Only inbufct (total number of characters now available to read) of
the inbuf* variables is now global.  The others are invisible to the
rest of the code.

6) As I mentioned, hist.c has been tidied up a bit where it joins the
input code:  hgetc() and hgetc2() (now histsubchar()) are the main
beneficiaries.

Some other general remarks:

- input.c is fully commented; I haven't bothered commenting hist.c as
it's likely to change further.

- The history code remains broken where it was before,
e.g. histignoredups, the off-by-one problems with fc.  Also
fc -l/history have severe problems with literal history.  Ideally, I'd
like to make literal history redundant by making lexical history work
better.  The literal history mechanism generally gets on my nerves.

- the problem reported before, where precmd contains a substitution and
you do an fc -e, is fixed, but fc -e is still broken in other ways
until the history code is fixed.

- it would be possible to check in inpush() whether there's any input
on the stack, and if there isn't flag this and not push the stack, but
that didn't seem worth the extra code:  I don't think it's critical.

begin 644 input.dif.gz
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
M';&UK8T-SZ;26Y5,UL3;>-KP=YZ:N!3G@xxxxxxx!+/WC-J$]YGB#9V^2L8E
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
A3AU^#*1?4#P=BV:=X6[>8<[E_#%,+"W_/[=K&@]PW```
`
end

-- 
Peter Stephenson <P.Stephenson@xxxxxxxxxxxxx>  Tel: +44 1792 205678 extn. 4461
WWW:  http://python.swan.ac.uk/~pypeters/      Fax: +44 1792 295324
Department of Physics, University of Wales, Swansea,
Singleton Park, Swansea, SA2 8PP, U.K.



Messages sorted by: Reverse Date, Date, Thread, Author