case-table braindamage

Julian Bradfield jcb+xeb at inf.ed.ac.uk
Mon Jun 11 16:01:26 EDT 2007


I have just been trying to do something very simple which should most
easily be achieved by installing a temporary case table. (The task is
to enter "a" in isearch, and find "áàÁÀ" etc as well as "A".)

Having discovered that this doesn't work my in my very old 21.4.12 (in
a bizarre way: searching for, e.g. "e" does find "é", but searching
for "se" does not find "sé"), I thought I might as well go to 21.5 as
to the latest 21.4. (I've just found that it was fixed by 21.4.20, but
never mind.)

So I moved to 21.5.28. It worked - eventually. The problem here was
that the temporary case table was installed, but not uninstalled  at
the end of the search - and moreover, the standard case table was now
the temporary one.

After much tearing of hair, I read casetab.c carefully, and saw the
following bizarre fact:
set_case_tab does what you expect when given a genuine C case_table
object: it changes either Vstandard_case_table or buf->case_table to
be the argument.
*However*, if given the case table data as (up to) four strings, it
doesn't do this: instead it modifies the existing case table (standard
or buffer) in place. Hence if a buffer has the standard case table,
setting the buffer case table also sets the standard.

I can just about imagine that one might want to do this with the
standard case table (though the documentation says that the standard
case table applies to *new* buffers), but the other way????

What's even odder is that this behaviour has got worse.
In 21.4, a buffer case table is at least dealt with as you would
expect - a new case table is allocated, modified according to the
string data, and made the buffer table - but the standard case table
is modified in place. In 21.5(.28), both are modified in place.

Why? This behaviour seems utterly at odds with what one would expect
from functions called "set-", rather than "modify-".




More information about the XEmacs-Beta mailing list