XEmacs -- Emacs: The Next Generation
English
German
Japanese
America
Asia
Australia
Europe
 
     Searching XEmacs
Quick Links About XEmacs Getting XEmacs Customizing XEmacs Troubleshooting XEmacs Developing XEmacs
      

XEmacs 21.5.36 "leeks" is released

goto announcement, summary, changes

From: "Aidan Kehoe" <kehoea@parhasard.net>
Subject: XEmacs 21.5.36 "leeks" is released.
Organization: The XEmacs Project


*          XEmacs 21.5.36 "leeks" is released.
      "leeks" is the thirty-seventh in the VEGETABLE series.

This is a point release to get important functionality out. Important changes
are thorough support for address space layout randomization and removal of the
previous approach to incorporating the dump file by binary-patching XEmacs,
both needed to have XEmacs run successfully on recent macOS. Equally important
is Kurt Geisel's work to get XEmacs building successfully on recent Visual Studio.

Other changes include Richard Hopkins’ work to greatly improve color support
on TTYs, incorporation of GNU code that removes the need for an internal
register number for shy groups and speeds up regex matching when two branches
are mutually exclusive, better circularity checking with regular expressions,
speed-ups for important coding systems when dealing with ASCII input,
reduction in the number of function calls needed at normal startup by moving
more data to the dump file, greatly increasing the robustness of module
unloading, elimination of many memory leaks by moving subr and
symbol-value-magic objects from the data segment to the dump file (where they
had already been).

This is the development line.  The current series started with XEmacs
21.5.0 (an alias for XEmacs 21.4.0 "Solid Vapor", the first release in
the current stable line).  21.5 is the code base for introduction of
major new subsystems and fixes to design bugs that experience shows will
introduce instability.  So far the main effort has been on improved
support for Unicode, updates to the build infrastructure, and development
of new features in memory allocation.

For general information about XEmacs, the developers, and the user
community, see our home page,

		       http://www.xemacs.org/

* XEmacs 21.5.35 is "beta" software. 

The usual "no warranty" disclaimer (see etc/COPYING, sections 10 and 11)
applies.  At this point in time, it is the version that most developers
are using for their daily work.  However, it is certain that many bugs
remain and new ones will be introduced as development proceeds.  Be sure
to take care to save your work often and follow a regular backup regime.

* Availability

Anonymous ftp:

             ftp://ftp.xemacs.org/pub/xemacs/xemacs-21.5

See http://www.xemacs.org/Install/ for more information about building
from source.

Also, if you don't have the packages yet, see

        http://www.xemacs.org/Documentation/packageGuide.html.

Mercurial repository:

              https://foss.heptapod.net/xemacs/xemacs

This is a read-only Mercurial repository.  To check out XEmacs 21.5.35,
use the command

    hg clone -r r21-5-35 https://foss.heptapod.net/xemacs/xemacs

to create a new Mercurial workspace, or

                        hg pull -u -r r21-5-35

if you already have a local workspace from Mercurial.  To update to the
most recent commits to the official repository, use

                            hg pull -u tip

For more details, see

             http://www.xemacs.org/Develop/hgaccess.html .

Changes in XEmacs 21.5.36 "leeks"

goto announcement, summary, changes

Major Features, Bugfixes, and Backward Incompatible Changes

  • Improve: Remove option of non-Mule builds, given stability of Mule code (Aidan Kehoe)
  • New: Thorough support for address space layout randomization, ASLR (Aidan Kehoe)
  • New: Much better support for colors on TTYs (Richard Hopkins)
  • New: Add support for anchors within info.el (Aidan Kehoe)
  • Improve: Use POSIX type instead of which(1) (Mats Lidell)
  • Fix: Avoid segmentation violation with functions that assumed a window, -batch (Aidan Kehoe)
  • Fix: Get XEmacs building with recent Visual Studio (Kurt Geisel)
  • Fix: Extensive changes to make module support more robust, reduce crashes with unloaded modules (Aidan Kehoe)
  • Improve: No longer binary-patch xemacs with DUMP_IN_EXEC, fix signed binaries (Aidan Kehoe)
  • Improve: Remove support for byte-compile-dynamic (though not byte-compile-dynamic-docstrings) (Aidan Kehoe)
  • Improve: Remove need for an internal register number, shy groups (Aidan Kehoe, Stefan Monnier)
  • Improve: Add support for \_<, \_> to regex.c, anchor at symbol begin, end (Aidan Kehoe, Alan Mackenzie)
  • Improve: Remove the PACKAGE_SUPPRESS mechanism from XEmacs, which was confusing and never worked well (Alan Makenzie)

User-Visible Bug Fixes and Improvements

  • Fix: Restore the skip_ascii() optimization, no-conversion, utf-8, multibyte coding systems (Aidan Kehoe)
  • Fix multiple bugs and performance issues with shifted motion especially on terminals (Aidan Kehoe, Richard Hopkins)
  • Improve: Make algorithm choice more consistent, #'find, #'position (Aidan Kehoe)
  • Fix: Print modifiers for motion, misc-user events; systematize modifier handling (Aidan Kehoe)
  • Fix: Avoid a conflict with our headers and Motif for XFT builds (Aidan Kehoe)
  • Fix: Avoid command-execution vulnerabilities, etags.c (Aidan Kehoe)
  • Fix: Fix a bug with slider size and buffer-position based scrolling (Aidan Kehoe, Richard Hopkins)
  • Improve: Support Page Up/Page Down, Insert, Delete keys with modifiers on Xterm (Richard Hopkins)
  • Improve: If PROMPT supplied to #'read-char, echo it and the result briefly (Aidan Kehoe)
  • Improve: Be more careful about the buffer-local status of `inhibit-read-only' (Aidan Kehoe)
  • Fix: Avoid calling xfree() on dumped data, resize_string(); fix bugs (Aidan Kehoe)
  • Fix: Install DOC as DOC-DUMP_ID, avoid corruption after make install (Aidan Kehoe)
  • Improve: Give reasonable defaults for Perl, Mercurial and makeinfo, native Windows (Aidan Kehoe)
  • Fix: Make initial obarray larger, reduce leaking of its entries (Aidan Kehoe)
  • Fix: Call optimize_compiled_function() on every compiled function when dumping, improve performance, reduce leaked memory (Aidan Kehoe)
  • Improve: Avoid O(N) behavior, #'compare-buffer-substrings (Aidan Kehoe)
  • Improve: Add support for fseeki64(), ftelli64() on Windows (Aidan Kehoe)
  • Improve: Purge the PACKAGE_SUPPRESS mechanism from XEmacs (Alan Mackenzie)
  • Improve: Support text/plain, text/plain;charset=utf-8 when cutting and pasting under X11 (Aidan Kehoe)

Build Infrastructure and Source Tree

  • Fix: Fix a build rule that did not work with BSD make(1) (Richard Hopkins)
  • Improve: ANSI C function definitions, lib-src/ (Richard Hopkins)
  • Improve: Avoid GC after loading every file with --with-quick-build (Aidan Kehoe)
  • Fix: Default DUMP_IN_EXEC to 0 when --with-quick-build (Aidan Kehoe)
  • Improve: Only search in two places for xemacs.dmp when DUMP_IN_EXEC is 0, improve security (Aidan Kehoe)
  • Improve: Install dump file in ${archlibdir} if DUMP_IN_EXEC 0 (Aidan Kehoe)
  • Improve: Import incbin.h, allow cross-platform inlining of binary data (Aidan Kehoe, Dale Weiler)
  • Fix: Remove obsolete optimization flags, Windows build (Aidan Kehoe)
  • Fix: Find module auto-autoloads in module build tree, not source tree (Stephen J. Turnbull)
  • Improve: Simplify startup now unexec is gone, move much more objects to the dump file (ongoing) (Aidan Kehoe)
  • Fix: Correct the updating of the syntax cache in re_match_2_internal (Alan Mackenzie)
  • Improve: Remove support for building modules into temacs (Aidan Kehoe)
  • Improve: Remove some obsolete or minimally useful C files from lib-src/ (Aidan Kehoe)

Documentation

  • Document removal of PACKAGE_SUPPRESS Makefile target (Alan Mackenzie)
  • Document removal of support for building modules into temacs (Aidan Kehoe)
  • Reduced restrictions on C code now unexec is gone (Aidan Kehoe)
  • Update emodules.texi to reflect current status (Aidan Kehoe)
  • Document new optional TEST argument, #'assoc (Aidan Kehoe)
  • Document new optional TEST argument, #'assoc (Aidan Kehoe)
  • Update info syntax (Aidan Kehoe, Mats Lidell, Richard Hopkins)
  • Clarify some syntax related to regexp character sets, groups, zero-length shy groups (Aidan Kehoe)
  • Update documentation of Qunbound, now it is of type opaque (Aidan Kehoe)
  • Update and correct some documentation of pdump (Aidan Kehoe)
  • Update documentation of current dumping, marking (Aidan Kehoe)

Lisp API

  • Improve: Take GNU's optional TEST argument, #'assoc (Aidan Kehoe)
  • Fix: Correct the result of #'regexp-opt when passed an empty list (Alan Mackenzie)
  • Improve: Remove support for emacs implementations without #'add-timeout, itimer.el (Aidan Kehoe)
  • Improve: Handle GNU's value `symbols' of the PAREN argument to regexp-opt (Alan Mackenzie)

Internal API and Implementation

  • Improve: Make Qunbound into an opaque object, simplify symbols.c (Aidan Kehoe)
  • Fix: Prevent scan_sexps_forward interpreting very large argument as -1 (Alan Mackenzie)
  • Fix: Handle the %t modeline spec properly once more (Aidan Kehoe)
  • Improve: Add KEYWORDS as a value for struct Lisp_Subr.max_args, use it (Aidan Kehoe)
  • Improve: Choose test based on type of key argument for find_htentry(), elhash.c (Aidan Kehoe)
  • Improve: Make #'true-list-p, #'safe-length 15% faster (Aidan Kehoe)
  • Improve: Make staticpro() work with heap addresses (Aidan Kehoe)
  • Improve: Modernize loadhist.el, use structured errors, #'file-system-ignore-case-p (Aidan Kehoe)
  • Improve: Add {define,undef}_lisp_object(), encapsulate creating lrecord types (Aidan Kehoe)
  • Improve: Add dump_add_nil_lisp_object(), staticpro_dump_nil(). Use them (Aidan Kehoe)

Testing and Debugging

  • Test symbol boundary anchors (Aidan Kehoe, Alan Mackenzie)
  • Check that compiled functions supplied as arguments to (interactive ...) in lambdas are not doubly-compiled (Aidan Kehoe)
  • Test detection of coding cookies (Aidan Kehoe)
  • Test #'compare-buffer-substrings (Aidan Kehoe)
  • Move code testing unicode-error-default-translation-table, unicode-invalid-sequence-regexp-range here (Aidan Kehoe)
  • Test #'call-interactively (Aidan Kehoe)
  • Test resize_string() with big, small strings (Aidan Kehoe)
  • Test colors are read and scaled correctly (Richard Hopkins)
  • Test shifted motion handling (Aidan Kehoe)

ChangeLogs for XEmacs 21.5.36 "kohlrabi"

goto announcement, summary, changes

ChangeLog Entries from ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: Remove support for building ldap, canna,
        postgresql into the temacs binary.
        * configure: Regenerate.

2025-03-04  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (DUMP_FILE_NAME): New, just xemacs.dmp. Use
        AC_SUBST() to make it available to Makefile.in.in.
        In passing make AC_DEFINE_UNQUOTED(SHEBANG_PROGNAME ...) a bit
        more sensible.
        * configure: Regenerate.

2025-02-24  Stephen Turnbull  <turnbull@sk.tsukuba.ac.jp>

        * Makefile.in.in:
        Find module auto-autoloads in module build tree, not source tree.

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        Remove --with-mule as an option, always on.
        Remove --with-default-eol-detection as an option, only relevant
        with non-MULE.
        * configure: Regenerate.

2025-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in (install-arch-dep):
        Install DOC as DOC-DUMP-ID, to avoid the longstanding irritation
        of installing another XEmacs corrupting the docfile of a running,
        installed, XEmacs.

2024-12-24  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (XE_COMPLEX_ARG):
        Revise --with-quick-build to turn off --with-dump-in-exec (unless
        otherwise explicitly specified), document this. Remove mention of
        garbage-collection after loading each file during dumping, no
        longer relevant.
        * configure: Regenerate.

2024-12-24  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (libc_version): Remove detection of libc version
        from configure.ac, it is not remotely as necessary as it was a
        couple of decades ago, and Mats advises me it is buggy on Gentoo.
        * configure: Regenerate.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        Install the dump file in ${archilibdir}, not in the same directory
        as the XEmacs executable, for better conformance with usual Unix
        practice.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        Install the dump file properly if non-DUMP_IN_EXEC. No longer
        check the PDUMP define. This is no longer available since it is
        impossible to turn it off, unexec has been removed.

2024-11-03  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: Only attempt to turn off ASLR if the data and text
        (C code) relative offsets are unpredictable from one invocation
        to the next.
        * configure: Regenerate.

2024-10-17  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac : No longer use XE_PROTECT_LINKER_FLAGS on LDFLAGS,
        comment as to motivation for this. Thank you Mats Lidell and the
        Gentoo users.
        * configure: Regenerate.

2023-11-26  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: Define _XOPEN_SOURCE as 600 on Linux.
        * configure: Regenerate.

2024-02-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * Makefile.in.in (etc/PROBLEMS): Improve portability; $^ is not
        available on BSD make for example and would error with

        cp  etc/PROBLEMS
        usage: cp [-R [-H | -L | -P]] [-f | -i] [-alNpv] src target
        cp [-R [-H | -L | -P]] [-f | -i] [-alNpv] src1 ... srcN directory
        *** Error code 1

        `make` now succeeds on BSD make.

2023-05-14  Aidan Kehoe  <kehoea@parhasard.net>

        * CHANGES-beta:
        Correct attribution of OpenSSL bignum support.
        Add new skeleton for 21.5.36.

2023-05-14  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        Default --with-mule to on; document this.

        * configure: Regenerate.

ChangeLog Entries from etc/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-02-24  Aidan Kehoe  <kehoea@parhasard.net>

        * TUTORIAL.cs:
        * TUTORIAL.de:
        * TUTORIAL.es:
        * TUTORIAL.fr:
        * TUTORIAL.hr:
        * TUTORIAL.ja:
        * TUTORIAL.ko:
        * TUTORIAL.ko:
        * TUTORIAL.no:
        * TUTORIAL.pl:
        * TUTORIAL.ro:
        * TUTORIAL.ru:
        * TUTORIAL.se:
        * TUTORIAL.sk:
        * TUTORIAL.sl:
        * TUTORIAL.th:
        * TUTORIAL.th:
        Add coding cookies to all the TUTORIAL files now non-MULE is gone.

ChangeLog Entries from lib-src/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-09  Aidan Kehoe  <kehoea@parhasard.net>

        * etags.c (savenstr):
        Use memset () and then memcpy() within this, silence a strncpy()
        warning with GCC 15.
        * gnuclient.c (get_current_working_directory): Always include a
        trailing slash in the return value of this, making
        filename_expand() simpler.
        * gnuclient.c (filename_expand): Take a new FULLPATH_LEN
        argument. Use snprintf() for its bounds checking and to suppress
        warnings regarding strncat() from GCC 15.
        * gnuclient.c (main):
        Pass sizeof (fullpath) to filename_expand().
        * make-docfile.c (scan_lisp_file):
        Give up if we encounter a dynamic docstring length that was not
        specified.
        Check that LENGTH is positive before writing to
        saved_string[length - 1], quiet a GCC-15 warning.
        * ootags.c (savenstr):
        Use memset () and then memcpy() within this, silence a strncpy()
        warning with GCC 15.

2025-05-27  Aidan Kehoe  <kehoea@parhasard.net>

        Remove some obsolete or minimally useful C files from lib-src/,
        reduce maintenance burden, risk of security holes.

        * Makefile.in.in:
        * Makefile.in.in (profile): Remove this target.
        * Makefile.in.in (digest-doc): Remove this target.
        * Makefile.in.in (sorted-doc): Remove this target.
        * Makefile.in.in (b2m): Remove this target.
        * Makefile.in.in (cvtmail): Remove this target.
        * Makefile.in.in (fakemail): Remove this target.
        * b2m.c: File removed. This converted Babyl format mail to mbox
        files. If someone who is not a MacArthur genius is still using
        rmail with a Babyl format inbox, that person should stop using it
        immediately, and use the pre-deletion code to convert to an mbox
        file and use VM (or theoretically Thunderbird), that person should
        not expect any support going forward.
        If any MacArthur genius wishes to use rmail, I encourage that
        individual to (continue to) use GNU Emacs, and avail of the
        development resources provided to GNU Emacs in his or her use of
        rmail.

        * cvtmail.c: File removed. This converted Gosling Emacs mail
        directories to Babyl format, so a very very obsolete format to a
        very obsolete format. I encourage anyone using Gosling Emacs mail
        directories to use older Mercurial revisions to convert their
        data.

        * digest-doc.c: File removed.  This converted the output of
        make-docfile to groff(1) format. This is very easily achievable in
        Lisp and I volunteer to do this if anyone cares that the C version
        of this file was removed.
        * fakemail.c: File removed. System V is long gone, no need to
        persist with this.
        * profile.c: File removed. Not actually used by our profiling
        code, source of potential security problems, better gone.
        * sorted-doc.c: File removed.
        This converted the output of make-docfile to texinfo. This is very
        easily achievable in Lisp and I volunteer to do this if anyone
        cares that the C version of this file was removed.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * ellcc.c (do_init_mode):
        * make-docfile.c (main):
        * make-docfile.c (scan_c_file):
        Revise the approach to module encoding, make a variable
        emodule_coding available that reflects the coding system of the
        symbols and docstrings in the module, don't specify it separately
        for each docstring.
        Just use no-conversion for now, working plan is to move
        make-docfile, ellcc to Lisp, which will make it practical to use
        the coding detection infrastructure at the time of generation of
        the mod-output file.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.c (scan_c_file):
        Handle DEFUN() forms with KEYWORDS as MAX_ARGS, a feature just
        added to core.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        Generate definitions for lrecord_type_##c_name, making
        DECLARE_MODULE_LISP_OBJECT() work.
        * make-docfile.c:
        * make-docfile.c (xmalloc): Change this to return void * as is
        better practice generally.
        * make-docfile.c (main):
        Print int lrecord_type_##c_name for any objects encountered.
        * make-docfile.c (scan_c_file):
        Save c_name for any object definitions encountered.

2025-03-03  Aidan Kehoe  <kehoea@parhasard.net>

        * cvtmail.c (main):
        NAME is not large enough to hold fourteen characters and a
        terminating zero, correct this. Thank you clang-19.

2025-01-22  Aidan Kehoe  <kehoea@parhasard.net>

        * etags.c:
        * etags.c (snprintf): Add a kludgy implementation of this #ifndef
        HAVE_SNPRINTF, that just exits if the buffer overflows.
        * etags.c (fn_exp):
        Use it in preference to strcpy().
        * etags.c (sort_tags_file):
        Slightly different approach to printing line endings, silencing
        warnings on OpenBSD.
        * etags.c (write_classname):
        Use snprintf() in preference to calls to strcat, strncat.

        * gnuclient.c:
        * gnuclient.c (snprintf): Add a kludgy implementation of this #ifndef
        HAVE_SNPRINTF, that just exits if the buffer overflows.

        * gnuclient.c (tell_emacs_to_resume): Use it.
        * gnuclient.c (my_strdup):
        Revise this to silence warnings.
        * gnuclient.c (main):
        Use snprintf(). Pass read_line() its new DESTSIZE argument.

        * gnuserv.c:
        * gnuserv.c (snprintf): Add a kludgy implementation of this #ifndef
        HAVE_SNPRINTF, that just exits if the buffer overflows.
        * gnuserv.c (ipc_init): Use it.
        * gnuserv.c (unix_init): Use it.
        * gnuserv.h (read_line): Update declaration.
        * gnuslib.c (read_line): Take a new DESTSIZE argument. Use
        snprintf for its bounds checking. Always zero-terminate.

2024-12-22  Aidan Kehoe  <kehoea@parhasard.net>

        * insert-data-in-exec.c: Removed.
        * Makefile.in.in (BUILD_UTILITIES): Remove insert-data-in-exec
        * Makefile.in.in (insert-data-in-exec.o): Remove this as a target.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.c:
        * make-docfile.c (put_filename_as_c_string): New.
        * make-docfile.c (scan_c_file): Use it.
        When dealing with modules, print the file name of the subrs and
        the coding system used for the file name and for the documentation
        string (currently just no-conversion), now that is accepted by the
        module code.

2024-08-26  Aidan Kehoe  <kehoea@parhasard.net>

        * ootags.c (main):
        RE_INTERVALS has always been included in RE_SYNTAX_EMACS, don't
        specify this explicitly.

2024-04-06  Richard Hopkins  <xemacs@unbit.co.uk>

        * etags.c (sort_tags_file): Prevent crash when updating ctags file
        for 0 tags.

2024-02-16  Richard Hopkins  <xemacs@unbit.co.uk>

        Use Boolint instead of bool - the definition is from src/lisp.h.
        This also allows building on later C versions, such as GCC 13.2
        with -std=c2x, where previously it would output...

        error: two or more data types in declaration specifiers
        => typedef int bool;

        warning: useless type name in empty declaration
        => typedef int bool;

        warning: initialization of 'int *' from incompatible pointer type '_Bool *' [-Wincompatible-pointer-types]
        => { "globals",                  no_argument,       &globals, TRUE  },

        * ootags.c (bool): Rename to Boolint.
        (Boolint): New - same definition as src/lisp.h.
        (node):
        (pfnote):
        (new_pfnote):
        (filename_is_absolute):
        (pattern):
        (fn_exp):
        (gfnames):
        (main):
        (token):
        (consider_token):
        (make_C_tag):
        (C_entries):
        (tail):
        (Pascal_functions):
        (scan_separators): Use Boolint instead of bool.

2024-02-16  Richard Hopkins  <xemacs@unbit.co.uk>

        * ootags.c (print_language_names):
        (print_version):
        (print_help):
        (fn_exp):
        (gfnames):
        (system):
        (massage_name):
        (get_language_from_name):
        (get_language_from_interpreter):
        (get_language_from_suffix):
        (process_file):
        (init):
        (find_entries):
        (pfnote):
        (new_pfnote):
        (free_tree):
        (add_node):
        (number_len):
        (total_size_of_entries):
        (C_symtype):
        (consider_token):
        (make_C_tag):
        (C_entries):
        (default_C_entries):
        (plain_C_entries):
        (Cplusplus_entries):
        (Cjava_entries):
        (Cstar_entries):
        (Yacc_entries):
        (just_read_file):
        (tail):
        (takeprec):
        (getit):
        (Fortran_functions):
        (Perl_functions):
        (Python_functions):
        (Cobol_paragraphs):
        (Pascal_functions):
        (L_isdef):
        (L_isquote):
        (L_getit):
        (Lisp_functions):
        (Postscript_functions):
        (Scheme_functions):
        (get_scheme):
        (TeX_functions):
        (TEX_mode):
        (TEX_decode_env):
        (TEX_Token):
        (Prolog_functions):
        (prolog_skip_comment):
        (prolog_pred):
        (prolog_atom):
        (Erlang_functions):
        (erlang_func):
        (erlang_attribute):
        (erlang_atom):
        (scan_separators):
        (analyse_regex):
        (add_regex):
        (substitute):
        (free_patterns):
        (initbuffer):
        (readline_internal):
        (readline):
        (savestr):
        (savenstr):
        (etags_strrchr):
        (etags_strchr):
        (skip_spaces):
        (skip_non_spaces):
        (fatal):
        (pfatal):
        (suggest_asking_for_help):
        (error):
        (concat):
        (etags_getcwd):
        (relative_filename):
        (absolute_filename):
        (absolute_dirname):
        (filename_is_absolute):
        (canonicalize_filename):
        (grow_linebuffer):
        (xmalloc):
        (xrealloc): Convert to ANSI C function definitions.

2024-02-16  Richard Hopkins  <xemacs@unbit.co.uk>

        * etags.c (print_language_names):
        (print_version):
        (print_help):
        (fn_exp):
        (gfnames):
        (system):
        (massage_name):
        (main):
        (get_compressor_from_suffix):
        (get_language_from_langname):
        (get_language_from_interpreter):
        (get_language_from_filename):
        (process_file_name):
        (process_file):
        (init):
        (find_entries):
        (make_tag):
        (pfnote):
        (free_tree):
        (free_fdesc):
        (add_node):
        (invalidate_nodes):
        (number_len):
        (total_size_of_entries):
        (put_entries):
        (hash):
        (in_word_set):
        (C_symtype):
        (pushclass_above):
        (popclass_above):
        (write_classname):
        (consider_token):
        (make_C_tag):
        (C_entries):
        (default_C_entries):
        (plain_C_entries):
        (Cplusplus_entries):
        (Cjava_entries):
        (Cstar_entries):
        (Yacc_entries):
        (just_read_file):
        (F_takeprec):
        (F_getit):
        (Fortran_functions):
        (Ada_getit):
        (Ada_funcs):
        (Asm_labels):
        (Perl_functions):
        (Python_functions):
        (PHP_functions):
        (Cobol_paragraphs):
        (Makefile_targets):
        (Pascal_functions):
        (L_getit):
        (Lisp_functions):
        (Lua_functions):
        (PS_functions):
        (Forth_words):
        (Scheme_functions):
        (TeX_commands):
        (TEX_mode):
        (TEX_decode_env):
        (Texinfo_nodes):
        (HTML_labels):
        (Prolog_functions):
        (prolog_skip_comment):
        (prolog_pr):
        (prolog_atom):
        (Erlang_functions):
        (erlang_func):
        (erlang_attribute):
        (erlang_atom):
        (scan_separators):
        (analyse_regex):
        (add_regex):
        (substitute):
        (free_regexps):
        (regex_tag_multiline):
        (nocase_tail):
        (get_tag):
        (readline_internal):
        (readline):
        (savestr):
        (savenstr):
        (etags_strrchr):
        (etags_strchr):
        (etags_strcasecmp):
        (etags_strncasecmp):
        (skip_spaces):
        (skip_non_spaces):
        (fatal):
        (suggest_asking_for_help):
        (error):
        (concat):
        (etags_getcwd):
        (relative_filename):
        (absolute_filename):
        (absolute_dirname):
        (filename_is_absolute):
        (canonicalize_filename):
        (linebuffer_init):
        (linebuffer_setlen):
        (xmalloc):
        (xrealloc): Convert to ANSI C function definitions.

2023-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        Avoid another command execution vulnerability by calling qsort ()
        and then making the result unique in C.
        GNU's approach to this involved functions that are of recent
        vintage (thus, less portable) and not necessary.

        Fix up some compiler warnings in passing.

        * etags.c:
        * etags.c (do_move_file):
        Rearrange declarations, add braces to conform to old C.
        * etags.c (cmpstringp): New.
        * etags.c (sort_tags_file): New.
        Given a tag file name, load it, sort it, and make entries unique
        without calling an external program. Write the modified data back
        into the initial file. Preserve line endings. If there is no line
        ending, preserve that.
        * etags.c (cleanup_tags_file):
        Use a globally-unique name for TAGFILE. Rearrange declarations,
        add braces to conform to old C.
        * etags.c (pfatal):

2023-10-08  Aidan Kehoe  <kehoea@parhasard.net>

        * etags.c:
        * etags.c (do_move_file): New.
        * etags.c (cleanup_tags_file): New.
        * etags.c (main): Use them.
        Avoid a command execution vulnerability in this file, thank you Xi
        Lu on Heptapod; change also in GNU.

ChangeLog Entries from lisp/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-11  Alan Mackenzie  <acm@muc.de>

        Enhance the handling of syntax-table properties.  This enables C-u
        C-x = (`what-cursor-position') to work on, for example,
        unterminated string delimiters in C Mode.

        * syntax.el (modify-syntax-entry): Add documentation for ! =
        comment-fence and | = string-fence in the doc string.

        * syntax.el (describe-syntax-code): In the array of syntax textual
        descriptions, replace the ?obsolete "extended-word-constituent"
        with "comment-fence", and append "string-fence".

2025-06-11  Alan Mackenzie  <acm@muc.de>

        Fontify also the last character of an unterminated string.

        * font-lock.el (font-lock-fontify-syntactically-region): Before
        subtracting 1 from the second argument to font-lock-set-face (for
        the closing double quote), check the string was actually closed.

2025-06-06  Alan Mackenzie  <acm@muc.de>

        Correct the value of regexp-opt on being given an empty list.

        * regexp-opt.el (regexp-opt): Return a regexp which doesn't match
        anything when the STRINGS argument is the empty list.

2025-06-05  Alan Mackenzie  <acm@muc.de>

        Purge the package-suppress mechanism from XEmacs.

        Make the versions of easy-mmode.el and regexp-opt.el in
        .../xemacs/lisp the active ones.

        * easy-mmode.el:
        Restore the commented out ;;;###autoload cookies.

        * packages.el:
        * packages.el (package-suppress): Removed.

2025-06-05  Aidan Kehoe  <kehoea@parhasard.net>

        Remove support for emacs implementations without #'add-timeout,
        itimer.el, significantly simplifying the file.

        * itimer.el:
        * itimer.el (itimer-version): Bump this.
        * itimer.el (itimer-timer): Update the docstring here.
        * itimer.el (itimer-process): Removed.
        * itimer.el (set-itimer-value): Just use #'itimer-timer-wakeup
        here, not #'itimer-driver-wakeup.
        * itimer.el (activate-itimer): Ditto.
        * itimer.el (list-itimers): In passing revise this to make
        #'itimer-truncate-string a label and to traverse the list of
        itimers in a more post-1990 way.
        * itimer.el (edit-itimers): Call #'itimer-timer-wakeup here.
        * itimer.el (itimer-truncate-string): Moved to being a label
        within #'list-itimers.
        * itimer.el (itimer-run-expired-timers):
        last-command-event-time, last-input-time will both always be
        bound, don't check for that.
        * itimer.el (itimer-process-filter): Removed.
        * itimer.el (itimer-disable-timeout): Removed, now equivalent to
        #'disable timeout.
        * itimer.el (itimer-process-sentinel): Removed.
        * itimer.el (itimer-timer-driver): Just call #'disable-timeout
        within this.
        * itimer.el (itimer-process-start): Removed.
        * itimer.el (itimer-driver-start): Removed.
        * itimer.el (itimer-driver-wakeup): Removed.
        * itimer.el (itimer-process-wakeup): Removed.

2025-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        Support text/plain, text/plain;charset=utf-8 when cutting and
        pasting under X11, needed for more recent clients that are not
        interested in longstanding standards (Libreoffice and the terminal
        emulator Terminology in my use).
        * select.el:
        * select.el (selection-preferred-types): Add them to this.
        * select.el ('selected-text-type): Remove this obsolete name in
        passing.
        * select.el (own-selection): Fix some indentation in passing.
        * select.el (select-convert-from-undecided-text): New. Now used when
        supplied text/plain, use our coding detection to work out what
        encoding is in use.
        * select.el (selection-converter-out-alist): Add the new entries
        here. 
        * select.el (selection-converter-in-alist): And here.
        * select.el (selection-coercible-types): Fix some indentation
        here.

2025-05-25  Alan Mackenzie  <acm@muc.de>

        * regexp-opt.el (regexp-opt):
        Handle a PAREN value of `symbols' which now wraps the inner
        regular expression in the symbol brackets "\\_<" and "\\_>".

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * byte-optimize.el (byte-compile-unfold-lambda):
        No longer call #'fetch-bytecode in this, quiet a warning.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        Take an optional TEST argument, #'assoc, as does GNU. Revise
        related compiler macros to reflect this.

        * cl-macs.el:
        * cl-macs.el (assoc):
        Handle the optional TEST argument in this compiler macro. Still
        transform to an #'assq call if we can tell at compile time that
        #'eq is the appropriate test.
        * cl-macs.el (assoc*): New explicit compiler macro for this
        function, can't handle #'assoc* in the define-star-compiler-macros
        macro any more.
        * cl-macs.el (define-star-compiler-macros): Remove handling of
        #'assoc* from here.
        * custom.el (custom-current-group): This is called very early when
        #'assoc is not available, use #'assoc* instead.
        * custom.el (custom-declare-group): Ditto.
        * subr.el (assoc): New. Moved here from sequence.c.

2025-05-24  Alan Mackenzie  <acm@muc.de>

        Make "\\_<" and "\\_>" work in regexp buffer searches.

        * isearch-mode.el (isearch-search):
        Translate an error message from regex.c beginning with "Invalid "
        into "invalid input" rather than "incomplete input".

2025-05-24  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el (byte-compile-lambda):
        Don't double-compile a compiled function supplied as the argument
        to (interactive ...), thank you Alan Mackenzie.

2025-05-11  Aidan Kehoe  <kehoea@parhasard.net>

        * update-elc.el:
        Correct the dependency checks when --with-dump-in-exec here.
        In passing, short circuit the checks for .el and .elc files being
        out of date with regard to the dump files, once it has been t once
        there's no need to do a stat(2) for any further files.

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        * files.el (coding-system-for-read)): defvar removed.
        * files.el (buffer-file-coding-system)): defvar removed.
        No need for these declarations now the non-mule option is gone.
        * files.el (hack-one-local-variable):
        Update a comment here.

2025-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * obsolete.el:
        * obsolete.el (cl-delete-duplicates): Removed.
        No longer needed, and conflicts with GNU's cl-lib function name
        (calling convention is distinct), better gone.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * subr.el (true-list-p):
        * subr.el (safe-length):
        Make both of these 15% faster, use Lisp boolean negation and the
        associated bytecodes for advancing the tortoise rather than
        calling #'logand on the counter
        (#'logand has no byte code).

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        * loadhist.el (feature-file):
        * loadhist.el (file-symbols):
        * loadhist.el (unload-feature):
        Modernize loadhist.el; return structured errors, use
        #'file-system-ignore-p to determine the comparison function when
        testing, use #'remove* instead of #'delete + #'copy-sequence.
        No need to wrap #'unload-module in #'declare-fboundp given
        HAVE_SHLIB is the default.

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el (member):
        No need to explicitly set stack-trace-on-error, debug-on-error to
        nil before dump.

2025-03-11  Aidan Kehoe  <kehoea@parhasard.net>

        * subr.el (replace-list):
        Correct a bug in this implementation just elicited in frame.c,
        thank you Stephen Turnbull.

2025-03-08  Aidan Kehoe  <kehoea@parhasard.net>

        * subr.el (replace-list): New. Moved here from fns.c.
        * subr.el ('substring): Removed. Alias now created in sequence.c.

2025-03-06  Aidan Kehoe  <kehoea@parhasard.net>

        * unicode.el:
        Move some code that tested unicode-error-default-translation-table
        and unicode-invalid-sequence-regexp-range to
        ../tests/automated/regexp-tests.el.

2025-03-01  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (early-error-handler):
        Move #'force-debugging-signal inside the binding of STREAM, fix a
        bug and avoid a compile-time warning.

2025-02-24  Aidan Kehoe  <kehoea@parhasard.net>

        Remove checks for (featurep 'mule) from core Lisp, making our code
        a little more maintainable. The Lisp side of eed34ee08c9b . 

        * autoload.el (autoload-featurep-protect-autoloads):

        * bytecomp.el (byte-recompile-ignore-uncompilable-mule-files):
        Removed. No longer needed with removal of support for non-Mule.

        * bytecomp.el (byte-recompile-directory):
        Always execute the Mule-specific code.
        * bytecomp.el (byte-recompile-file): Ditto.
        * bytecomp.el (byte-compile-file): Ditto.
        * bytecomp.el (byte-compile-maybe-reset-coding): Ditto.
        * code-init.el:
        * code-init.el (eol-detection-enabled-p): Default this to
        t. Remove docstring commentary that is no longer true.
        * code-init.el (set-eol-detection):
        Remove docstring commentary that is no longer true.
        * code-init.el (coding-system-current-system-configuration):
        Remove the non-Mule options for this.
        * code-init.el (define-coding-system-default-configuration):
        Remove the no-mule-no-eol-detection, no-mule-eol-detection,
        windows-no-mule calls for this.
        * code-init.el (reset-coding-categories-to-default):
        Correct indentation here. Always execute the Mule code.

        * coding.el: Remove some non-Mule code, no longer needed.
        * compose.el:
        Use Unicode character literals instead of load time #'decode-char
        calls. No need to construct a big if statement at load time
        depending on whether characters can be decoded.

        * dumped-lisp.el (preloaded-file-list):
        Always load the Mule-relevant files.

        * fill.el (fill-move-forward-to-break-point):
        * fill.el (fill-region-as-paragraph):
        Always call the kinsoku processing in this file.

        * finder.el (finder-known-keywords):
        Always include Mule in the keywords.
        * gtk-font-menu.el (gtk-reset-device-font-menus):
        * gtk-font-menu.el (gtk-font-menu-font-data):
        Don't check (featurep 'mule) here.
        * help.el:
        * help.el (tutorial-supported-languages): Removed.
        This has actually been basically unused for decades, information
        taken from the language environment.
        * help.el (help-with-tutorial):
        Use #'read-language-name unconditionally when reading args.
        Trust the coding cookies in the tutorial files, just added, don't
        bind coding-system-for-read.
        * iso8859-1.el:
        Remove some non-Mule code.
        * menubar-items.el (default-menubar):
        Unconditionally include entries relevant to Mule.
        * menubar-items.el (tutorials-menu-filter):
        Ditto.

        * msw-font-menu.el (mswindows-font-menu-font-data):
        Don't check (featurep 'mule) here.
        * newcomment.el (comment-indent-new-line):
        Always call kinsoku processing here.
        * package-get.el (package-get):
        Never error because of no Mule support.
        * packages.el (packages-package-hierarchy-directory-names):
        Unconditionally include the Mule packages.

        * paragraphs.el (sentence-end-without-space):
        Update this to assume Mule is always available.
        * paragraphs.el (sentence-end-base): Ditto.
        * select.el (selection-preferred-types):
        Always include COMPOUND_TEXT here.

        * simple.el (do-auto-fill):
        Always call kinsoku processing here.
        * startup.el (command-line):
        * startup.el (splash-screen-window-body):
        * startup.el (startup-setup-paths):
        * startup.el (startup-setup-paths-warning):
        * startup.el (startup-load-autoloads):
        Always call the Mule code in this file. Remove non-Mule code.
        * syntax.el (describe-char-table): Ditto.
        * unicode.el: Ditto.
        * update-elc-2.el:
        * update-elc-2.el (update-elc-ignored-dirs):
        Never include "mule/" in this .
        * update-elc-2.el (batch-update-elc-2):
        Always call the Mule code within this.
        * update-elc.el:
        * update-elc.el (update-elc-files-to-compile):
        Ditto.
        * version.el (emacs-version):
        Always include ", Mule" in the version string.
        * x-font-menu.el (x-reset-device-font-menus-core):
        Remove non-Mule code.
        * x-font-menu.el (x-font-menu-font-data-xft): Ditto.
        * x-font-menu.el (x-font-menu-font-data-core): Ditto.

2025-02-22  Aidan Kehoe  <kehoea@parhasard.net>

        Remove byte-compile-dynamic from the byte compiler, no longer
        worth the decrease in speed and difficulties with files being
        recompiled and offsets getting incorrect with with RAM sizes as
        they are.
        * bytecomp.el:
        * bytecomp.el (byte-compile-dynamic-docstrings): Default this to
        t. Document that it is not currently implemented for files with
        character or string literals with numeric value above ?\xFF.
        * bytecomp.el (byte-compile-dynamic): Removed.
        * bytecomp.el (byte-compile-close-variables):
        Remove byte-compile-dynamic from here.
        * bytecomp.el (byte-compile-from-buffer): Ditto.
        * bytecomp.el (byte-compile-maybe-reset-coding): Ditto.
        * bytecomp.el (byte-compile-output-docform): Ditto.
        * bytecomp.el (byte-compile-file-form-defmumble): Ditto.
        * obsolete.el (fetch-bytecode): New. Moved here from bytecode.c.

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        * simple.el (kill-forward-chars): Removed.
        This has always been supplied a fixnum argument by #'delete-char
        as far back as our version control goes, so it adds no value
        beyond #'delete-char calling #'kill-region directly.
        Unsurprisingly it is not used in packages.

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * obsolete.el (make-local-handler):
        Add a handler that errors on attempting
        `make-variable-buffer-local' on before-change-function,
        after-change-function.

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * cmdloop.el (self-insert-internal): New.
        Move this here from cmds.c, never called frequently enough to
        merit being in C.

2025-01-13  Aidan Kehoe  <kehoea@parhasard.net>

        * minibuf.el (read-number):
        Call (ding nil ...) for symmetry with the completing-read code,
        don't abort keyboard macros as does (beep) without arguments.

2025-01-12  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (early-error-handler):
        If (featurep 'debug-exemacs) and otherwise about to exit, call
        #'force-debugging-signal within this function and not from C.

2025-01-06  Aidan Kehoe  <kehoea@parhasard.net>

        * obsolete.el:
        * obsolete.el (before-change-function):
        * obsolete.el (after-change-function):
        Move the implementation of these obsolete variables to Lisp, using
        symbol-value handlers.

2024-12-24  Aidan Kehoe  <kehoea@parhasard.net>

        No longer GC after loading every file when dumping, there is no
        benefit to this with pdump.
        Rationalise things with this, no longer make a #'pureload function
        available at any point, examine the output of (emacs-run-status)
        instead.
        * auto-show.el:
        Fix a bug with this, turn on auto-show-mode if we are currently
        dumping, rather than if the symbol pureload is bound as a
        variable.

        * cus-face.el (custom-declare-face):
        * dumped-lisp.el (preloaded-file-list):
        Remove mention of #'pureload from comments in these files.

        * loadup.el:
        Don't bind gc-cons-threshold within code to load those files in
        preloaded-file-list.
        Rationalise things a bit, print the load path as it is actually
        determined, not before it is set.
        Remove some debugging code that will now never be called, since
        #'load errors rather than returning nil.

        * site-load.el:
        * site-load.el (file-exists-p):
        Just (mapc #'load site-load-packages), no need for a pureload
        macro.
        * update-elc.el (preloaded-file-list):
        Modernise some error-handling code here, now #'format is not
        built-in.

2024-12-24  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el (member):
        #'really-free is never bound these days, remove mention of it.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * setup-paths.el (paths-emacs-root-p):
        Remove autodetection of exec-directory including /libexec/, since
        we are tightening up allowed paths with the dump file
        --without-dump-in-exec.

2024-12-17  Aidan Kehoe  <kehoea@parhasard.net>

        * glyphs.el (toolbar-button-p): New. Moved here from toolbar.c,
        keep it available on non-toolbar builds.
        * specifier.el (toolbar-specifier-p): New. Moved here from
        toolbar.c, keep it available on non-toolbar builds.
        * loadup.el:
        Remove stub implementations of these functions from loadup.el.

2024-11-30  Aidan Kehoe  <kehoea@parhasard.net>

        * info.el (Info-extract-dir-entry-from):
        Use #'Info-insert-file-contents' rather than
        #'insert-file-contents in this file, handling compressed files
        appropriately. Thank you for the bug report, Mats Lidell.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * loadhist.el (symbol-file):
        Return the C source file for symbols loaded from modules, now that
        is available.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * loadhist.el (unload-feature):
        Do a better job within this function, check for defun as the first
        element of a cons entry in load-history and #'fmakunbound
        appropriately.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * help.el (describe-function-1):
        Simplify this function a little.
        * loadhist.el (symbol-file):
        Handle subrs and vars loaded from modules better within this
        function.

2024-10-13  Aidan Kehoe  <kehoea@parhasard.net>

        * subr.el (max, min):
        Move these here from data.c, for the sake of mantainability and no
        loss of speed.
        We have been returning markers from these functions since 2018
        without problems; change things slightly to never convert the
        arguments.

2024-08-18  Aidan Kehoe  <kehoea@parhasard.net>

        * files.el (find-file-noselect-1):
        * gutter-items.el (clear-progress-feedback):
        * gutter-items.el (abort-progress-feedback):
        * gutter-items.el (raw-append-progress-feedback):
        * simple.el (clear-message):
        * simple.el (remove-message):
        * simple.el (raw-append-message):
        `inhibit-read-only' is a local variable in the minibuffer (see
        Kyle Jone's commit of 1997-11-16) and so binding it and then
        calling #'erase-buffer without making the relevant buffer current
        can fail. Correct this, avoid wedging the echo area with
        blink-matching-open and read-only duplicable extents.

2024-06-20  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp-runtime.el (byte-compile-annotate-interactive): New.
        Return a list to aid #'call-interactively in constructing
        command-history, analysing its argument S-expression and returning
        a list that documents which arguments in an interactive form
        should be replaced by explicit calls to (point), (mark) and
        friends in the command history.
        Called both at compile time and at runtime.
        * bytecomp.el (byte-compile-lambda): Use it. Always compile and
        save the interactive spec, as a compiled function that returns a
        cons comprising the metadata as its car and the result of
        calling the S-expression as its cdr.

2024-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        * apropos.el (apropos-internal):
        Move this here from symbols.c, add an autoload cookie. There is
        minimal speed advantage now to having this in Lisp and this file
        is a better place for it than symbols.c.

2024-05-06  Aidan Kehoe  <kehoea@parhasard.net>

        * simple.el (current-command-is-motion):
        Make the value for xemacs-mod-shift more robust, work it out by
        generating an event with the shift modifier at byte-compile time
        and querying it for its modifier bits.

2024-04-15  Aidan Kehoe  <kehoea@parhasard.net>

        * info.el (Info-find-file-node):
        Ensure buffer-file-coding-system reflects the coding system of the
        current Info file by killing its local value on loading a fresh
        Info superfile. This makes the anchor handling more reliable.
        * info.el (Info-load-subfile):
        Force the coding system determined for the superfile to apply to
        the subfile (since the superfile routinely has coding cookies that
        the subfile lacks.)

2024-05-01  Aidan Kehoe  <kehoea@parhasard.net>

        * cmdloop.el (maybe-display-char): New.
        If #'read-char, #'read-char-exclusive, #'read-quoted-char are
        supplied a PROMPT argument, echo the character read for better
        user feedback and for symmetry with #'read-string and friends.  Do
        not echo if PROMPT is nil.

2024-03-23  Aidan Kehoe  <kehoea@parhasard.net>

        Add support for anchors within #'Info-find-file-node, by means of
        triangulating back from the previous or next nodes. Thank you for
        the bug report, Mats Lidell.
        * info.el:
        * info.el (Info-tag-table-marker): Removed.
        * info.el (Info-tag-table-buffer): Removed.
        * info.el (Info-tag-table): New variable.
        * info.el (Info-tag): New structure.
        * info.el (Info-subfiles): New variable.
        * info.el (Info-load-tag-table): New function. To be called at the
        time of loading of an info file, parses the textual tag table into
        a list documenting tag names, subfile names, and byte offsets.
        * info.el (Info-find-file-node):
        Revise to use the tag table parsed at the time the file is
        loaded.
        * info.el (Info-read-subfile): Removed. This no longer fits our
        needs.
        * info.el (Info-load-subfile): New. Similar function to previous,
        explicitly takes the file name to be loaded. 
        * info.el (Info-build-node-completions):
        Use Info-tag-table when constructing the node completions.
        * info.el (Info-search):
        Use Info-subfiles when iterating through the subfiles when
        searching.
        * info.el (Info-mode):
        * info.el (Info-cease-edit):
        Remove use of variables that are no longer in use in these functions.

2024-03-01  Richard Hopkins  <xemacs@unbit.co.uk>

        * term/xterm.el: Define Insert + Delete with modifiers in
        `function-key-map'.

2024-02-29  Richard Hopkins  <xemacs@unbit.co.uk>

        * term/xterm.el: Define Page Up + Page Down keys
        (prior, next) with all modifier combinations in
        `function-key-map'.

2023-10-24  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-lookup-rgb-components): Inhibit
        "Note: file is write protected" - we're only doing lookups in a
        hidden buffer.

2023-10-21  Richard Hopkins  <xemacs@unbit.co.uk>

        * tty-init.el (make-device-late-tty-entry-point): Register
        standard XTerm 256 colors when the device supports 256 colors.
        The color names are "color-N" which is based on the the XTerm
        number and is also used on GNU Emacs.

2023-10-18  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-parse-rgb-components): Add and use
        scale-rgb-components to correct scaling of rgb:hex/hex/hex
        variants and the 3 digit per component #hex string.

2023-10-17  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-parse-rgb-components): Correct scaling of colors
        with a single hex digit per component.

2023-10-16  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-parse-rgb-components): Correct scaling of colors
        in #fefefe format.  This also fixes usages of
        #'font-color-rgb-components with input strings having a component
        range of

        a) [0.0, 1.0]
        b) [0, 255]

        as it uses the #fefefe format as an intermediary.

2023-10-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-lookup-rgb-components): Correct scaling of an rgb
        component read from rgb.txt.  This is easily shown using "white"
        which should return (65535 65535 65535).

2023-10-14  Richard Hopkins  <xemacs@unbit.co.uk>

        * font.el (font-tty-find-closest-color): Use
        #'find-tty-closest-color instead.  Add optional device arg for use
        by #'find-tty-closest-color.

        * font.el (font-normalize-color): Pass along device to
        #'font-tty-find-closest-color.

2023-08-11  Richard Hopkins  <xemacs@unbit.co.uk>

        * term/xterm.el: Define motion keys (left,right,up,down,home,end)
        with all modifier combinations in `function-key-map'.

2023-08-05  Richard Hopkins  <xemacs@unbit.co.uk>

        * tty-init.el (make-device-late-tty-entry-point): Provide RGB
        values to #'register-tty-color for the basic 16 colors.

2023-08-06  Aidan Kehoe  <kehoea@parhasard.net>

        * events.el (key-press-event-p):
        Make this into a defsubst*, for the sake of
        #'handle-pre-motion-command.
        * simple.el (motion-keys-for-shifted-motion):
        Update the default value (and the suggested values) of this to put
        the keys in their canonical form, so #'canonicalize-keysym has no
        need to cons.
        * simple.el (current-command-is-motion): New. The following, moved
        to being a label with a shorter name.
        * simple.el (current-command-is-motion): New. The following, moved
        to being a label with a shorter name.
        * simple.el (handle-pre-motion-command-current-command-is-motion):
        Removed.
        * simple.el (command-event-is-shifted): New label, for the use of
        #'handle-pre-motion-command, #'handle-post-motion-command;
        reworked to avoid consing for both these very commonly called
        functions.
        * simple.el (handle-pre-motion-command): Rework this to delay
        calling #'current-command-is-motion as late as possible, and to
        use #'command-event-is-shifted.
        * simple.el (handle-post-motion-command):
        Ditto.

2023-08-05  Aidan Kehoe  <kehoea@parhasard.net>

        * simple.el (motion-keys-for-shifted-motion):
        Adjust the docstring of this for readability, adjusts its
        suggested custom values to include the defaults.
        * simple.el (handle-pre-motion-command-current-command-is-motion):
        Examine last-command-event, not last-input-event, in this
        function, avoiding issues with function-key-map and TTY consoles
        which make end, home, etc available via it.
        * simple.el (handle-pre-motion-command):
        * simple.el (handle-post-motion-command):
        Examine this-command-keys-shift-translated in these functions,
        newly made available in event-stream.c

2023-07-22  Richard Hopkins  <xemacs@unbit.co.uk>

        * tty-init.el (make-device-early-tty-entry-point): Move color
        registration to #'make-device-late-tty-entry-point as it needs to
        know which device it's for.
        * tty-init.el (make-device-late-tty-entry-point): New.

ChangeLog Entries from lwlib/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-09  Aidan Kehoe  <kehoea@parhasard.net>

        * xlwtabs.c (DrawTab):
        Remove colorDBG here, use colorBG instead, avoid a
        set-but-not-used warning with GCC-15.

2024-08-22  Aidan Kehoe  <kehoea@parhasard.net>

        * lwlib.h (MINL): Move this #define here.
        * lwlib-colors.c: Remove duplicate #define of MINL.
        * lwlib-fonts.h: Remove duplicate #define of MINL.
        * lwlib.h: Remove duplicate #define of MINL.
        * xlwscrollbar.c (VERT): Remove duplicate #define of MINL.

2024-08-18  Aidan Kehoe  <kehoea@parhasard.net>

        * lwlib-fonts.c:
        * lwlib-fonts.c (xft_open_font_by_name):
        * lwlib-fonts.c (x_xft_text_width): Move to this file.
        * lwlib-fonts.h:
        Declare NAME for this xft_open_font_by_name as const char *, a
        better practice anyway and placates the C++ build.
        Declare x_xft_text_width here.
        * xlwmenu.c (x_xft_text_width): Remove from this file.
        * xlwtabs.c (x_xft_text_width): Remove from this file.

2024-04-29  Aidan Kehoe  <kehoea@parhasard.net>

        Use the newer _CONST_X_STRING X11 #define instead of the
        xt-wrappers.h approach to suppressing warnings with string
        constants used for X11 String types. Update various declarations
        to String rather than char * to work better with this.

        Remove the Xt_RESOURCE macro, which basically hid casts to
        String.  Remove the Xt_SET_ARG macro for the same reason,

        Keep the Xt_SET_VALUE, Xt_GET_VALUE convenience macros, they
        remain of use. Put them in lwlib-internal.h.

        Use BEGIN_C_DECLS/END_C_DECLS in lwlib-colors.h, xlwmenu.h,
        xlwmenuP.h,  for a cleaner C++
        build.

        Remove xt-wrappers.h.

        * lwlib-Xm.c: Motif does not respect _CONST_X_STRING, its headers
        explicitly use char * despite that the man pages use String. Mark
        casts used to work around this with MOTIF_STRING() so they can be
        more easily corrected in the future if that becomes possible.

        * lwlib-Xaw.c (xaw_update_scrollbar):
        * lwlib-Xaw.c (xaw_update_one_widget):
        * lwlib-Xaw.c (make_dialog):
        * lwlib-Xaw.c (xaw_generic_callback):
        * lwlib-Xaw.c (xaw_create_scrollbar):
        * lwlib-Xaw.c (xaw_create_button):
        * lwlib-Xaw.c (xaw_create_label):
        * lwlib-Xaw.c (xaw_create_progress):
        * lwlib-Xaw.c (xaw_create_text_field):
        * lwlib-Xlw.c (xlw_create_menubar):
        * lwlib-Xlw.c (xlw_create_popup_menu):
        * lwlib-Xlw.c (xlw_create_scrollbar):
        * lwlib-Xlw.c (xlw_update_scrollbar):
        * lwlib-Xlw.c (xlw_tab_control_callback):
        * lwlib-Xlw.c (xlw_create_tab_control):
        * lwlib-Xlw.c (build_tabs_in_widget):
        * lwlib-Xlw.c (xlw_create_clip_window):
        * lwlib-Xm.c:
        * lwlib-Xm.c (safe_strdup):
        * lwlib-Xm.c (xm_update_label):
        * lwlib-Xm.c (xm_update_progress):
        * lwlib-Xm.c (xm_update_toggle):
        * lwlib-Xm.c (xm_update_radiobox):
        * lwlib-Xm.c (make_menu_in_widget):
        * lwlib-Xm.c (update_one_menu_entry):
        * lwlib-Xm.c (xm_update_text):
        * lwlib-Xm.c (xm_update_text_field):
        * lwlib-Xm.c (xm_update_scrollbar):
        * lwlib-Xm.c (xm_update_one_widget):
        * lwlib-Xm.c (make_dialog):
        * lwlib-Xm.c (recenter_widget):
        * lwlib-Xm.c (recycle_instance):
        * lwlib-Xm.c (make_menubar):
        * lwlib-Xm.c (make_scrollbar):
        * lwlib-Xm.c (xm_create_button):
        * lwlib-Xm.c (xm_create_progress):
        * lwlib-Xm.c (xm_create_text_field):
        * lwlib-Xm.c (xm_create_label):
        * lwlib-Xm.c (xm_create_combo_box):
        * lwlib-Xm.c (xm_popup_menu):
        * lwlib-Xm.c (set_min_dialog_size):
        * lwlib-colors.h:
        * lwlib-internal.h:
        * lwlib.c:
        * lwlib.c (Widget lw_menubar_widget): No need to initialize to
        NULL, done automatically.
        * lwlib.c (lw_get_widget_value_for_widget):
        * lwlib.c (lw_internal_update_other_instances):
        * lwlib.h:
        * xlwcheckbox.c:
        * xlwcheckbox.c (res):
        * xlwgauge.c:
        * xlwgauge.c (res):
        * xlwgauge.c (GaugeDestroy):
        * xlwgauge.c (GaugeExpose):
        * xlwgauge.c (GaugeSelect):
        * xlwgauge.c (GaugeLoseSel):
        * xlwgauge.c (MaxLabel):
        * xlwmenu.c:
        * xlwmenu.c (_CONST_X_STRING):
        * xlwmenu.c (xlwMenuResources):
        * xlwmenu.c (string_width):
        * xlwmenu.c (string_width_u):
        * xlwmenu.c (resource_widget_value):
        * xlwmenu.c (string_draw_range):
        * xlwmenu.c (string_draw_u):
        * xlwmenu.h:
        * xlwmenuP.h:
        * xlwmenuP.h (MERCHANTABILITY):
        * xlwradio.c:
        * xlwscrollbar.c:
        * xlwscrollbar.c (res):
        * xlwscrollbar.c (resources):
        * xlwtabs.c (res):
        * xlwtabs.c (resources):
        * xlwtabs.c (TabsSetValues):
        * xlwtabs.c (TabsChangeManaged):
        * xlwtabs.c (XawTabsSetTop):
        * xt-wrappers.h: File removed.

ChangeLog Entries from man/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-05  Alan Mackenzie  <acm@muc.de>

        * lispref/packaging.texi (Makefile):
        Document the removal of the PACKAGE_SUPPRESS target from XEmacs's
        Makefile mechanism.

2025-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.texi (Distribution with XEmacs):
        Document that support for building modules into temacs has been
        removed.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Writing New Modules):
        Update to reflect reduced restrictions on C code now unexec is
        gone. Remove mention of sheap.c in passing.

        * emodules.texi: Revise and update this given recent changes to
        emodules.c.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/lists.texi (Association Lists):
        Update documentation of #'assoc here, now it has an optional TEST
        argument.

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs/custom.texi (File Variables):
        Document coding: here as another of the special variables in a
        local variables list.

2025-05-07  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/searching.texi (Syntax of Regexps):
        Document \_<, \_> here, text from GNU. Flesh out the documentation
        for \<, \> in passing.

2025-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Obarrays):
        @end a defun clause here for #'intern, fix the build.

2025-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Basic Lisp Modules):
        * internals/internals.texi (Modules for Other Aspects of the Lisp
        Interpreter and Object System):
        * internals/internals.texi (The XEmacs Object System (Abstractly
        Speaking)):
        * internals/internals.texi (Symbol):
        * internals/internals.texi (Obarrays):
        * internals/internals.texi (Symbol Values):
        * lispref/symbols.texi (Symbol Components):
        * lispref/symbols.texi (Creating Symbols):
        Update both these files to reflect current reality, where OBARRAY
        is a Lisp hash table and not a traditional Emacs obarray. Document
        that Common Lisp packages should be implemented for XEmacs.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Symbol Values):
        Mention that GNU Emacs still implements Qunbound as a symbol in
        documentation of that.

2025-04-19  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Top):
        Remove entry for the Remaining issues:: node, obsolete.
        * internals/internals.texi (Adding Global Lisp Variables):
        Update the documentation of the symbol-value-forward object.
        * internals/internals.texi (GCPROing):
        Ditto. No longer state that an implicit staticpro() happens with
        DEFVAR_FOO().
        * internals/internals.texi (General internal changes):
        Remove mention of the annotation of staticpro names.
        * internals/internals.texi (Dumping):
        Document the shuffling of heap addresses to STATICPROS_NODUMP.
        * internals/internals.texi (Object inventory): Remove mention of
        implicit handling of STATICPROS, since that is now done
        explicitly.
        * internals/internals.texi (Pointers dumping):
        Mention that we use C23's #embed directive if available for
        DUMP_IN_EXEC.
        * internals/internals.texi (Remaining issues): Removed, all these
        are obsolete (none of the commmon platforms will tolerate
        relocation as suggested; we have the executable signature already
        implemented; and there is no need for DOC to end up in the dump
        file).

2024-12-22  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Reloading phase):
        Give information on INCBIN and the current approach to
        DUMP_IN_EXEC.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Authorship of XEmacs):
        Correct some typos in this.
        * internals/internals.texi (Reloading phase):
        Update documentation of reloading to reflect things as they are
        now.

2025-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Symbol Values):
        Update documentation of Qunbound, now it is of type opaque rather
        than symbol-value-magic.

2024-11-03  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Object inventory):
        Update and correct some documentation of pdump here.

2024-08-26  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/searching.texi (Syntax of Regexps):
        Clarify some syntax related to regexp character sets, groups,
        zero-length shy groups.

2024-02-18  Richard Hopkins  <xemacs@unbit.co.uk>

        * beta.texi (Building XEmacs from a full distribution): Add @item
        for each command.  This resolves

        warning: @enumerate has text but no @item

2024-02-17  Richard Hopkins  <xemacs@unbit.co.uk>

        * internals/internals.texi (OpenSSL bignum driver): Use @pxref
        instead of @xref for 'BSD MP driver' as it's inside parentheses
        and also resolves older Texinfo outputting...

        warning: `.' or `,' must follow @xref, not `)'.

ChangeLog Entries from modules/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-09  Aidan Kehoe  <kehoea@parhasard.net>

        * canna/canna_api.c:
        * canna/canna_api.c (Fcanna_initialize):
        Silence a warning regarding passing const strings to
        jrKanjiControl() by using a file-static APPNAME variable.

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        * postgresql/postgresql.c:
        * postgresql/postgresql.c (PG_OS_CODING):
        * postgresql/postgresql.c (allocate_pgconn):
        * postgresql/postgresql.c (allocate_pgresult):
        * postgresql/postgresql.c (finalize_pgresult):
        * postgresql/postgresql.c (Fpq_client_encoding):
        * postgresql/postgresql.c (syms_of_postgresql):
        * postgresql/postgresql.c (vars_of_postgresql):
        * postgresql/postgresql.c (init_postgresql_from_environment):
        Remove compatibility code that attempted to work with XEmacs 21.1,
        21.4.
        Move DEFINE_NODUMP_LISP_OBJECT() to syms_of_postgresql(). Remove
        #ifdef MULE.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * postgresql/postgresql.h:
        * ldap/eldap.h:
        Declare Lisp_LDAP, Lisp_PGconn, Lisp_PGresult using
        DECLARE_MODULE_LISP_OBJECT().

2025-03-15  Aidan Kehoe  <kehoea@parhasard.net>

        * ldap/eldap.c:
        * ldap/eldap.c (syms_of_eldap):
        Move the DEFINE_NODUMP_LISP_OBJECT call to syms_of_eldap().
        * ldap/eldap.c (unload_eldap):
        Call UNDEF_MOMDULE_LISP_OBJECT() rather than UNDEF_LISP_OBJECT()
        here, now the latter has been removed.
        * postgresql/postgresql.c (unload_postgresql):
        Ditto.

2025-01-23  Aidan Kehoe  <kehoea@parhasard.net>

        * canna/canna_api.c:
        Update types of those C variables referenced by DEFVAR_BOOL() to
        Boolint, as was just done in ../src/.

ChangeLog Entries from nt/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-07  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak:
        Add sysdll.obj to TEMACS_COMMON_OBJS, unbreaking the Windows build
        (though, sigh, not actually adding support for modules on Windows,
        which has yet to be done.)

2025-05-27  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (LIB_SRC_TOOLS):
        Remove sorted-doc.exe from here, Other obsoleted targets not
        needed.

o2025-03-04  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (PROGRAM_DEFINES): Add EMACS_DUMP_FILE_NAME to these,
        just added to configure.ac.

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        Remove --without-mule as an option given maturity of the Mule
        code and limited development resources to devote to non-Mule bugs
        and features.

        * config.inc.samp:
        * config.inc.samp (MULE): Removed, can no longer be set to zero.
        * xemacs.mak:
        * xemacs.mak (MULE): Remove conditional code dealing with this.
        * xemacs.mak (OPT_DEFINES): Remove -DMULE.
        * xemacs.mak (OPT_OBJS): Move the Mule object files to
        TEMACS_COMMON_OBJS. 
        * xemacs.mak (TEMACS_COMMON_OBJS):

2025-02-01  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak:
        Remove optimization flags specifying that the target is Pentium,
        no longer supported by Visual Studio.

2025-02-01  Aidan Kehoe  <kehoea@parhasard.net>

        Supply reasonable defaults for Perl, Mercurial and makeinfo for
        the native Windows build.
        * config.inc.samp:
        * config.inc.samp (CYGWIN_ROOT): New. Root of Cygwin on this
        machine, used to find perl, python.
        * config.inc.samp (PERL): New. Default place to find a Perl
        install.
        * config.inc.samp (PYTHON): New. Default place to find a Python
        executable. 
        * config.inc.samp (HG): New. How to get a Mercural command.
        * config.inc.samp (MAKEINFO): Set this to a value that currently
        works, now makeinfo(1) is a Perl script on Cygwin.
        * xemacs.mak:
        * xemacs.mak (depend): Use $(PERL).
        * xemacs.mak (unicode-encapsulate): Use $(PERL).
        * xemacs.mak (makeinfo-test): Correct syntax for this.

2025-02-01  Aidan Kehoe  <kehoea@parhasard.net>

        * config.inc.samp (MULE):
        Turn this on by default.

2025-01-27  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.dsp: Remove mention of ntheap.c, ntheap.h from this file,
        no longer needed in absence of unexec.
        * xemacs.mak:
        * xemacs.mak (USE_SYSTEM_MALLOC): Removed. Always on, #define
        removed.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.dsp: Remove mention of lastfile.c from this file.
        * xemacs.mak:
        * xemacs.mak (LASTFILE): Removed.
        * xemacs.mak (LASTFILE_SRC): Removed.
        * xemacs.mak (LASTFILE_FLAGS): Removed.
        * xemacs.mak (LASTFILE_OBJS): Removed.
        * xemacs.mak (TEMACS_LIBS):
        * xemacs.mak ($(RAW_EXE)):
        Remove mention of lastfile.c from this file, not needed with
        PDUMP.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * config.inc.samp:
        * config.inc.samp (USE_PORTABLE_DUMPER):
        * config.inc.samp (USE_KKCC):
        * config.inc.samp (NEW_GC):
        Remove mention of these options. The first two are the default and
        cannot be turned off, the last has been removed.

2024-11-03  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (TEMACS_COMMON_ASLR_LFLAGS): Removed.
        * xemacs.mak (TEMACS_COMMON_LFLAGS):
        Remove the flags to disable ASLR from this, now that pdump
        supports it without problems. Tested on Windows 11 with Visual
        Studio 2022 today.
        Remove also flags dating from Windows 95 days that explicitly
        specify the heap and base (the text segment) addresses, leave that
        to the system. Keep the flag specifying an 8 megabyte stack, we're
        quite heavy on alloca() in Windows terms.

2023-10-20  Aidan Kehoe  <kehoea@parhasard.net>

        Some changes to get the latest beta building with Visual
        Studio from Kurt Geisel <kgeisel@outlook.com>. Thank you Kurt!

        * xemacs.mak:
        Only generate manifest information for the executable if the
        corresponding FILE.manifest has been generated.

        * xemacs.mak (TEMACS_COMMON_ASLR_LFLAGS): New.
        Disable ASLR if the compiler would otherwise enable it.

ChangeLog Entries from src/ChangeLog

goto announcement, summary, changes

2025-06-11  Alan Mackenzie  <acm@muc.de>

        Enhance the handling of syntax-table properties.  This enables C-u
        C-x = (`what-cursor-position') to work on, for example,
        unterminated string delimiters in C Mode.

        * syntax.c (Fchar_syntax): Enhance to handle a cons as argument
        SYNTAX_TABLE, treating this as an internal syntax code.

2025-06-07  Aidan Kehoe  <kehoea@parhasard.net>

        * s/windowsnt.h (HAVE_SHLIB):
        Windows supports dynamic loading of shared libraries, always
        #define this.

2025-06-09  Aidan Kehoe  <kehoea@parhasard.net>

        * array.h (Stynarr_verify_pos):
        Work around buggy warnings with the GCC-15 optimizer in this
        function. See comment.

        * backtrace.h (PUSH_BACKTRACE):
        Silence a dangling pointer warning with GCC-15 in this macro. The
        entire point of the macro is storing a stack address in a global
        variable, there is no other way to address this.

        * compiler.h (PRAGMA_PUSH_DIAGNOSTICS): New.
        * compiler.h (PRAGMA_POP_DIAGNOSTICS): New.
        * compiler.h (PRAGMA_IGNORE_DANGLING_POINTER): New.
        * compiler.h (PRAGMA_IGNORE_DEPRECATED): New.
        Provide these macros on GCC and clang, expanding to DO_NOTHING on
        other compilers.

        * emacs.c (main_1): Correct a spelling here in passing.

        * event-Xt.c (x_reset_modifier_mapping):
        Use PRAGMA_IGNORE_DEPRECATED when calling XKeycodeToKeysym(),
        motivation already documented.

        * fontcolor-xlike-inc.c (XFUN (font_spec_matches_charset)):
        Remove some unused variables, quiet a GCC-15 compiler warning.
        
        * lisp.h:
        * lisp.h (XGCPRO1, XGCPRO2, XGCPRO3, XGCPRO4, XGCPRO4):
        Implement all these in terms of XGCPRON_ARRAY(), which is simpler.

        * lisp.h (XGCPRO1_ARRAY): Implement this as a do {} while (0)
        block rather than a statement with repeated commas, since the
        latter does not work with PRAGMA_{PUSH,POP}_DIAGNOSTICS() and
        PRAGMA_IGNORE_DANGLING_POINTER() on GCC.
        Use those pragmas, the entire point of these macros is storing a
        stack address in a global variable, there is no other way to
        address this.
        * lisp.h (XGCPRO2_ARRAY): Ditto.
        * lisp.h (XGCPRO3_ARRAY): Ditto.
        * lisp.h (XGCPRO4_ARRAY): New, ditto.
        * lisp.h (XGCPRO5_ARRAY): New, ditto.

        * lread.c (locate_file_map_suffixes):
        Use emacs_snprintf() within this function for the sake of its
        bounds checking and avoiding GCC-15 warnings about strncpy(), 
        * realpath.c (qxe_realpath):
        Use memcpy() rather than strncpy here. No need for a memset(),
        since the existing code does not handle strncpy() inserting
        nulls.
        * regex.c (EXTEND_BUFFER):
        Avoid use after free warnings regarding OLD_BUFFER here (which are
        only likely to be an issue with a developer-hostile and
        standards-obsessed optimizing compiler, since it is not
        dereferenced), make it a size_t, and calculate a delta once when
        adjusting BUF_END, BEGALT, FIXUP_ALT_JUMP, LASTSTART, PENDING_EXACT.

        * search.c (looking_at_1):
        Pass the buffer's syntax cache explicitly to re_match_2() here,
        which setup_syntax_cache() within regex.c was going to pass back
        anyway.
        * search.c (search_buffer):
        Ditto.
        * syntax.c (setup_syntax_cache):
        Never accept NULL as a CACHE argument, it must either be OBJECT's
        syntax cache when OBJECT is a buffer, or valid pointer
        otherwise.  Add an assertion regarding the former.
        * syntax.c (setup_buffer_syntax_cache):
        Pass BUFFER->SYNTAX_CACHE to setup_syntax_cache() rather than
        NULL, quiet a GCC-15 warning.
        * text.c (new_dfc_convert_malloc): Initialize DST to NULL, quiet a
        GCC-15 warning.

2025-06-05  Alan Mackenzie  <acm@muc.de>

        Purge the PACKAGE_SUPPRESS mechanism from XEmacs.

        * lread.c (Vload_suppress_alist): Removed.
        * lread.c (check_if_suppressed): Removed.
        * lread.c: (locate_file_in_directory_mapper): No longer call
        check_if_suppressed.

2025-06-04  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c (static detection_state_description_stynarr
        detection_state_description): Remove the static initialization of
        this, which was buggy, let C put it in BSS as all zeroes.
        * file-coding.c (coding_system_type_create):
        Call Stynarr_init on detection_state_description, avoiding this
        bug. Add the XD_END entry here.

2025-06-03  Alan Mackenzie  <acm@muc.de>

        * regex.c (re_match_2_internal): Correct the updating of the
        syntax cache so that it is current for the characters actually
        being read and compared.  Done in case wordbound:, case wordend:,
        case symend:.

2025-06-03  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c (initialize_detector_description):
        Correct an offset in the created description, make the generated
        description identical to that previous to 466eb98833cc .
        I am not managing to create a test case for this, frustratingly.

2025-06-02  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c (look_for_coding_cookie_last_page):
        This function appears to cause intermittent crashes (with
        corruption of the stack) on GCC-15 with
        optimization. #ifdef 0 it for the moment.
        * file-coding.c (Ffind_coding_system_magic_cookie_in_file):
        #ifdef 0 a call to it here.
        * file-coding.c (determine_real_coding_system):
        Ditto.  

2025-06-01  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in: Suppress the touch(1) calls in the make output
        when XEmacs is built.

2025-06-01  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (main_1):
        Remove call to reinit_coding_system_type_create_mule_coding(), no
        longer needed.
        * file-coding.c (coding_detector_description_lines_count):
        Removed, no longer needed.

        * file-coding.c (static detection_state_description_stynarr
                         detection_state_description): New.
        * file-coding.c (static const struct sized_memory_description
                         detection_state_description_elt_description): New.
        * file-coding.c (static const struct sized_memory_description
                         memory_description_dynarr_description): New.
        * file-coding.c (initialize_detector_description): New, now a C
        function rather than a macro in file-coding.h, with (currently
        theoretical) handling for detectors from modules.

        * file-coding.c (detection_state_description): This is now a
        Stynarr that is dumped and doesn't need any post pdump_load()
        initialization.
        * file-coding.c (syms_of_file_coding):
        Use detection_state_description.els_static for the memory
        description of struct detection_state.
        * file-coding.c (coding_system_type_create):
        Dump detection_state_description using its new memory
        description.

        * file-coding.h (DETECTOR_DESCRIPTION_OFFSET): Removed, now
        incorporated into initialize_detector_description().
        * file-coding.h: Remove declarations for
        coding_detector_description_lines_count,
        detection_state_description, no longer needed.
        * file-coding.h (INITIALIZE_DETECTOR_WITH_DESCRIPTION):
        Call initialize_detector_description() here rather than using a
        macro.
        * mule-coding.c (reinit_coding_system_type_create_mule_coding):
        Removed, no longer needed.
        * symsinit.h:
        Remove its declaration.

2025-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        Remove support for static linking of postgresql, canna and ldap
        into the XEmacs binary if !HAVE_SHLIB, since that is very rare
        these days, the relevant code is not regularly tested, and it
        complicates development of the code generally.

        * Makefile.in.in:
        * Makefile.in.in (ldap_objs): Removed.
        * Makefile.in.in (mule_canna_objs): Removed.
        * Makefile.in.in (postgresql_objs): Removed.
        * Makefile.in.in (shlib_objs): Add emodules.o to this for
        consistency, avoid linking it into temacs if !HAVE_SHLIB.
        * Makefile.in.in (objs): Update this to no longer reference
        $ldap_objs and friends.
        * emacs.c (main_1):
        No longer call syms_of_canna_api(), syms_of_eldap(),
        syms_of_postgresql(), vars_of_canna_api(), vars_of_eldap(),
        vars_of_postgresql(), init_postgresql_from_environment().
        * emodules.c:
        Remove an #ifdef HAVE_SHLIB ... #endif from this file, now
        addressed in Makefile.in.in.
        * emodules.c (make_module):
        Change the name of an argument that shadows a global in this in
        passing, suppress a compiler warning.
        * inline.c:
        Remove code that checked whether ldap, postgresql were being
        linked into temacs, no longer supported.
        * lrecord.h (enum lrecord_type):
        Ditto.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        Fix crashes after unloading modules, by keeping note of those
        subrs and DEFVAR_() created by each module in a weak list, and
        setting what had been pointers into the data segment of the
        unloaded module to values that will not crash XEmacs after
        unload.
        To this end, struct Lisp_Module becomes a full, new Lisp_Object;
        the list of loaded modules becomes just a Lisp list.
        Revise emodules_load() to use emacs_snprintf() rather than the
        prone-to-buffer-overruns strcpy(), strcat().

        * .gdbinit.in.in (lrecord_type_module): Add an entry for this.
        * alloc.c:
        * alloc.c (define_lisp_object):
        Change the LOADHIST_ATTACH() here to store the lrecord_type as an
        integer, avoiding (theoretical) issues with duplicate names.

        * emodules.c:
        * emodules.c (struct Lisp_Module):
        * emodules.c (make_module):
        * emodules.c (find_module):
        * emodules.c (add_module_loadhist_elt): New.
        * emodules.c (static Fixnum deadbeef_constant): New.
        * emodules.c (static Boolint deadbeef_boolint): New.
        * emodules.c (attempt_module_delete):
        * emodules.c (module_load_unwind):
        * emodules.c (emodules_load):
        * emodules.c (emodules_doc):
        * emodules.c (Fload_module):
        * emodules.c (Funload_module):
        * emodules.c (Flist_modules):
        * emodules.c (syms_of_module):
        * emodules.c (vars_of_module):
        Extensive changes as above. Reformat comments to fit with the rest
        of the C code.

        * lisp.h:
        Make Qfile_system_ignore_case_p available here, now it is used in
        emodules.c.
        Remove unloading_module, no longer used.
        Declare emodules_depth, add_module_loadhist_elt() here, now used
        in LOADHIST_ATTACH().
        * lisp.h (LOADHIST_ATTACH):
        Call add_module_loadhist_elt() if currently loading a module.
        * lrecord.h (enum lrecord_type):
        Add an entry for lrecord_type_module.
        * symbols.c (symbol_is_constant):
        Change the return type of this to be Boolint.
        * symbols.c (reject_constant_symbols):
        Revise this to avoid rejection of non-dumped SYMBOL_VALUE_MAGIC
        objects, a simpler way of allowing making variables from modules
        unbound while rejecting dumped SYMBOL_VALUE_MAGIC objects.
        * symbols.c (Fset):
        Delegate freeing the lcrecords to emodules.c.
        * symbols.c (defsymbol_massage_name_1):
        Do a LOADHIST_ATTACH if calling this function after dumping, which
        indicates we are being called from a module.
        * symbols.c (defsymbol_nodump):
        Ditto.
        * symbols.c (defsymbol):
        No longer call make_string_nocopy() here, that added no value.
        * symbols.c (defsubr_1):
        * symbols.c (defsubr):
        Move LOADHIST_ATTACH to this and to the following from
        defsubr_1().
        * symbols.c (defsubr_macro):

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.c (Qmodule_string_coding_system): New variable, a
        coding system reflecting the encoding of symbol names and
        docstrings in the module currently being loaded.
        * emodules.c (module_load_unwind_coding): unwind-protect function
        to reset this on failure of loading the current module.
        * emodules.c (emodules_load):
        Check for emodule_coding as a symbol, error and fail on loading a
        module if this is not encountered.
        Set up the unwind-protect.
        Define a coding system alias reflecting the encountered
        emodule_coding.
        * emodules.c (emodules_doc):
        * emodules.c (emodules_doc_subr):
        * emodules.c (emodules_doc_sym):
        No longer taken an explicit CODING_SYSTEM_NAME argument in these
        functions.
        * emodules.c (syms_of_module):
        Do a DEFSYMBOL() for Qmodule_string_coding_system.
        * emodules.h:
        Update declaration of emodules_doc_subr(), emodules_doc_sym().
        * lisp.h:
        Make Qmodule_string_coding_system available here.
        * symbols.c (defsubr_1):
        Use it.
        * symbols.c (defvar_magic):
        Use it.
        * text.h:
        Remove the old Qemodule_string_encoding here.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * symeval.h (XSYMBOL_VALUE_FORWARD_OBJECT_MAGICFUN):
        Correct a typo in this macro.

2025-05-25  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c (hash_table_test_validate):
        * elhash.c (decode_hash_table_test):
        * elhash.c (Fdefine_hash_table_test):
        * elhash.c (Fvalid_hash_table_test_p):
        * elhash.c (vars_of_elhash):
        Use assq_no_quit() here when dealing with elements of
        Vhash_table_test_weak_list in passing, since we know that is a
        valid internal-format list.
        * eval.c (Fmacroexpand):
        Call FassocX here, now Fassoc no longer available.
        * fontcolor-msw.c (font_enum_callback_2):
        Call assoc_no_quit() here, since we know font_enum->list is a
        valid internal-format list.
        * glyphs-gtk.c:
        * glyphs-gtk.c (cursor_name_to_index):
        Call Fassq() here, since we're looking for a symbol. Check the
        type of the result before calling Fcdr(), XFIXNUM().
        * lisp.h:
        Remove declaration for Fassoc() here. Add declaration for FassocX().
        * lread.c (Fload_internal):
        Use the implementation of Fassoc() when examining Vafter_load_alist.
        * select.c (Fselection_owner_p):
        We know Vselection_alist is a valid internal-format list, use
        assq_no_quit() when examining it.
        * sequence.c (Fassoc): Move to subr.el.
        * sequence.c (syms_of_sequence): Remove its DEFSUBR().

2025-05-24  Alan Mackenzie  <acm@muc.de>

        Make "\\_<" and "\\_>" work in regexp buffer searches.

        * search.c (trivial_regexp_p):
        Recognize "\\_" as a non-trivial sequence, so that C-M-s won't
        move to the next literal "_" with it.

2025-05-24  Aidan Kehoe  <kehoea@parhasard.net>

        * callint.c (Finteractive):
        Document the result of byte-compiling a list form here, too,
        already done in the docstring for
        #'compiled-function-interactive.

2025-05-19  Alan Mackenzie  <acm@muc.de>

        Prevent scan_sexps_forward interpreting very large argument as -1.

        * src/syntax.c (scan_sexps_forward):
        Change the type of parameter TARGETDEPTH from int to EMACS_INT
        so that the default argument from Fparse_partial_sexp,
        MOST_NEGATIVE_FIXNUM - 1, won't be wrongly converted to -1.

2025-05-19  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        * Makefile.in.in ($(RAW_EXE)):
        NetBSD dd(1) does not do what Linux and friends do with seek=N
        count=0 where N is greater than the current file size, make sure
        that at least one byte is written, fixing the NetBSD build. Thank
        you Hauke Fath!

2025-05-12  Aidan Kehoe  <kehoea@parhasard.net>

        Sigh, I had known but did not document that making a separate rule
        for dump-data.o in Makefile.in.in failed with -flto, and so my
        last change provokes that failure. Revert the separate rule,
        incorporate it into the rule for temacs, document it this time
        around. 

        * Makefile.in.in (dump-data.o): Removed.
        * Makefile.in.in: Remove its entry in otherobjs.
        * Makefile.in.in ($(RAW_EXE)): Build it without an explicit rule
        when building temacs.

        * Makefile.in.in ($(PROGNAME)): Build dump-data.o without an
        explicit rule when building xemacs.

2025-05-11  Aidan Kehoe  <kehoea@parhasard.net>

        Correct dependency checks --with-dump-in-exec, avoid make(1)
        rebuilding temacs and xemacs all the time for no reason.

        * Makefile.in.in:
        * Makefile.in.in ($(LIB_SRC)/make-dump-id): Make this dependent on
        $(LIB_SRC)/make-dump-id.c so the recursive make is not called all
        the time.
        * Makefile.in.in (dump-data.o): New. Explicit rule for this,
        rather than subsuming it into that for $(RAW_EXE).
        * Makefile.in.in (@DUMP_FILE_NAME@): Explicit rule for this when
        DUMP_IN_EXEC, dependent on $(RAW_EXE), $(BLDSRC)/NEEDTODUMP,
        $(LIB_SRC)/DOC.
        * Makefile.in.in (dump-size): New. Explicit rule for this, with a
        dependency on @DUMP_FILE_NAME@.
        * Makefile.in.in (dump-size-correct): New. Rule that succeeds if
        the size of the dump file known at the time temacs was built is
        the same as the current dump file.
        * Makefile.in.in ($(PROGNAME)): New. Dependent on
        dump-size-correct, rebuilds dump-data.o and links the object files
        in the same way as for temacs, then mungs modification times with
        touch(1) to avoid needless rebuilding.
        * Makefile.in.in (mostlyclean):
        Add temacs-dump-size, dump-size-correct to the files removed here.
        * emacs.c:
        * emacs.c (Femacs_run_status):
        New entry to the plist returned, Qdump_in_exec, allowing
        update-elc.el to work out which file to check for dependency
        correctly.
        * emacs.c (syms_of_emacs):
        Call DEFSYMBOL() on Qdump_in_exec.
        * s/win32-native.h (DUMP_IN_EXEC):
        Document that we always dump into the exec file on windows native,
        for the sake of Femacs_run_status().

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c:
        * file-coding.c (LENGTH):
        Cast the result of this macro to Bytecount, which works better
        with new uses in this file and is reasonable in the general
        sense.
        * file-coding.c (look_for_coding_cookie_first_page): New, more
        accurate, name for look_for_coding_system_magic_cookie().
        * file-coding.c (look_for_coding_cookie_last_page): New. Examine
        any Local Variables: blocks at the end of the file for a coding
        cookie.
        * file-coding.c (Ffind_coding_system_magic_cookie_in_file):
        Revise docstring extensively.
        Revise to use look_for_coding_cookie_last_page() in addition to
        examining the beginning of a file for a coding cookie.
        * file-coding.c (determine_real_coding_system):
        Use look_for_coding_cookie_last_page here.
        * file-coding.c (undecided_decode):
        Use look_for_coding_cookie_first_page()'s new name here. Don't
        call look_for_coding_cookie_last_page(), this is not a seekable
        stream.

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        Clean-ups of file-coding.c and fileio.c in anticipation of
        supporting coding cookies on the last page.
        1. Make Vdebug_coding_detection into a Boolint called
        debug_coding_detection, and declare the related Lisp-visible
        variable with DEFVAR_BOOL.
        2. Add debug_out_no_conversion, which uses
        write_external_fmt_string_va() with Qno_conversion to deal with
        non-internal format text.
        3. Remove QScoding_system_cookie, no longer used.
        4. Fix some indentation in coding_system_methods_description_1.
        5. Correct a docstring for the Qconvert_eol_crlf coding system.
        6. Fix a couple of calls to debug_out_lisp() that used the old
        (pre e0c08299251d8ce9 ) convention of supplying NARGS, only used
        when Vdebug_coding_detection was non-nil. 
        * file-coding.c: Change the type, name of
        Vdebug_coding_detection.
        * file-coding.c (debug_out_no_conversion): New function.
        * file-coding.c (DEBUG_DETECTION): New macro.
        * file-coding.c (detect_coding_type): Use it.
        * file-coding.c (Fset_coding_priority_list): Use the new name for
        debug_coding_detection.
        * fileio.c (Fwrite_region_internal): Correct calls to
        debug_out_lisp(). Use the new name for debug_coding_detection.
        * fileio.c (Finsert_file_contents_internal): Ditto.
        * file-coding.h:
        Update declaration of debug_coding_detection.

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        Add a seek_from_end() Lstream method, needed in the bowels of
        coding detection to allow examination of coding cookies on the
        last page.

        * lstream.c:
        Add an entry for the method to the lstream implementation memory
        description.
        * lstream.c (Lstream_seek_from_end): New. Call the seek_from_end()
        method on an Lstream, returning 1 if successful, 0 otherwise.
        * lstream.c (stdio_seek_from_end): New. Implement this method for
        stdio streams.

        * lstream.c (struct filedesc_stream): Change the types of
        STARTING_POS, CURRENT_POS, END_POS to OFF_T in passing. Previous
        type was int, also signed, and they do not escape from outside
        this file, so unlikely to have any effect beyond supporting large
        values for the OFFSET arg to make_filedesc_stream_1().

        * lstream.c (filedesc_seek_from_end): New. Implement this method
        for filedesc streams.
        * lstream.c (vars_of_lstream): Document that the implementations
        have these methods.
        * lstream.h:
        Update comment.
        * lstream.h (lstream_implementation):
        Add a slot for the seek_from_end() method.
        Declare Lstream_seek_from_end().

2025-05-07  Aidan Kehoe  <kehoea@parhasard.net>

        Add support for \_<, \_> to regex.c, anchoring at a symbol begin
        and a symbol end. Thank you Alan Mackenzie.

        * regex.c (Ssymbol): New syntax code for the non-emacs
        compilation. 
        * regex.c (init_syntax_once):
        Initialize re_syntax_table using it in the same way as for Sword.

        * regex.c (enum):
        New values, symbeg, symend.
        * regex.c (print_partial_compiled_pattern):
        Print them.
        * regex.c (optimize_on_failure_jump):
        Basic handling for them in this function; support for them still
        to be added to mutually_exclusive_p().
        * regex.c (regex_compile):
        Interpret \_<, \_> them in the pattern to be compiled.
        * regex.c (re_compile_fastmap):
        Handle them in the same way as wordbeg, wordend here (although
        this is unsatisfactory).
        * regex.c (re_match_2_internal):
        Implement them when matching, logic the same as that of GNU.
        * regex.c (common_op_match_null_string_p):
        Handle them the same as wordbeg, wordend here; they are
        zero-length assertions so they can match the null string.

2025-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        Maintenance on elhash.c.
        1. Calling check_hash_table_invariants() on every XHASH_TABLE()
        with ERROR_CHECK_STRUCTURES defined is unreasonably expensive for
        use of the hash tables from C. Turn this off unless a new
        SLEDGEHAMMER_CHECK_HASH_TABLES constant is defined.
        2. Update the hash_table_equal_function_t typedef to describe a
        function returning a Boolint.
        3. Fix some indentation, remove an enum that is no longer used,
        elhash.h.
        * elhash.c (check_hash_table_invariants):
        Wrap in a new #define.
        * elhash.c (lisp_object_eql_equal): Update type for this.
        * elhash.c (lisp_object_equal_equal): Ditto.
        * elhash.c (lisp_object_equalp_equal): Ditto.
        * elhash.c (lisp_object_general_equal): Ditto.
        * elhash.c (xhash_table): Wrap with
        SLEDGEHAMMER_CHECK_HASH_TABLES. No longer check for gc_in_progress
        which never made any sense. #define XHASH_TABLE to xhash_table if
        SLEDGEHAMMER_CHECK_HASH_TABLES is #defined.
        * elhash.c (Fcopy_hash_table):
        Use CHECK_HASH_TABLE() + XHASH_TABLE() rather than xhash_table()
        here.
        * elhash.c (pdump_reorganize_hash_table):
        Use XHASH_TABLE() rather than xhash_table() here.
        * elhash.c (Fgethash):
        Use CHECK_HASH_TABLE() + XHASH_TABLE() rather than xhash_table()
        here.
        * elhash.c (Fputhash):
        * elhash.c (Fremhash):
        * elhash.c (Fclrhash):
        * elhash.c (Fhash_table_count):
        * elhash.c (Fhash_table_size):
        * elhash.c (Fhash_table_rehash_size):
        * elhash.c (Fhash_table_rehash_threshold):
        * elhash.c (Fhash_table_weakness):
        * elhash.c (Fhash_table_type):
        * elhash.c (Fmaphash):
        * elhash.c (elisp_maphash_unsafe):
        * elhash.c (elisp_maphash):
        * elhash.c (elisp_map_remhash):
        Ditto for all the above functions.
        * elhash.h:
        Minor changes here.
        * gccache-x.c (gc_cache_eql): Update type here. 
        * glyphs.c (instantiator_eq_equal): Update type here.

2025-05-03  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c:
        * elhash.c (HASHCODE): Modify this to compare HTTP against
        Veq_hash_table_test, rather than HT->test, needed for other
        changes today.
        * elhash.c (LINEAR_PROBING_LOOP):
        * elhash.c (KEYS_EQUAL_P): Removed. More appropriate to do the
        constant comparison to Veq_hash_table_test outside of the loops
        this is called from.
        * elhash.c (choose_hash_table_test_for_lookup): New.
        Do the type-based optimization of comparisons that sequence.c has
        done for years now, attempting to use Veq_hash_table_test for
        lookup depending on the type of KEY.
        * elhash.c (find_htentry): Use it.

2025-04-27  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (PARSE_KEYWORDS_EXPAND): New. Just expand to its
        argument, used in working around an MSVC bug in processing
        __VA_ARGS__.
        * lisp.h (PARSE_KEYWORDS_ARGC): Use it, get recent changes working
        under MSVC.

2025-04-28  Aidan Kehoe  <kehoea@parhasard.net>

        * redisplay.c (decode_mode_spec):
        Handle the %t spec properly once more, despite that it is now
        usually irrelevant.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        New macros, SET_C_READONLY(), CLEAR_C_READONLY(), encapsulate
        access to an object's lrecord_header.
        * lrecord.h (SET_C_READONLY): New. Call
        SET_C_READONLY_RECORD_HEADER() on the header of a Lisp_Object.
        * lrecord.h (CLEAR_C_READONLY): New, for symmetry. Call
        CLEAR_C_READONLY_RECORD_HEADER on the header of a Lisp_Object.
        * lrecord.h (SET_LISP_READONLY_RECORD_HEADER) Move this a little
        later for clarity.
        * alloc.c (old_alloc_sized_lcrecord_1):
        Use SET_C_READONLY().
        * alloc.c (make_string_nocopy): Ditto.
        No need for SET_LISP_READONLY(), that is implicit in
        SET_C_READONLY().
        * alloc.c (mark_subrs_readonly):
        Use SET_C_READONLY().
        * opaque.c (init_opaque_once_early):
        Ditto.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * backtrace.h (SPECBIND):
        * backtrace.h (SPECBIND_FAST_UNSAFE):
        * backtrace.h (FSET_FAST_UNSAFE):
        (!SYMBOL_VALUE_MAGIC_P (X) || UNBOUNDP (X)) is now equivalent to
        !SYMBOL_VALUE_MAGIC_P(X), make this change in these macros, missed
        in 71db57be985b.
        * lisp.h (UNBOUNDP): Update documentation of this and Qunbound.
        * opaque.c:
        Remove declaration of Vopaque_ptr_free_list, no longer needed.
        * opaque.c (init_opaque_once_early):

        Set Qunbound as C-readonly, so it is not traced for GC, important
        for the many symbols that are #'fboundp and not #'boundp or
        vice-versa.
        Make the dumper aware of it but do not add it to STATICPROS.
        Both these things were the case pre-71db57be985b.
        Since it is now heap data it does now need a staticpro_nodump(),
        do this.
        * symbols.c:
        Correct comments here.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        Update the documentation regarding the (ongoing) need to GCPRO all
        strings, and the need to re-fetch the string data after every call
        to Lisp.
        
2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * callint.c (Finteractive):
        Update the documentation of the Lisp expression equivalent to the
        ?c code letter in the documentation of this.

2025-04-26  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.def.in.in:
        Update this file to reflect recent changes, get the C-only build
        working on Cygwin (the C++ build still fails regarding symbols in
        terminfo, still working on working around this).

2025-04-22  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump):
        1. GCPRO Vstaticpros_nodump_block_offsets, motivation is the same
        as that for Vstaticpros_hash.
        2. Move the alert giving the undumpable types list after
        STATICPROS has been processed, given the bulk of Lisp_Objects are
        now reached from there.

2025-04-21  Aidan Kehoe  <kehoea@parhasard.net>

        REINITIALIZE_DETECTOR_WITH_DESCRIPTION() needs to be done post
        pdump_load(), restore that.
        * emacs.c (main_1):
        Call reinit_coding_system_type_create_mule_coding() once more.
        * file-coding.c (coding_system_type_create):
        Document that I would like to dump_add_root_block
        (detection_state_description ...).
        * mule-coding.c:
        * mule-coding.c (reinit_coding_system_type_create_mule_coding):
        Restore this.
        * symsinit.h:
        Restore its declaration.

2025-04-20  Aidan Kehoe  <kehoea@parhasard.net>

        * lstream.c (vars_of_lstream):
        Certain C implementations are anal about the restrictions on the
        complexity of initialization of static variables, even when those
        static variables have function scope. Work around that in this
        function, thank you Mats Lidell and the buildbot.

2025-04-20  Aidan Kehoe  <kehoea@parhasard.net>

        My first commit of the support for heap staticpros was buggy, fix
        that.
        * lrecord.h:
        * lrecord.h (enum memory_description_type):
        New entry, XD_BLOCK_OFFSET_PTR, needed to properly support
        staticpro() on the heap. Describes a pointer to an offset into a
        block, which block has been encountered elsewhere and so does not
        need to be dumped.
        * alloc.c (staticpro): Update and correct comments regarding
        staticpro() and heap objects.
        * dumper.c:
        Correct documentation of the process for working out if addresses
        in STATICPROS are in the heap.
        * dumper.c (static int pdump_min_shuffle_depth): New. Depth
        threshold checked at the registration stage to allow decisions to
        be made about whether pointers encountered should be moved from
        STATICPROS to STATICPROS_NODUMP.
        * dumper.c (shuffle_staticpros_if_needed):
        Respect it. Use find_htentry() rather than Fgethash() for reasons
        of speed.
        Take the offset within the current block as an argument, to allow
        the block to be found and to avoid dumping another block.
        * dumper.c (pdump_register_sub):
        Pass the offset of the current Lisp_Object to
        shuffle_staticpros_if_needed(). Handle XD_BLOCK_OFFSET_PTR.
        * dumper.c (pdump_store_new_pointer_offsets):
        Handle XD_BLOCK_OFFSET_PTR here, pull the offset saved from
        Vstaticpros_nodump_block_offsets, find the corresponding block,
        and store the save_offset of the block plus the offset from the
        hash table as *RDATA.
        * dumper.c (pdump_reloc_one):
        Handle XD_BLOCK_OFFSET_PTR in the same way as XD_BLOCK_PTR here.
        * dumper.c (pdump):
        Initialize Vstaticpros_nodump_block_offsets as a hash table.  Set
        pdump_min_shuffle_depth appropriately to limit shuffling from
        STATICPROS to STATICPROS_NODUMP, for root blocks and for
        STATICPRO, STATICPRO_NODUMP.
        * gc.c (lispdesc_one_description_line_size):
        * gc.c (kkcc_marking): 
        Handle XD_BLOCK_OFFSET_PTR in the same way as XD_BLOCK_PTR, not
        that it will come up.

2025-04-19  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the qsort() of STATICPROS of the last commit, it slows down
        the GC slightly, the loss of speed at pdump() time doesn't matter,
        and less code is more maintainable than more code.
        Update some comments related to that.

        Update a comment here.
        * alloc.c (compare_staticpros): Removed, no longer needed.
        * dumper.c:
        * dumper.c (pdump_load_lispdesc_indirect_description):
        Update a comment for this.
        * dumper.c (pdump):
        Remove the qsort(). Update some comments.
        * lrecord.h:
        Correct a comment here in passing.

2025-04-19  Aidan Kehoe  <kehoea@parhasard.net>

        Handle heap addresses known to the dumper when these are passed to
        staticpro().
        Remove several functions and macros that only existed to work
        around the fact that staticpro() couldn't deal with heap
        addresses.

        * alloc.c (static const struct sized_memory_description
        staticpro_description): Moved to dumper.c.
        * alloc.c (static const struct sized_memory_description
        staticpros_description): Moved to dumper.c.
        * alloc.c (staticpro): Update a comment describing this.
        * alloc.c (staticpro_nodump): Update a comment describing this. 
        * alloc.c (common_init_alloc_early): Move initialization of
        staticpros_nodump from here to init_alloc_once_early().
        * alloc.c (init_alloc_once_early):

        * console-gtk.c:
        * console-gtk.c (reinit_console_type_create_gtk): Removed, no
        longer needed. Add a comment to mark end of file.

        * console-impl.h:
        * console-impl.h (INITIALIZE_CONSOLE_TYPE): Use defsymbol() rather
        than defsymbol_nodump() here.
        * console-impl.h (REINITIALIZE_CONSOLE_TYPE): Removed, no longer
        needed.

        * console-msw.c (reinit_console_type_create_mswindows): Removed,
        no longer needed.

        * console-tty.c (reinit_console_type_create_stream): Removed, no
        longer needed.
        * console-x.c (reinit_console_type_create_tty): Ditto.

        * dumper.c: Update copyright.
        * dumper.c (static const struct sized_memory_description
        staticpro_description):
        * dumper.c (static const struct sized_memory_description
        staticpros_description): Move these here from alloc.c.
        * dumper.c (static const struct sized_memory_description
        staticpro_nodump_description): New. 
        * dumper.c (static const struct sized_memory_description
        staticpros_nodump_description): New. Used for dumping
        STATICPROS_NODUMP, which reflects those heap entries in
        STATICPROS.
        Lengthy comments on both.
        * dumper.c (pdump_backtrace):
        Fix a format string in passing.
        * dumper.c (Vstaticpros_hash): New. A Lisp hash table used at dump
        time to check whether the addresses of heap Lisp_Objects are in
        STATICPROS.
        * dumper.c (compare_staticpros): New. Used to sort STATICPROS at
        dump time, which will make partitioning easier.
        * dumper.c (shuffle_staticpros_if_needed): New. If POBJ, the
        address of a Lisp_Object in the heap, is in Vstaticpros_hash, add
        it to STATICPROS_NODUMP, and remove it from STATICPROS,
        Vstaticpros_hash.
        * dumper.c (pdump_register_sub): Use it.
        * dumper.c (save_staticpros): New. Return an alist reflecting the
        address of STATICPROS and STATICPROS_NODUMP, and the existing
        objects pointed to in those arrays,
        * dumper.c (restore_staticpros): New. An unwind_protect that
        restores STATICPROS and STATICPROS_NODUMP following the dumper's
        modification of them.
        * dumper.c (pdump):
        Use them. Sort STATICPROS before registering objects for
        dump. Initialize Vstaticpros_hash to reflect all those addresses
        in STATICPROS.
        Handle STATICPROS and STATICPROS_NODUMP specially, after
        everything else has been registered. Clear Vstaticpros_hash before
        registering them so no shuffling takes place.
        
        * emacs.c (main_1):
        Call reinit_vars_of_lstream(), just re-introducted.
        Remove calls to other reinit_.*_type_create() functions, no longer
        needed.

        * file-coding.c (reinit_coding_system_type_create): Removed, no
        longer needed.
        * file-coding.h:
        * file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE): Call defsymbol(),
        not defsymbol_nodump() on the predicate symbol.
        * file-coding.h (REINITIALIZE_CODING_SYSTEM_TYPE): Removed, no
        longer needed.
        * fontcolor.c (reinit_specifier_type_create_fontcolor): Removed,
        no longer needed.
        * glyphs.c (reinit_specifier_type_create_image): Removed, no
        longer needed.
        * gutter.c (reinit_specifier_type_create_gutter): Removed, no
        longer needed.
        * intl-win32.c (reinit_coding_system_type_create_intl_win32):
        Removed, no longer needed.
        * lstream.c:
        Make Vlstream_free_list into a Lisp_Object allocated in
        vars_of_lstream.
        New Lisp_Object * variable, lstream_free_list, pointing into
        Vlstream_free_list after reinit and pointing into a
        dump-time-specific at dump

        * lstream.c (Lstream_new):
        Use lstream_free_list here rather than Vlstream_free_list. No more
        need to staticpro_nodump().
        * lstream.c (Lstream_delete): Use lstream_free_list_here.
        * lstream.c (vars_of_lstream):
        Create Vdump_time_lstream_free_list here, a static Lisp
        vector. staticpro_nodump() it, make lstream_free_list point into
        it at dump time.
        Initialize Vlstream_free_list here, and staticpro() it.
        * lstream.c (reinit_vars_of_lstream): Restored, all it needs to do
        is set lstream_free_list to the vector data of
        Vlstream_free_list.
        * mule-coding.c (reinit_coding_system_type_create_mule_coding):
        Removed, no longer needed.
        * rangetab.c: Update a comment here in passing (relevant to the
        changes made today).
        * specifier.c (reinit_specifier_type_create): Removed, no longer
        needed.
        * specifier.h (INITIALIZE_SPECIFIER_TYPE): Use defsymbol(), not
        defsymbol_nodump() in this.
        * specifier.h (REINITIALIZE_SPECIFIER_TYPE): Removed, no longer
        needed.
        * symsinit.h: Remove declarations for various functions that have
        been removed.
        * toolbar.c (reinit_specifier_type_create_toolbar): Removed, no
        longer needed.
        * unicode.c (reinit_coding_system_type_create_unicode): Removed,
        no longer needed.

2025-04-14  Aidan Kehoe  <kehoea@parhasard.net>

        Call init_mule_charsets() at dump time after loadup, not after
        restart.
        Also call it from within #'run-emacs-from-temacs.
        Remove init_mule_coding(), which is empty.
        * alloc.c:
        * alloc.c (disksave_object_finalization):
        Update a comment here.
        Call init_mule_charset().
        * emacs.c (main_1):
        Remove calls to init_mule_charset(), init_mule_coding() from here.
        Add a call to init_mule_charset() to Frun_emacs_from_temacs.
        * mule-charset.c (init_mule_charset):
        Update a comment here.
        * mule-coding.c (init_mule_coding): Empty, removed.
        * symsinit.h:
        Remove declaration for init_mule_coding().

2025-04-13  Aidan Kehoe  <kehoea@parhasard.net>

        * inline.c:
        Only #include "../modules/ldap/eldap.h" if !defined (HAVE_SHLIB),
        fixing the C-only build for me. Similarly for the postgresql
        header.
        * lrecord.h:
        * lrecord.h (enum lrecord_type):
        If !defined (HAVE_SHLIB) restore entries for lrecord_type_pgconn,
        lrecord_type_pgresult, lrecord_type_ldap, and make
        DECLARE_MODULE_LISP_OBJECT identical to DECLARE_LISP_OBJECT.

2025-04-13  Aidan Kehoe  <kehoea@parhasard.net>

        Fix further bugs in calls to dump_add_nil_lisp_object(). Assert
        that any addresses pointed to by VARADDRESS are
        non-Qnull_pointer.
        * device.c (vars_of_device):
        Use staticpro_dump_nil on Vdefault_device_plist.
        * dumper.c (dump_add_nil_lisp_object_1):
        Assert that *VARADDRESS is non-Qnull_pointer. Should also be done
        by staticpro(), but that will be a lot more work.
        * editfns.c:
        * editfns.c (vars_of_editfns):
        Call staticpro_dump_nil() on Vsystem_name.
        * emacs.c (vars_of_emacs):
        Initialize Vsystem_type before calling DEFVAR_LISP() on it, avoid
        a crash in early GC.
        * lread.c (vars_of_lread):
        Initialize Vvalues in this function, avoid a crash in early GC.
        * process.c (vars_of_process):
        Initialize Vshell_file_name and Vprocess_environment on the same
        principle.

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        * text.h (extbyte_ascii_p): New inline function.
        * text.h (CHECK_ASCTEXT): New macro.
        * text.h (CHECK_ASCTEXT_LEN): New macro.
        * text.h (ASSERT_ASCTEXT_ASCII_LEN): Use extbyte_ascii_p() within
        this macro.
        * text.c (syms_of_text): New symbol, Qascii_textp;
        * emodules.c (emodules_doc):
        Use CHECK_ASCTEXT() on the supplied coding system name, so we
        error on both debug builds and normal builds rather than crashing
        on debug builds and corrupting internal text on non-debug builds.

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        Fix a bug in dump_add_nil_lisp_object(), I'm uncertain how this
        compiled for me before my last push.
        * dumper.c (dump_add_nil_lisp_object_1): New.
        Previous implementation of dump_add_nil_lisp_object.
        * dumper.c (dump_add_nil_lisp_object): Update this to also call
        dump_add_root_lisp_object() so the object is restored after load.
        * alloc.c:
        * alloc.c (staticpro_dump_nil):
        Use dump_add_nil_lisp_object_1() as is more appropriate for this.       

2025-04-10  Aidan Kehoe  <kehoea@parhasard.net>

        Use staticpro_dump_nil() in much more places, allowing removal of
        27 reinit_vars_of_FILE() functions, simplifying startup.

        In passing rename minibuf_window to Vminibuf_window, pre_gc_cursor
        to Vpre_gc_cursor.

        * buffer.c:
        * buffer.c (Fkill_buffer):
        Use Vminibuf_window's new name here.
        * buffer.c (reinit_vars_of_buffer): Removed.
        Vbuffer_alist is now initialized in vars_of_buffer() and GC
        protected with staticpro_dump_nil(). current_buffer initialized to
        zero by the C implementation.
        * buffer.c (init_vars_of_buffer):
        Initialize and staticpro_dump_nil Vbuffer_alist, Vbuffer_defaults,
        Vbuffer_local_symbols here.
        * buffer.c (common_init_complex_vars_of_buffer):
        Remove staticpro_nodump() for Vbuffer_defaults,
        Vbuffer_local_symbols here.
        * callint.c (Fcall_interactively):
        Use Vminibuf_window's new name here.
        * console-stream.c (init_console_stream):
        Ditto.
        * console.c (reinit_vars_of_console): Removed.
        * console.c (vars_of_console): Vconsole_list, Vselected_console,
        Vconsole_defaults, Vconsole_local_symbols initialized to Qnil and
        GC protected with staticpro_dump_nil() here.
        * console.c (common_init_complex_vars_of_console):
        Rearrange initialization of Vconsole_defaults,
        Vconsole_local_symbols here.
        * device-x.c (reinit_vars_of_device_x): Removed, contents
        delegated to the C implementation.
        * device.c (reinit_vars_of_device): Removed, use
        staticpro_dump_nil on Vdefault device in vars_of_device(),
        asynch_device_change_pending will be initialized to 0 by the C
        implementation.
        * emacs.c (main_1):
        Remove 27 calls to reinit_vars_of_FILE(), simplify startup.
        * emodules.c:
        * emodules.c (reinit_vars_of_module): Removed, contents delegated
        to the C implementation.
        * eval.c (vars_of_eval):
        Use dump_add_nil_lisp_object() on Vdebug_on_error and friends.
        * event-Xt.c (reinit_vars_of_event_Xt): Empty, removed.
        * event-gtk.c (reinit_vars_of_event_gtk): Empty, removed.
        * event-msw.c (reinit_vars_of_event_mswindows): Empty, removed.
        * event-stream.c (Fdispatch_event):
        Use Vminibuf_window's new name.
        * event-tty.c (vars_of_event_tty): Empty, removed.
        * events.c (reinit_vars_of_events): Move initialization of
        Vevent_resource to vars_of_events(), use
        dump_add_nil_lisp_object() on it.
        * file-coding.c (reinit_vars_of_file_coding): Empty, removed.
        * font-lock.c (reinit_vars_of_font_lock): Removed, contents
        delegated to the C implementation.
        * fontcolor.c (reinit_vars_of_fontcolor): Remove staticpro_nodump
        on Vthe_null_color_instance, Vthe_null_font_instance from
        here. Retain other code which cannot be done at dump time.
        * fontcolor.c (vars_of_fontcolor): Use staticpro_dump_nil() on the
        same variables.
        * frame-msw.c (reinit_vars_of_frame_mswindows): Removed.
        * frame-msw.c (vars_of_frame_mswindows):
        Use dump_add_nil_lisp_Object() on Vmswindows_frame_being_created.
        * frame.c (Factive_minibuffer_window):
        Use Vminibuf_window's new name here.
        * frame.c (delete_frame_internal): Ditto.
        * frame.c (Fmake_frame_invisible): Ditto.
        * frame.c (Ficonify_frame): Ditto.
        * gc.c:
        Use Vpre_gc_cursor's new name here.
        * gc.c (show_gc_cursor_and_message): Ditto.
        * gc.c (remove_gc_cursor_and_message): Ditto.
        * gc.c (vars_of_gc): Call staticpro_dump_nil() on Vpre_gc_cursor.
        * glyphs-widget.c (reinit_vars_of_glyphs_widget): Remove, delegate
        its contents to the C implementation.
        * glyphs.c (reinit_vars_of_glyphs): Ditto.
        * gui-x.c:
        * gui-x.c (static LWLIB_ID lwlib_id_tick): Static initialization
        to #x10000.
        * gui-x.c (reinit_vars_of_gui_x): Remove, delegate to the C
        implementation.
        * insdel.c (reinit_vars_of_insdel): Remove, delegate to the C
        implementation.
        * lread.c (init_lread): Remove re-initialization of Vvalues,
        Vload_descriptor_list, Vload_force_doc_string_list,
        Vload_file_name_internal, Vload_file_name from here.
        * lread.c (reinit_vars_of_lread): Removed, use staticpro_dump_nil
        on Vread_buffer_stream in vars_of_lread() instead.
        * lread.c (vars_of_lread):
        Use dump_add_nil_lisp_object(), staticpro_dump_nil() appropriately
        here.
        * menubar-gtk.c (reinit_vars_of_menubar_gtk): Empty, removed.
        * menubar-x.c:
        * menubar-x.c (static LWLIB_ID
        last_popup_menu_selection_callback_id): Initialize statically. 
        * menubar-x.c (reinit_vars_of_menubar_x): Removed, delegate to the
        C implementation. 
        * minibuf.c (read_minibuffer_internal_unwind):
        Use Vminibuf_window's new name.
        * minibuf.c (reinit_vars_of_minibuf): Removed, delegate to the C
        implementation.
        * minibuf.c (vars_of_minibuf): Use staticpro_dump_nil() on
        Vminibuffer_zero, Vecho_area_buffer.
        * minibuf.c (reinit_complex_vars_of_minibuf):
        Remove staticpro_nodump() for those variables.
        * mule-coding.c (reinit_vars_of_mule_coding): Empty, removed.
        * mule-wnnfns.c (reinit_vars_of_mule_wnn):
        Delegate initialization of some static variables to zero to the C
        implementation.
        * print.c (reinit_vars_of_print): Removed, delegate to the C
        implementation.
        * scrollbar-x.c:
        * scrollbar-x.c (int stupid_vertical_scrollbar_drag_hack): Static
        initialization to 1.
        * scrollbar-x.c (reinit_vars_of_scrollbar_x): Delegate to the C
        implementation.
        * select-x.c (reinit_vars_of_select_x): Removed, delegate to the C
        implementation.
        * symsinit.h:
        Remove declarations for various reinit_vars_of_FILE() functions.
        * undo.c (reinit_vars_of_undo): Removed, delegate to the C
        implementation.
        * window-impl.h:
        Use Vminibuf_window's new name.
        * window.c:
        Ditto.
        * window.c (Fnext_window): Ditto.
        * window.c (Fprevious_window): Ditto.
        * window.c (reinit_vars_of_window): Removed.
        * window.c (vars_of_window):
        staticpro_dump_nil (&Vminibuf_window) here.
        * window.h: Use Vwinibuf_window's new name here.

2025-04-09  Aidan Kehoe  <kehoea@parhasard.net>

        Add dump_add_nil_lisp_object(), staticpro_dump_nil(), telling the
        dumper that a given Lisp_Object in the data segment should be
        initialized to Qnil after pdump_load() irrespective of its value
        at dump time.
        * alloc.c:
        * alloc.c (staticpro_dump_nil): New.
        Add VARADDRESS to staticpros and call dump_add_nil_lisp_object()
        on it.
        * alloc.c (disksave_object_finalization): Remove variables from
        this now handled with dump_add_nil_lisp_object().
        * console-stream.c (vars_of_console_stream):
        Call dump_add_nil_lisp_object() on Vterminal_console,
        Vterminal_device, Vterminal_frame.
        * device.c (clear_default_devices):
        Remove Vdefault_device_plist = Qnil from this.
        * device.c (vars_of_device):
        Call dump_add_nil_lisp_object (&Vdefault_device_plist) here.
        * dumper.c (pdump_nil_lisp_objects): New Lisp_Object_ptr_dynarr.
        * dumper.c (dump_add_nil_lisp_object): New.
        Add an entry to pdump_nil_lisp_objects.
        * dumper.c (save_pdump_nil_lisp_objects): New. Return a Lisp vector
        reflecting the current values of those entries in
        pdump_nil_lisp_objects, and set them to Qnil.
        * dumper.c (restore_pdump_nil_lisp_objects): New. Given a Lisp
        vector created by save_pdump_nil_lisp_objects(), restore the saved
        values.
        * dumper.c (pdump):
        Call save_pdump_nil_lisp_objects(), then call
        restore_pdump_nil_lisp_objects() by means of an unwind-protect.
        Remove special-casing of Vterminal_console, Vterminal_frame,
        Vterminal_device.
        * emacs.c:
        Call dump_add_nil_lisp_object() on variables previously reset by
        disksave_object_finalization().
        * lread.c (vars_of_lread): Ditto.
        * process.c (vars_of_process): Ditto.
        * lisp.h:
        Declare staticpro_dump_nil().
        * lrecord.h:
        Declare dump_add_nil_lisp_object().

2025-04-09  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        * alloc.c (staticpro_dump_nil):

        * console-stream.c (vars_of_console_stream):
        * dumper.c:
        * dumper.c (dump_add_nil_lisp_object):
        * dumper.c (save_pdump_nil_lisp_objects):
        * dumper.c (restore_pdump_nil_lisp_objects):
        * dumper.c (pdump):
        * dumper.c (pdump_load_check):

2025-04-09  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        * alloc.c (common_init_alloc_early):
        * alloc.c (init_alloc_once_early):
        * lisp.h:
        * symbols.c (defsymbol_massage_name_1):
        * symbols.c (defsymbol_nodump):
        * symbols.c (defsymbol):
        Remove staticpro_names, staticpro_nodump_names. These interact
        poorly with modules if the value of DEBUG_XEMACS differs between
        the XEmacs binary and the module, and they are less necessary with
        recent GDB which resolves data segment pointers to their symbol
        name automatically.

2025-04-07  Aidan Kehoe  <kehoea@parhasard.net>

        Add define_lisp_object(), undef_lisp_object() for better
        encapsulation of creating new lrecord types.
        * alloc.c:
        * alloc.c (init_memory_usage_stats):
        Update a comment here.
        No longer initialize Vmemusage_stats_list from this function, we
        have some bootstrap-handling within the new define_lisp_object()
        that means it's more appropriate to leave it to
        init_alloc_once_early().
        * alloc.c (uninit_memory_usage_stats): Make this static, now it is
        called from undef_lisp_object().
        * alloc.c (define_lisp_object): New. Do the allocation and
        bare-bones initialization of an entry in
        lrecord_implementations_table, and bootstrap handling of NAME as
        did init_lrecord_implementation_name() previously.
        Call init_memory_usage_stats() from within this function, with the
        same bootstrap handling.
        Add an entry to the load history which will allow better
        integration with the module infrastructure going forward.
        * alloc.c (undef_lisp_object): New. Now a function called from
        UNDEF_MODULE_LISP_OBJECT(), which previously did the bulk of
        this. Be smarter if objects of the type being undefined still
        exist, preserve their names and, if possible, static sizes. Use an
        empty memory description (since the memory description is in
        static data which is unloaded with a module).
        * alloc.c (init_alloc_once_early):
        Initialize Vmemusage_stats_list here, to all zeroes.
        * alloc.c (syms_of_alloc):
        Check for zero values in Vmemusage_stats_list rather than
        Qnull_pointer entries, don't startle the garbage collector.
        * lrecord.h:
        Remove the declaration of uninit_memory_usage_stats() from here,
        now to be called only from undef_lisp_object.
        * lrecord.h (XD_INDIRECT):
        * lrecord.h (MAKE_LISP_OBJECT):
        Revist this to call define_lisp_object().
        * lrecord.h (DECLARE_LISP_OBJECT):
        Revise init_lrecord_type_##c_name() to return the numeric value of
        the lrecord_type, used in the call to define_lisp_object().
        * lrecord.h (DECLARE_MODULE_API_LISP_OBJECT):
        Ditto.
        * lrecord.h (DECLARE_MODULE_LISP_OBJECT):
        Ditto.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * syntax.c (find_start_of_comment):
        Check that FROM is > 1 before calling prev_bytebpos() on it, avoid
        a crash I've recently elicited.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the Lisp_Subr structures from the data segment; they are
        copied to the dump file by pdump() anyway, so the data segment
        copies are leaked, and with modules Lisp code access to the data
        segment of unloaded modules ends badly.

        In passing, store the interned symbol as the NAME field, also
        ensuring that it does not point into the data segment of an
        unloaded module. Store PROMPT as a Lisp_Object, either Qnil or a
        string.

        Return the string name of the symbol from #'subr-name, preserving
        what our callers expect.  Similar for #'subr-interactive.
        
        * alloc.c:
        * alloc.c (make_subr):
        Remove a comment that is no longer true.
        * alloc.c (mark_subrs_readonly): New. Mark those subrs that
        are bound to interned symbols as C-readonly as was the case
        previous to this change.  Mark their interactive specs as
        C-readonly if they are strings.

        * alloc.c (disksave_object_finalization):
        Call it.
        * callint.c (Fcall_interactively):
        Now subr prompt data is stored as a string, treat it the same as
        compiled function prompt data.
        * data.c:
        * data.c (Fsubr_interactive):
        Handle the new data type for Lisp_Subr->prompt.
        * emacs.c (main_1):
        Re-order this, syms_of_eval() now needs to be called before
        anything that calls DEFSUBR().

        * eval.c:
        * eval.c (print_subr):
        Revise this to reflect the new members of Lisp_Subr.
        * eval.c (Fcommandp):
        Ditto.
        * general-slots.h:
        Add Qfunction_min_args, Qfunction_max_args here, used by
        sanity-checking within defsubr().

        * lisp.h:
        * lisp.h (struct Lisp_Subr):
        Revise this to make NAME, PROMPT Lisp_Objects. Re-order it
        following best practice.

        * lisp.h (subr_name):
        Revise this to return the string data of the symbol subr name.

        * lisp.h (DEFUN):
        * lisp.h (DEFUN_NORETURN):
        Communicate the arguments of these macros to defsubr() by means of
        an inline function.
        Declare defsubr(), defsubr_macro() in lisp.h so the compiler knows
        about their calling convention.

        * symbols.c:
        * symbols.c (Fsubr_name):
        Return the string name of the symbol subr name.

        * symbols.c (defsubr_1): New. Bulk of defsubr(),
        defsubr_macro(). Sanity-check the supplied arguments in the same
        way for built-ins as for subrs created by modules. No further need
        to copy a supplied Lisp_Subr to the C heap.
        * symbols.c (defsubr): Revise this to take LNAME, SUBR_FN,
        MIN_ARGS, MAX_ARGS, PROMPT as its arguments, and to return the
        interned symbol name of the subr, this latter used by tests.c.
        * symbols.c (defsubr_macro):
        Ditto.
        * symbols.c (defvar_magic): Move this before syms_of_symbols(),
        same structure as every other file.
        
        * symeval.h:
        * symeval.h (DEFSUBR_MACRO):
        Revise these to use the inline function created by DEFUN() to
        communicate arguments to us.

        * tests.c (TESTS_DEFSUBR):
        Use the fact that DEFSUBR() now returns the symbol bound in this
        macro.

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        Add a new #define for Lisp_Subr->max_args, KEYWORDS, numerically
        identical to MANY but explicitly making LNAME and MIN_ARGS
        available to PARSE_KEYWORDS() as static constants.
        If MAX_ARGS is KEYWORDS, force use of NARGS and ARGS for the
        argument vector length and name.
        Remove explicit use of NARGS and ARGS in calls to
        PARSE_KEYWORDS(), making use of this macro simpler.
        Remove use of GET_DEFUN_LISP_OBJECT() in preparation for future
        work.
        
        * lisp.h:
        * lisp.h (EXFUN_KEYWORDS): New.
        * lisp.h (KEYWORDS): New, numerically equivalent to MANY.
        * lisp.h (DECLARE_LISP_NAME_0): New, dummy to allow LNAME for a
        subr to be communicated to PARSE_KEYWORDS() for a subr that takes
        keyword arguments.
        * lisp.h (DEFUN):
        * lisp.h (DEFUN_NORETURN):
        Revise both these to pass LNAME, MIN_ARGS to the keyword parsing
        code explicitly.
        * lisp.h (GET_DEFUN_LISP_OBJECT): Removed.
        * lisp.h (DEFUN_KEYWORDS): New. Force NARGS, ARGS as the name of
        the arguments for a function declared with KEYWORDS as max_args.
        * lisp.h (PARSE_KEYWORDS_DEFUN_NAME): New. Given Fname, return its
        Lisp name as a constant C string.
        * lisp.h (PARSE_KEYWORDS_DEFUN_MIN_ARGS): New. Given Fname, return its
        min_args as a constant C short.

        * data.c:
        * data.c (Fparse_integer):
        * elhash.c:
        * elhash.c (Fmake_hash_table):
        * lstream.c:
        * lstream.c (Fmake_string_output_stream):
        * sequence.c:
        * sequence.c (Fcount):
        * sequence.c (FmemberX):
        * sequence.c (Fadjoin):
        * sequence.c (FassocX):
        * sequence.c (FrassocX):
        * sequence.c (Fposition):
        * sequence.c (Ffind):
        * sequence.c (FdeleteX):
        * sequence.c (FremoveX):
        * sequence.c (Fdelete_duplicates):
        * sequence.c (Fremove_duplicates):
        * sequence.c (Fmerge):
        * sequence.c (FsortX):
        * sequence.c (Ffill):
        * sequence.c (Freduce):
        * sequence.c (Freplace):
        * sequence.c (Fnsubstitute):
        * sequence.c (Fsubstitute):
        * sequence.c (Fsublis):
        * sequence.c (Fnsublis):
        * sequence.c (Fnsubst):
        * sequence.c (Ftree_equal):
        * sequence.c (Fmismatch):
        * sequence.c (Fsearch):
        * sequence.c (Funion):
        * sequence.c (Fset_exclusive_or):
        Update calls to DEFUN(), PARSE_KEYWORDS() to reflect the above
        changes.
        
        * gpmevent.c:
        * gpmevent.c (Fgpm_enable):
        * gpmevent.c (syms_of_gpmevent):
        * tooltalk.c (init_tooltalk):
        Avoid using GET_DEFUN_LISP_OBJECT() in these files, call the
        corresponding function using its Lisp symbol name

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        Simplify the PARSE_KEYWORDS() macro, no need to specify the number
        of keywords explicitly. Thank you for the technique, Dale Weiler.

        * lisp.h:
        * lisp.h (PARSE_KEYWORDS):
        Correct and update some documentation for this. Remove a couple of
        function calls that attempted to avoid using
        GET_DEFUN_LISP_OBJECT(), something I plan to remove entirely
        shortly anyway.
        * lisp.h (PARSE_KEYWORDS_ARGC_COUNTER): New.
        * lisp.h (PARSE_KEYWORDS_ARGC): New.
        * lisp.h (PARSE_KEYWORDS_CAT): New.
        * lisp.h (PARSE_KEYWORDS_CONCATENATE): New.
        * lisp.h (PARSE_KEYWORDS_7): Rename PARSE_KEYWORDS_8 to this.

        * data.c (Fparse_integer):
        * doprnt.c (Fformat_into):
        * elhash.c (Fmake_hash_table):
        * lstream.c (Fmake_string_output_stream):
        * print.c (Fwrite_sequence):
        * sequence.c (count_with_tail):
        * sequence.c (Fcount):
        * sequence.c (FmemberX):
        * sequence.c (Fadjoin):
        * sequence.c (FassocX):
        * sequence.c (FrassocX):
        * sequence.c (Fposition):
        * sequence.c (Ffind):
        * sequence.c (FdeleteX):
        * sequence.c (FremoveX):
        * sequence.c (Fdelete_duplicates):
        * sequence.c (Fremove_duplicates):
        * sequence.c (Fmerge):
        * sequence.c (FsortX):
        * sequence.c (Ffill):
        * sequence.c (Freduce):
        * sequence.c (Freplace):
        * sequence.c (Fnsubstitute):
        * sequence.c (Fsubstitute):
        * sequence.c (Fsublis):
        * sequence.c (Fnsublis):
        * sequence.c (Fnsubst):
        * sequence.c (Ftree_equal):
        * sequence.c (Fmismatch):
        * sequence.c (Fsearch):
        * sequence.c (venn):
        * sequence.c (nvenn):
        * sequence.c (Funion):
        * sequence.c (Fset_exclusive_or):
        * sequence.c (Fnset_exclusive_or):
        Call PARSE_KEYWORD(), PARSE_KEYWORDS_7() with their new calling
        conventions.

2025-04-05  Aidan Kehoe  <kehoea@parhasard.net>

        Add support for _fseeki64(), _ftelli64() on Windows.
        Quiet Visual Studio warnings on 64-bit platforms regarding type
        narrowing in dumper.c.

        * config.h.in:
        #define FSEEK, FTELL, OFF_T appropriately if we have a recent
        MSVC.
        * dumper.c:
        * dumper.c (struct):
        * dumper.c (pdump_block_list_elt):
        * dumper.c (pdump_make_hash):
        * dumper.c (pdump_add_block):
        * dumper.c (pdump_register_block_contents):
        * dumper.c (pdump_register_block):
        * dumper.c (pdump_store_new_pointer_offsets):
        * dumper.c (pdump_dump_data):
        Update types to better reflect 64-bit platforms in this file.

2025-04-05  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_align_stream):
        Use EMACS_DUMP_FILE_NAME appropriately when erroring.
        * dumper.c (pdump):
        Ditto.
        Avoid qxe_open() since that leads to pdump choking on
        Windows. Assert that EMACS_DUMP_FILE_NAME is entirely ASCII.

2025-03-20  Aidan Kehoe  <kehoea@parhasard.net>

        * editfns.c (Fcompare_buffer_substrings):
        Revise Fcompare_buffer_substrings() to avoid potentially O(N)
        BUF_FETCH_CHAR() calls. I note GNU has already done this. Extend the
        docstring (some inspiration taken from GNU's current docstring).

2025-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * .gdbinit.in.in: Remove entries for lrecord_type_ldap,
        lrecord_type_pgconn, lrecord_type_pgresult from this, now they are
        generated at module load time.

        * alloc.c (init_memory_usage_stats): Take TYPE as an int, now that
        is appropriate for DECLARE_MODULE_LISP_OBJECT().
        Add an assertion regarding its value.
        * alloc.c (uninit_memory_usage_stats): Ditto.
        * alloc.c (init_lrecord_implementation_name): Correct a comment. 
        * lrecord.h:
        * lrecord.h (enum lrecord_type):
        Remove lrecord_type_ldap, lrecord_type_pgconn,
        lrecord_type_pgresult from here.
        * lrecord.h (struct lrecord_implementation):
        Change the type of LRECORD_TYPE_INDEX to int, get
        DECLARE_MODULE_LISP_OBJECT() working.
        * lrecord.h (DECLARE_LISP_OBJECT): Be stricter about assertions
        here.
        * lrecord.h (DECLARE_MODULE_API_LISP_OBJECT): Ditto.

2025-03-18  Aidan Kehoe  <kehoea@parhasard.net>

        Move struct lrecord_implementation.name to being an interned
        symbol, which will things simpler for unloading modules and speed
        up Ftype_of() a little.

        * alloc.c:
        Update lrecord_implementation_description_1[] to reflect
        this. Correct some indentation in passing.
        * alloc.c (gc_plist_hack):
        Update argument types in this now the type of
        lrecord_implementation.name has changed.
        * alloc.c (pluralize_word): Ditto.
        * alloc.c (pluralize_and_append): Ditto.
        * alloc.c (object_memory_usage_stats): Ditto.
        * alloc.c (struct saved_object_name): New.
        * alloc.c (init_lrecord_implementation_name): New.
        Usually equivalent to lrecord_implementation_table[TIPO] = intern
        (NAME), but with some special handling for early bootstrap before
        it is possible to intern symbols.
        * data.c (Ftype_of):
        No need to intern() any more, just return the symbol naming the
        type for pointer types.
        * lrecord.h:
        * lrecord.h (struct lrecord_implementation): Update this.
        * lrecord.h (LRECORD_IMPLEMENTATION_IBYTE_NAME): Update this.
        * lrecord.h (MAKE_LISP_OBJECT): Update this to call
        init_lrecord_implementation_name().
        Declare init_lrecord_implementation_name().
        * symbols.c (init_symbols_once_early):
        Create Qnil as soon as we can intern strings, allowing the early
        bootstrapping code to clean up.

2025-03-18  Aidan Kehoe  <kehoea@parhasard.net>

        Wrap access to struct lrecord_implementation.name in preparation
        for further changes.

        * alloc.c (INCREMENT_CONS_COUNTER): Move the second argument here
        to being a pointer to the struct lrecord_implementation, which
        works better with e.g. the ALLOCATE_FIXED_TYPE() macros.
        * alloc.c (old_alloc_sized_lcrecord_1): Call
        INCREMENT_CONS_COUNTER() with its new convention.
        * alloc.c (ALLOCATE_FIXED_TYPE): Ditto.
        * alloc.c (NOSEEUM_ALLOCATE_FIXED_TYPE): Ditto.
        * alloc.c (allocate_big_string_chars): Ditto.
        * alloc.c (allocate_string_chars_struct): Ditto.
        * alloc.c (resize_string): Ditto.
        * data.c (Ftype_of):
        Use the wrapper just introduced.
        * dumper.c (pdump_backtrace): Ditto.
        * dumper.c (pdump_register_object): Ditto.
        * dumper.c (pdump): Ditto.
        * gc.c (kkcc_backtrace_1): Ditto.
        * lrecord.h (struct lrecord_implementation):
        Change the type of NAME to const CIbyte, in preparation for
        further changes.
        * lrecord.h (LRECORD_IMPLEMENTATION_IBYTE_NAME):
        Provide the accessor macro.
        * print.c (printing_unreadable_lisp_object): Use it.
        * print.c (external_object_printer): Use it.
        * print.c (internal_object_printer): Use it.
        * print.c (debug_p4): Use it.
        * symbols.c (print_symbol_value_magic): Use it.

2025-03-16  Aidan Kehoe  <kehoea@parhasard.net>

        * lrecord.h (struct lrecord_implementation):
        Reorder this to reduce wasted space given alignment
        requirements. Document the nsubst_structures_descend method.

2025-03-15  Aidan Kehoe  <kehoea@parhasard.net>

        Remove all the lrecord_implementation structures from the C data
        segment, just use those copies in the dump file (or the heap),
        making things simpler for modules and reducing memory usage for
        core XEmacs.

        * lrecord.h:
        * lrecord.h (LRECORD_IMPLEMENTATION): New. Give a built-in C type
        name (cons, bignum, etc) return a pointer to the
        lrecord_implementation of the corresponding Lisp object using
        lrecord_implementations_table.
        * lrecord.h (ALLOC_NORMAL_LISP_OBJECT):
        Use it.
        * lrecord.h (NORMAL_LISP_OBJECT_HEADER):
        Use it.
        * lrecord.h (ALLOC_C_READONLY_LISP_OBJECT):
        Use it.
        * lrecord.h (INIT_MEMORY_USAGE_STATS): Move this further up in the
        file.
        * lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
        Revise this to use the new calling convention for
        MAKE_LISP_OBJECT().
        * lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
        Ditto.
        * lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT):
        Ditto.
        * lrecord.h (MAKE_LISP_OBJECT):
        Call init_lrecord_type_##c_name() here, initialize the enumeration
        for module objects if that is appropriate.
        * lrecord.h (UNDEF_LISP_OBJECT): Removed.
        * lrecord.h (UNDEF_MODULE_LISP_OBJECT):
        Revise this to subsume UNDEF_LISP_OBJECT().
        * lrecord.h (OBJECT_HAS_METHOD):
        Use LRECORD_IMPLEMENTATION() here.
        * lrecord.h (OBJECT_HAS_PREMETHOD):
        Ditto.
        * lrecord.h (OBJECT_HAS_NAMED_METHOD):
        Ditto.
        * lrecord.h (OBJECT_HAS_PROPERTY):
        Ditto.
        * lrecord.h (DECLARE_LISP_OBJECT_1): New.
        DECLARE_LISP_OBJECT without its init_lrecord_##c_name().
        * lrecord.h (DECLARE_MODULE_API_LISP_OBJECT): Use it.
        * lrecord.h (DECLARE_MODULE_LISP_OBJECT): Use it.
        * lrecord.h (DECLARE_LISP_OBJECT): Use it.

        * alloc.c:
        Call DECLARE_LISP_OBJECT() for Lisp_Free here, now that is
        needed.
        * alloc.c (Fcons):
        Move the DEFINE.*LISP_OBJECT() to init_alloc_once_early().
        Use LRECORD_IMPLEMENTATION (cons) rather than &lrecord_cons.
        * alloc.c (noseeum_cons):
        Ditto.  
        * alloc.c (make_float):
        Use LRECORD_IMPLEMENTATION (c_type) rather than &lrecord_c_type.
        * alloc.c (make_bignum): Ditto.
        * alloc.c (make_bignum_un): Ditto.
        * alloc.c (make_bignum_ll): Ditto. 
        * alloc.c (make_bignum_ull): Ditto.
        * alloc.c (make_bignum_bg): Ditto. 
        * alloc.c (make_ratio): Ditto.
        * alloc.c (make_ratio_bg): Ditto.
        * alloc.c (make_ratio_rt): Ditto.
        * alloc.c (make_bigfloat): Ditto.
        * alloc.c (make_bigfloat_bf): Ditto. 
        * alloc.c (make_bit_vector_internal): Ditto.
        * alloc.c (make_compiled_function): Ditto.
        * alloc.c (make_subr): Ditto.
        * alloc.c (Fmake_symbol): Ditto.
        * alloc.c (allocate_extent): Ditto.
        * alloc.c (allocate_event): Ditto. 
        * alloc.c (Fmake_marker): Ditto.
        * alloc.c (noseeum_make_marker): Ditto.
        * alloc.c (make_uninit_string): Ditto.
        * alloc.c (make_string_nocopy): Ditto.
        * alloc.c (make_lcrecord_list): Ditto.
        * alloc.c (init_memory_usage_stats): Create Vmemusage_stats_lists
        if it is Qnull_pointer, which means this function has been called
        from within DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT().
        * alloc.c (disksave_object_finalization_1):
        If ERROR_CHECK_TYPES, call error_check_free() once to suppress
        warnings.
        * alloc.c (init_alloc_once_early):
        Call DEFINE.*LISP_OBJECT() rather than the removed
        INIT_LISP_OBJECT() here. Reorder the calls to create the vector
        object first given it is needed for Vmemusage_stats_list.

        * buffer.c:
        * buffer.c (syms_of_buffer): Call DEFINE_NODUMP_LISP_OBJECT()
        here.
        * buffer.c (common_init_complex_vars_of_buffer):
        Use LRECORD_IMPLEMENTATION (c_type) rather than &lrecord_c_type.
        * bytecode.c:
        * bytecode.c (syms_of_bytecode):
        Call DEFINE.*LISP_OBJECT() rather than the removed INIT_LISP_OBJECT()
        here.

        * casetab.c (syms_of_casetab):
        Ditto.
        * chartab.c (syms_of_chartab):
        Ditto.
        * console.c (syms_of_console):
        Ditto.
        * console.c (common_init_complex_vars_of_console):
        Use LRECORD_IMPLEMENTATION (c_type) rather than &lrecord_c_type.

        * data.c (syms_of_data):
        Call DEFINE.*LISP_OBJECT() rather than the removed INIT_LISP_OBJECT()
        here.
        * database.c (syms_of_database): Ditto.
        * device-msw.c (syms_of_device_mswindows): Ditto.
        * device.c (syms_of_device): Ditto.
        * dialog-msw.c (syms_of_dialog_mswindows): Ditto.
        * elhash.c (init_elhash_once_early): Ditto.
        * emacs.c (main_1): Remove mention of INIT_LISP_OBJECT() from here.
        * eval.c (syms_of_eval):
        Call DEFINE.*LISP_OBJECT() rather than the removed INIT_LISP_OBJECT()
        here.
        * event-stream.c (syms_of_event_stream): Ditto.
        * events.c (syms_of_events): Ditto.
        * extents.c (syms_of_extents): Ditto.
        * faces.c (syms_of_faces): Ditto.
        * file-coding.c (syms_of_file_coding): Ditto.
        * floatfns.c (syms_of_floatfns): Ditto.
        * font-mgr.c (syms_of_font_mgr): Ditto.
        * fontcolor.c (syms_of_fontcolor): Ditto.
        * frame.c (syms_of_frame): Ditto.
        * glyphs.c (syms_of_glyphs): Ditto.
        * gui.c (syms_of_gui): Ditto.
        * keymap.c (syms_of_keymap): Ditto.
        * lstream.c:
        * lstream.c (Lstream_new):
        Use LRECORD_IMPLEMENTATION (c_type) rather than &lrecord_c_type.
        * lstream.c (syms_of_lstream):
        Call DEFINE.*LISP_OBJECT() rather than the removed INIT_LISP_OBJECT()
        here.
        * lstream.h (INIT_STACK_FIXED_BUFFER_OUTPUT_STREAM):
        Use LRECORD_IMPLEMENTATION (c_type) rather than &lrecord_c_type.
        * marker.c (syms_of_marker):
        Call DEFINE.*LISP_OBJECT() rather than the removed INIT_LISP_OBJECT()
        here.
        * mule-charset.c (syms_of_mule_charset):
        Ditto.
        * number.c (syms_of_number): Ditto.
        * opaque.c (init_opaque_once_early): Ditto.
        * process.c (syms_of_process): Ditto.
        * rangetab.c (syms_of_rangetab): Ditto.
        * scrollbar.c (syms_of_scrollbar): Ditto.
        * specifier.c (syms_of_specifier): Ditto.
        * symbols.c (init_symbols_once_early): Ditto.
        * toolbar.c (syms_of_toolbar): Ditto.
        * tooltalk.c (syms_of_tooltalk): Ditto.
        * ui-gtk.c (syms_of_ui_gtk): Ditto.
        * unicode.c (syms_of_unicode): Ditto.
        * window.c (syms_of_window): Ditto.

2025-03-11  Aidan Kehoe  <kehoea@parhasard.net>

        * redisplay.c (redisplay_frame):
        Correct a bug in my last change elicited when f->old_buffer_alist
        is equal in length to f->buffer_alist, thank you Stephen
        Turnbull.
        * lisp.h (Freplace_list): Remove declaration for this in passing.

2025-03-08  Aidan Kehoe  <kehoea@parhasard.net>

        * fns.c (Freplace_list): Removed. Inappropriate to have it in C,
        now Freplace() is built-in.
        * fns.c (syms_of_fns):
        Remove its DEFSUBR.
        * redisplay.c (redisplay_frame):
        Replace  the only call to Freplace_list() from C with its
        implementation. 
        * sequence.c (syms_of_sequence):
        Define substring as an alias for subseq here rather than in
        subr.el, avoiding issues with feature checks when loading
        subr.elc.

2025-03-08  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (Fmake_byte_code):
        Eagerly call optimize_compiled_function if PURIFY_FLAG, since
        otherwise those compiled functions not called at dump time have
        their string instructions stored in the dump file, and those
        string instructions are leaked on first call since nothing in the
        dump file is swept.

2025-03-06  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c (compile_extended_range):
        If THIS_CHAR is not a valid Ichar, don't look it up in the
        translation table, avoiding crashes with error checking when
        invalid characters are within the range specified. Do include them
        in the range table, which will allow coalescing ranges that would
        otherwise not be.

2025-03-06  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c (re_wctype): Change type of LIMIT to Bytecount, as had
        always been the intention.
        * regex.h: Update its declaration.

2025-03-04  Aidan Kehoe  <kehoea@parhasard.net>

        Use C23's #embed, if available, for the dump file with
        DUMP_IN_EXEC. Fall back to Dale Weiler's INCBIN() as previously
        used if #embed is not available.
        clang-19 doesn't accept concatenation of EMACS_PROGNAME with
        ".dmp" as a valid filename for #embed, add EMACS_DUMP_FILE_NAME to
        config.h and use that. Use DUMP_FILE_NAME as the corresponding
        autoconf variable.

        * Makefile.in.in:
        * Makefile.in.in ($(RAW_EXE)): Now we have the C compiler involved
        in embedding the dump file again, it attempts once more to put an
        all-zero dump file into BSS. Use Larry McVoy's magic values to
        prevent this as the insert-data-in-exec code used to.
        Use @DUMP_FILE_NAME@ instead of $(DUMP_TARGET).dmp throughout this
        file.
        * config.h.in (EMACS_DUMP_FILE_NAME):
        * dump-data.c: Use #embed for dumped_data if available. If #embed
        is available, we have a recent enough C implementation that
        <stdalign.h> is going to be available, use alignas() to force
        16-byte alignment.
        * dumper.c (pdump):
        Use EMACS_DUMP_FILE_NAME explicitly for the dump file name.

2025-03-03  Aidan Kehoe  <kehoea@parhasard.net>

        * redisplay-tty.c (tty_output_display_block):
        Placate warnings on recent Clang, variable length arrays are a C99
        extension not guaranteed to be available in C++.

2025-03-03  Aidan Kehoe  <kehoea@parhasard.net>

        * syswindows.h:
        Widen the front of the fight between the X11 headers and the Win32
        headers for the sake of the Cygwin compilation.
        * xemacs.def.in.in:
        Update this with newly-added functions that need to be visible to
        the modules.

2025-03-02  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (RESET_GCPROLIST): New macro, set GCPROLIST to NULL,
        avoiding tripping error checking.
        * emacs.c (Frun_emacs_from_temacs):
        Use it, since our stack is about to become invalid.

2025-03-01  Aidan Kehoe  <kehoea@parhasard.net>

        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
        Suppress warnings about interleaving declarations and code when
        compiling as C99.

2025-03-01  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the EVENT_DATA_AS_OBJECTS code, not used in over twenty
        years and not adding any value. Commit generated with unifdef
        -UEVENT_DATA_AS_OBJECTS. 

        * alloc.c:
        * alloc.c (gc_sweep_1):
        * alloc.c (common_init_alloc_early):
        * events.c:
        * events.c (Fcopy_event):
        * events.c (syms_of_events):
        * events.h:
        * events.h (EVENT_FOO_BAR):
        * events.h (struct Lisp_Key_Data):
        * events.h (struct Lisp_Button_Data):
        * events.h (struct Lisp_Motion_Data):
        * events.h (struct Lisp_Process_Data):
        * events.h (struct Lisp_Timeout_Data):
        * events.h (struct Lisp_Eval_Data):
        * events.h (struct Lisp_Misc_User_Data):
        * events.h (struct Lisp_Magic_Eval_Data):
        * events.h (struct Lisp_Magic_Data):
        * events.h (struct Lisp_Event):
        * events.h (XSET_EVENT_NEXT):
        * lisp.h:
        * lrecord.h (enum lrecord_type):

2025-03-01  Aidan Kehoe  <kehoea@parhasard.net>

        * symeval.h (XSYMBOL_VALUE_MAGIC):
        Correct a compile time failure with --with-optimization, thank you
        the buildbot.

2025-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        Fix further crash linked to the AMD64 red zone, this time with
        --with-optimize and GCC, which chooses to ignore the size of an
        array not written to. Change strategy to, within xemacs_c_alloca
        (), a non-leaf function, compare the address of a local variable
        to STACK_BOTTOM, already provided for gc.c, and work out the stack
        direction from that. Thank you Mats Lidell and the buildbot.

        * alloca.c (find_stack_direction): Remove this, it is currently
        too prone to failure with optimizing compilers.
        * alloca.c (xemacs_c_alloca): Implement it in a simpler way.

2025-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        Add type checking for symbol_value_magic objects in the same way
        as for more conventional objects.

        * symbols.c:
        Update comments.

        * symbols.c (defvar_magic): 
        Update defvar_magic() to take a Lisp_Object as its second arg,
        reducing the need to cast. Add a type checking assertion to this
        function.

        * symeval.h:
        * symeval.h (enum symbol_value_type):
        Remove #if 0'd SYMVAL_CONSTANT_SYMBOL, which I don't plan to
        implement.
        * symeval.h (ASSERT_OK_FOR_MAGIC): New macro, checks that an enum
        symbol_value_type is for a type that has a MAGICFUN
        implementation.

        * symeval.h (DEFVAR_SYMVAL_FWD_NON_LISP): Use it. Call
        defvar_magic() with its new types.
        * symeval.h (DEFVAR_SYMVAL_FWD_OBJECT): Ditto.

2025-02-24  Aidan Kehoe  <kehoea@parhasard.net>

        Quiet compiler warnings, clang-19.
        * alloc.c (old_alloc_sized_c_readonly_lcrecord): Removed. Added as
        part of the support for allocating symbol_value_forward_fixnum and
        symbol_value_forward_boolint on the heap, but not actually used by
        that.

        * frame-x.c (x_cant_notify_wm_error):
        Use (void) for the arglist in the definition of this function.
        * gccache-x.c (define_gc_cache_hash_table_test):
        Ditto.

        * gpmevent.c (Freceive_gpm_event): Remove NUM_EVENTS, a debugging
        variable set but not used.
        * miscplay.c (reset_parsestate):
        Use (void) for the arglist in the definition of this function.
        * miscplay.c (parse_wave_complete): Ditto.

        * regex.c:
        * regex.c (optimize_on_failure_jump):
        * regex.c (regex_compile):
        * regex.c (at_begline_loc_p): Remove SYNTAX from the arglist for
        this, now unused.
        * regex.c (at_endline_loc_p): Ditto.
        * regex.c (compile_range): Ditto. Also remove REGNUM, set but not
        used.
        * regex.c (expression_match_null_string_p): Remove BUFP from the
        arglist for this, now unused.
        * search.c (matcher_overflow):
        Use (void) for the arglist in the definition of this function.
        * sysdll.c (dll_error):
        Ditto.

2025-02-24  Aidan Kehoe  <kehoea@parhasard.net>

        * number.c (Fcanonicalize_number):
        Error if NUMBER is not a number.
        * number.c (Fcoerce_number):
        Ditto. Give a better error message if TYPE is not supported.

2025-02-24  Aidan Kehoe  <kehoea@parhasard.net>

        * chartab.c:
        * chartab.c (word_boundary_p):
        Modernise the return type for this. Use EXTERNAL_LISP_LOOP_2()
        when examining Vword_separating_categories,
        Vword_combining_categories, so we error instead of provoking an
        infinite loop.
        * chartab.h:
        Update the return type for word_boundary_p().

2025-02-23  Aidan Kehoe  <kehoea@parhasard.net>

        * symbols.c (Fset):
        Call DUMPEDP on XPNTRVAL (valcontents) here, placating the union
        build. Thank you Mats Lidell and the buildbot.

2025-02-23  Aidan Kehoe  <kehoea@parhasard.net>

        Mark and dump through the VALUE field of the symbol-value-forward
        objects when appropriate, removing the need for staticpro() for
        those objects.
        Use XD_BLOCK_DATA_PTR to describe staticpros, struct
        console_methods.device_specific_frame_props.
        Remove the XD_DATA_POINTER description type, no longer needed now
        more fine-grained descriptions appropriate.

        * .gdbinit.in.in (Lisp): Add a couple of new symbol-value-magic
        types for this.
        * alloc.c:
        * alloc.c (old_alloc_sized_lcrecord_1): New. Equivalent to the
        following but with a C_READONLY_P flag; if this is non-zero, mark
        the returned object as C_READONLY (and LISP_READONLY, MARKed), and
        do not add it to all_lcrecords.

        * alloc.c (old_alloc_sized_lcrecord): Implement it in terms of
        old_alloc_sized_lcrecord_1().
        * alloc.c (old_alloc_sized_c_readonly_lcrecord). New. Call
        old_alloc_sized_lcrecord_1() with C_READONLY_P 1.
        * alloc.c (make_lcrecord_list): Correct the type of the SIZE
        argument to this.
        * alloc.c (alloc_managed_lcrecord_1): New. Refactored out to take
        a C_READONLY_P flag. Remove an #if 0'd block.
        * alloc.c (alloc_managed_lcrecord). Implement using
        alloc_managed_lcrecord_1().
        * alloc.c (free_managed_lcrecord): Unmark the record as C_READONLY.
        * alloc.c (alloc_automanaged_sized_lcrecord_1): New. Refactored
        out from the following, to take a C_READONLY_P flag.
        * alloc.c (alloc_automanaged_lcrecord): Implement in terms of
        previous.
        * alloc.c (alloc_automanaged_c_readonly_lcrecord) New. Used for
        symbol_value_forward_fixnum, symbol_value_forward_boolint.
        * alloc.c (staticpro_description_1): Use XD_BLOCK_DATA_PTR in
        this.
        * alloc.c (staticpro): No need for dump_add_root_lisp_object() in
        this now XD_BLOCK_DATA_PTR is used in the description.

        * buffer.c (DEFVAR_BUFFER_LOCAL_1):
        Implement this using DEFVAR_SYMVAL_FWD_OBJECT().
        * buffer.c (DEFVAR_BUFFER_DEFAULTS_MAGIC):
        Use DEFVAR_SYMVAL_FWD_OBJECT() to implement this.
        * console.c:
        Use XD_BLOCK_DATA_PTR to describe struct
        console_methods.device_specific_frame_props.
        * console.c (DEFVAR_CONSOLE_LOCAL_1):
        Implement this using DEFVAR_SYMVAL_FWD_OBJECT().
        * console.c (DEFVAR_CONSOLE_DEFAULTS_MAGIC):
        Ditto.
        * lrecord.h (enum lrecord_type):
        Add new entries, lrecord_type_symbol_value_forward_object (for
        when VALUE needs to be GCed) and
        lrecord_type_symbol_value_forward_fixnum,
        lrecord_type_symbol_value_forward_boolint, to allow pdump to dump
        the values without an explicit dump_add_opaque_int.
        * symbols.c:
        * symbols.c (static const struct memory_description
        symbol_value_magic_description_1): Revise this, the data pointer
        is no longer needed for the general symbol_value_magic
        description.
        * symbols.c (static const struct memory_description
        symbol_value_forward_object_description): New. Describe
        symbol_value_forward_object using XD_BLOCK_DATA_PTR.
        * symbols.c (static const struct memory_description
        symbol_value_forward_fixnum_description): New. Describe
        symbol_value_forward_fixnum using XD_BLOCK_DATA_PTR.
        * symbols.c (static const struct memory_description
        symbol_value_forward_boolint_description): New. Describe
        symbol_value_forward_boolint using XD_BLOCK_DATA_PTR.

        * symbols.c (do_symval_forwarding):
        Rearrange this to handle fixnums and boolint forwarding better,
        less need for casts.

        * symbols.c (set_default_buffer_slot_variable):
        Use symbol_value_forward_object() within this, rather than
        symbol_value_forward, now removed.
        * symbols.c (set_default_console_slot_variable):
        Ditto.
        * symbols.c (store_symval_forwarding):
        No need to check whether OVALUE is EQ to Qunbound, if we have
        already established that OVALUE is not SYMBOL_VALUE_MAGIC_P.
        Use the new symbol value magic types within this.
        * symbols.c (Fset):
        When making a SYMVAL_OBJECT_FORWARD unbound during unloading of a
        module, make its FORWARD pointer NULL and avoid GC choking.
        No longer unstaticpro_nodump().
        * symbols.c (default_value):
        Use XSYMBOL_VALUE_FORWARD_OBJECT() here.
        * symbols.c (symbol_value_buffer_local_info):
        Ditto.
        * symbols.c (init_symbols_once_early):
        Initialize the new symbol_value_forward objects.
        * symbols.c (defvar_magic):
        Change the type of the second arg here, to const struct
        symbol_value_magic *.
        * symeval.h:
        * symeval.h (struct symbol_value_magic):
        Revise this, don't include the VALUE * field, only used by a
        subset of those types that are SYMBOL_VALUE_MAGIC_P().
        * symeval.h (struct symbol_value_forward_object): New. A
        symbol_value_forward that points to a Lisp_Object and that should
        be dumped and GCed as such.
        * symeval.h (struct symbol_value_forward_fixnum): New. A
        symbol_value_forward that points to a Fixnum and that should
        be dumped as such; this fixnum can be ignored for GC.
        * symeval.h (struct symbol_value_forward_boolint): New. A
        symbol_value_forward that points to a Boolint and that should
        be dumped as such; this boolint can be ignored for GC.
        * symeval.h (struct symbol_value_buffer_local):
        Add a comment to the MAGIC field of this structure.
        * symeval.h (DEFVAR_SYMVAL_FWD_NON_LISP): New. Common
        implementation of DEFVAR_SYMVAL_FWD_FIXNUM(),
        DEFVAR_SYMVAL_FWD_BOOL().
        Allocate the structure on the heap rather than in the C data
        segment, avoiding leaking the original structure
        post-pdump_load().
        * symeval.h (DEFVAR_SYMVAL_FWD_OBJECT): Heavily revised. Allocate
        the struct symbol_value_forward_object as a Lisp object, don't
        mark it c_readonly (which means it will now be traversed for GC).
        * symeval.h (DEFVAR_LISP_MAGIC):
        Move this #define together with the others that use
        DEFVAR_SYMVAL_FWD_OBJECT().

2025-02-22  Aidan Kehoe  <kehoea@parhasard.net>

        Remove support for byte-compile-dynamic at runtime, no longer
        worth the decrease in speed and difficulties with files being
        recompiled and offsets getting incorrect with with RAM sizes as
        they are. I note GNU has already done this.
        
        * alloc.c (Fmake_byte_code):
        No longer accept INSTRUCTIIONS as a (FILE . POS) lazy offset.
        * bytecode.c:
        * bytecode.c (optimize_compiled_function):
        No longer call Ffetch_bytecode() from within this.
        * bytecode.c (Ffetch_bytecode): Removed.
        * bytecode.c (syms_of_bytecode): Remove its DEFSUBR.
        * doc.c (get_doc_string): Clarify that the functionality to load
        bytee code instructions and constants will be removed.
        * doc.c (read_doc_string): Remove this, no longer used.
        * lisp.h: Remove its declaration.
        * lread.c (read_compiled_function):
        Always immediately load lazy byte code instructions. Bracket this
        with #ifdef NEED_TO_HANDLE_21_4_CODE.

2025-02-22  Aidan Kehoe  <kehoea@parhasard.net>

        Avoid difficulties with byte-compile-dynamic and print-gensym,
        print-circle, just load the instructions and the compiled
        function constants if there might be a gensym or a recursive
        object in them, allowing them to reference gensyms in the argument
        list.
        * doc.c (get_doc_string): Make this non-static.
        * lisp.h: Declare it.
        * lread.c (read_compiled_function):
        Use it here.

2025-02-19  Aidan Kehoe  <kehoea@parhasard.net>

        Delay calls to FcInit() until
        lwlib-fonts.c:xft_open_font_by_name() or
        fontcolor-xlike-inc.c:xft_find_charset_font(), avoiding updating
        out-of-tree cache files at build time, something Gentoo does not
        like. Thank you for the bug report, Mats Lidell.
        * emacs.c (main_1):
        Remove the call to reinit_vars_of_font_mgr() here.
        * font-mgr.c (reinit_vars_of_font_mgr): Removed. All it did was
        call FcInit() basically directly after pdump_load(), for which
        there is no need, reasonable to delay until we open an X11 device.
        * symsinit.h:
        Remove its declaration.

2025-02-19  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c (re_match_2_internal):
        Correct an assertion here that was incompletely merged from GNU's code,
        picked up by Stephen Turnbull on an M1 mac, of course P isn't
        guaranteed to be >= BUFP->BUFFER, since P points into the stack
        copy of BUFP->BUFFER on XEmacs. Thank you Steve!

2025-02-14  Aidan Kehoe  <kehoea@parhasard.net>

        New data description enumeration values:
        1. XD_BLOCK_DATA_PTR, like XD_BLOCK_PTR but describing pointers
        into the C data segment. Added in preparation for further work.
        2. XD_MEMORY_DESCRIPTION, used for pointers to struct
        memory_description, will be useful if error checking added to
        pdump.
        2. XD_SIZED_MEMORY_DESCRIPTION, used for pointers to struct
        sized_memory_description, same motivation as previous.

        * alloc.c:
        * alloc.c (static const struct sized_memory_description
        c_data_pointer_description): Removed.
        * alloc.c (static const struct sized_memory_description
        memory_description_description): New.
        Use this to describe lrecord_memory_descriptions.
        
        * dumper.c (pdump_register_sub):
        Handle XD_BLOCK_DATA_PTR like XD_BLOCK_PTR, but add a
        corresponding entry to pdump_root_blocks in order that the address
        in the C data segment be updated correctly during
        pdump_load_finish().
        Handle XD_MEMORY_DESCRIPTION, XD_SIZED_MEMORY_DESCRIPTION like
        XD_DATA_POINTER.
        * dumper.c (pdump_store_new_pointer_offsets):
        Handle XD_BLOCK_DATA_PTR like XD_BLOCK_PTR here.
        * dumper.c (pdump_reloc_one): Ditto.
        Update some aspects of an outdated comment from Ben.
        * file-coding.c: Use XD_SIZED_MEMORY_DESCRIPTION in describing
        extra_description, stream_description within struct
        coding_system_methods.
        * gc.c (lispdesc_one_description_line_size):
        Add entries for XD_MEMORY_DESCRIPTION, XD_SIZED_MEMORY_DESCRIPTION.
        Handle XD_BLOCK_DATA_PTR like XD_BLOCK_PTR here.
        * gc.c (kkcc_marking): Ditto.
        * lrecord.h:
        Document XD_BLOCK_DATA_PTR, XD_MEMORY_DESCRIPTION,
        XD_SIZED_MEMORY_DESCRIPTION.
        * lrecord.h (enum memory_description_type):
        Add the enumeration values.
        * lstream.c: Use XD_SIZED_MEMORY_DESCRIPTION to describe
        extra_description within struct lstream_implementation.
        * specifier.c: Use XD_SIZED_MEMORY_DESCRIPTION to describe
        extra_description within struct specifier_methods.

2025-02-13  Aidan Kehoe  <kehoea@parhasard.net>

        Incorporate Stefan Monnier's change of 0683b6fa90db, 2000-03-26,
        which adds a distinct type of circularity checking for non-greedy
        operators.
        This can be optimized away if we know an expression cannot match
        the null string. Use our existing infrastructure for this (which
        had been used at runtime previous to 0b8b6fc94d06). Extend this to
        so we can determine if a duplicate instruction can match the null
        string.

        * regex.c: Update some comments at the opening of this file.
        * regex.c (enum): Add `on_failure_jump_nastyloop'.
        * regex.c (print_partial_compiled_pattern): Print it.
        * regex.c (CHECK_INFINITE_LOOP): Set a local variable indicating th
        * regex.c (enum reg_match_null_info): New. Enumeration documenting
        whether a group can match the null string, or if that is not yet
        known.
        * regex.c (reg_info_t): New. Type used by optimize_on_failure_jump
        for metadata about groups (offset within the pattern, whether they
        can match the null string).
        
        * regex.c (optimize_on_failure_jump): Rename from
        fixup_on_failure_jump_smart. When we encounter start_memory, save
        the offset within the string (don't call group_match_null_string_p
        yet, since that depends on the on_failure_jump_smart handling
        having done its work).
        When on_failure_jump_nastyloop is encountered, call
        group_match_null_string_p() on the groups seen so far, and rewrite
        the expression to on_failure_jump if the expression cannot match
        the null string.
        * regex.c (regex_compile):
        Use on_failure_jump_nastyloop here.
        * regex.c (re_compile_fastmap): Fix some indentation.
        * regex.c (re_search_2):
        * regex.c (re_match_2_internal):
        Implement on_failure_jump_nastyloop, thank you Stefan Monnier.
        * regex.c (expression_match_null_string_p): New.
        * regex.c (group_match_null_string_p): Update to take a reginfo_t
        argument. 
        * regex.c (alt_match_null_string_p): Ditto.
        * regex.c (common_op_match_null_string_p): Ditto. If
        on_failure_jump_loop or on_failure_jump_nastyloop is encountered,
        return true.

2025-02-12  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c:
        * regex.c (print_partial_compiled_pattern):
        Print /succeed for the succeed opcode.  Print accurate
        destinations for succeed_n, jump_n, set_number_at.
        * regex.c (DEBUG_COMPILE_PRINT): New. Analogous to
        DEBUG_MATCH_PRINT(), DEBUG_FAIL_PRINT().
        * regex.c (ENSURE_FAIL_STACK): Call DEBUG_MATCH_PRINT(), not
        DEBUG_PRINT(). 
        * regex.c (PUSH_FAILURE_REG): Ditto.
        * regex.c (POP_FAILURE_REG): Ditto.
        * regex.c (CHECK_INFINITE_LOOP): Ditto.
        * regex.c (PUSH_FAILURE_POINT): Ditto.
        * regex.c (POP_FAILURE_POINT): Ditto.
        * regex.c (fixup_on_failure_jump_smart):
        Call DEBUG_COMPILE_PRINT(), not DEBUG_PRINT().
        * regex.c (regex_compile):
        Clarify the documentation of re_ngroups.
        Use DEBUG_COMPILE_PRINT(), not DEBUG_PRINT().
        Correct some documentation now on_failure_jump_exclusive is used
        for ".*\n".
        * regex.c (mutually_exclusive_p):
        Use DEBUG_COMPILE_PRINT(), not DEBUG_PRINT() here.
        * regex.c (re_match_2_internal):
        Use DEBUG_MATCH_PRINT(), not DEBUG_PRINT() here.
        * regex.h (struct re_pattern_buffer):
        Clarify documentation of the re_ngroups field.

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        * cmds.c:
        Make Qkill_region available here.
        * cmds.c (Fdelete_char):
        Don't call Qkill_forward_chars from this function if KILLP, it has
        never added any value compared to calling Qkill_region directly as
        far back as our version control goes, since it is always supplied
        a fixnum argument.
        * cmds.c (syms_of_cmds):
        Supply a DEFSYMBOL for Qkill_region

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        Add the skip_ascii() optimization to the multibyte coding systems
        if the relevant charsets make that appropriate.
        Also provide a character_tell() method to allow the buffer
        insertion code to work out how many characters were inserted
        without counting them itself.

        * mule-coding.c:
        * mule-coding.c (struct multibyte_coding_stream):
        Store the count of characters seen in the coding stream.
        * mule-coding.c (multibyte_decode):
        Check the precedence array flags for whether we can call
        skip_ascii().
        Call it when appropriate, on the model of the same code in the
        UTF-8 decoder.
        * mule-coding.c (multibyte_character_tell):
        New method.
        * mule-coding.c (coding_system_type_create_mule_coding):
        Declare that multibyte has this method.

        * file-coding.c (print_coding_system):
        In passing, print the coding system's UID as we do for every other
        Lisp object.

2025-01-20  Aidan Kehoe  <kehoea@parhasard.net>

        Now NEWGC is gone, make the precedence_array objects dumpable.
        Use this in mule-coding.c for the multibyte coding systems and
        Big4, shift_jis.

        * lisp.h:
        Declare precedence_array_to_list(), for the sake of
        multibyte_getprop().

        * mule-coding.c (Vshift_jis_precedence, Vbig5_precedence):
        Removed. Store them in the corresponding coding system objects
        instead.

        * mule-coding.c (struct multibyte_coding_system):
        Put the predence array object into the multibyte_coding_stream as
        had always been the intention.
        * mule-coding.c (CODING_SYSTEM_MBCS_CHARSET_PRECEDENCE): New macro.
        * mule-coding.c (XCODING_SYSTEM_MBCS_CHARSET_PRECEDENCE): New macro.

        * mule-coding.c (struct multibyte_coding_stream):
        Remove the precedence array object from the coding stream, as was
        always the intention.
        * mule-coding.c (multibyte_coding_system_description): Update this.
        * mule-coding.c (multibyte_coding_stream_description): Update this.

        * mule-coding.c (multibyte_init_coding_stream):
        Remove generating the precedence_array from this function, done
        once at dump time for the coding system object itself instead.

        * mule-coding.c (multibyte_decode): Fetch the precedence array
        from the right place.
        * mule-coding.c (multibyte_encode): Ditto.
        * mule-coding.c (multibyte_init):
        Allocate the precedence array when initializing the coding
        system.

        * mule-coding.c (multibyte_putprop):
        Use add_charset_to_precedence_array() when Qcharsets was
        specified.

        * mule-coding.c (multibyte_getprop):
        Call precedence_array_to_list() when Qcharsets was specified.

        * mule-coding.c (multibyte_print):
        Print the charset names of the precedence array in this.

        * mule-coding.c (struct shift_jis_coding_system):
        Store the charset precedence in the shift_jis coding system
        object.
        * mule-coding.c (CODING_SYSTEM_SHIFT_JIS_CHARSET_PRECEDENCE): New
        macro.
        * mule-coding.c (XCODING_SYSTEM_SHIFT_JIS_CHARSET_PRECEDENCE): New
        macro.
        * mule-coding.c (shift_jis_encode): Fetch the precedence array
        from the right place.
        * mule-coding.c (shift_jis_init):
        Allocate the precedence array when initializing the coding
        system.

        * mule-coding.c (Fencode_shift_jis_char):
        Fetch the precedence array from the coding system object.

        * mule-coding.c (struct big5_coding_system):
        Store the charset precedence in the big5 coding system
        object.

        * mule-coding.c (CODING_SYSTEM_BIG5_CHARSET_PRECEDENCE): New macro.
        * mule-coding.c (XCODING_SYSTEM_BIG5_CHARSET_PRECEDENCE): New macro.
        * mule-coding.c (big5_encode): Fetch the precedence array
        from the right place.
        * mule-coding.c (big5_init):
        Allocate the precedence array when initializing the coding
        system.

        * mule-coding.c (Fencode_big5_char): Fetch the precedence array
        from the right place.
        * mule-coding.c (coding_system_type_create_mule_coding):
        No need for the finalize method for the multibyte coding systems,
        the precedence array's finalize method will be invoked if needed,
        and it usually won't be needed.
        Declare init methods for shift_jis, big5.
        * mule-coding.c (vars_of_mule_coding):
        Remove declaration for Vshift_jis_precedence, Vbig5_precedence.
        * mule-coding.c (init_mule_coding):
        This is now empty.
        * unicode.c:
        Define the precedence_array as a dumpable lisp object.
        * unicode.c (precedence_array_to_list):
        Make this function non-static.

2025-02-03  Aidan Kehoe  <kehoea@parhasard.net>

        Remove --without-mule as an option given maturity of the Mule
        code and limited development resources to devote to non-Mule bugs
        and features.

        Use unifdef -DMULE for this, which applies fairly cleanly apart
        from in regex.c, where most of the #ifdef MULE code had to be
        changed to #ifdef emacs.
        This changes also removes HAVE_DEFAULT_EOL_DETECTION, only
        relevant for non-MULE.

        * Makefile.in.in:
        * Makefile.in.in (mule_objs):
        * alloc.c:
        * alloc.c (init_string_ascii_end):
        * alloc.c (make_string):
        * alloc.c (disksave_object_finalization):
        * buffer.c:
        * buffer.c (finish_init_buffer):
        * buffer.c (syms_of_buffer):
        * buffer.c (common_init_complex_vars_of_buffer):
        * buffer.h:
        * buffer.h (struct buffer_text):
        * buffer.h (BUF_FORMAT):
        * bufslots.h:
        * charset.h:
        * chartab.c:
        * chartab.c (char_table_hash):
        * chartab.c (char_table_type_to_symbol):
        * chartab.c (symbol_to_char_table_type):
        * chartab.c (char_table_default_for_type):
        * chartab.c (decode_char_table_range):
        * chartab.c (Fchar_table_type_list):
        * chartab.c (Fvalid_char_table_type_p):
        * chartab.c (check_valid_char_table_value):
        * chartab.c (put_char_table_range):
        * chartab.c (map_char_table):
        * chartab.c (syms_of_chartab):
        * chartab.c (complex_vars_of_chartab):
        * chartab.h:
        * chartab.h (CHARTAB_LEVELS):
        * chartab.h (enum char_table_type):
        * chartab.h (CHAR_TABLE_CATEGORY_P):
        * chartab.h (enum chartab_range_type):
        * compiler.h:
        * config.h.in:
        * console-msw-impl.h (struct mswindows_frame):
        * console-msw-impl.h (FRAME_MSWINDOWS_CURSOR_X):
        * console-msw-impl.h (CHECK_MSWINDOWS_FRAME):
        * console-msw.h:
        * console-stream.c (stream_text_width):
        * depend (mule-ccl.o):
        * device-x.c:
        * device-x.c (coding_system_of_xrm_database):
        * device-x.c (x_init_device):
        * device-x.c (syms_of_device_x):
        * device.c (allocate_device):
        * devslots.h (MARKED_SLOT):
        * editfns.c (Ftranslate_region):
        * emacs.c (main_1):
        * emacs.c (main):
        * event-Xt.c (x_keysym_to_character):
        * event-msw.c (mswindows_wnd_proc):
        * events.c (character_to_event):
        * events.h:
        * events.h (struct Lisp_Key_Data):
        * faces.c:
        * faces.c (syms_of_faces):
        * faces.c (complex_vars_of_faces):
        * file-coding.c:
        * file-coding.c (make_coding_system_1):
        * file-coding.c (no_conversion_encode):
        * file-coding.c (complex_vars_of_file_coding):
        * file-coding.h:
        * fileio.c (a_write):
        * fontcolor-gtk.c (console_type_create_fontcolor_gtk):
        * fontcolor-gtk.c (vars_of_fontcolor_gtk):
        * fontcolor-msw.c:
        * fontcolor-msw.c (console_type_create_fontcolor_mswindows):
        * fontcolor-msw.c (reinit_vars_of_fontcolor_mswindows):
        * fontcolor-msw.c (vars_of_fontcolor_mswindows):
        * fontcolor-tty.c:
        * fontcolor-tty.c (tty_initialize_font_instance):
        * fontcolor-tty.c (console_type_create_fontcolor_tty):
        * fontcolor-tty.c (vars_of_fontcolor_tty):
        * fontcolor-x.c (console_type_create_fontcolor_x):
        * fontcolor-x.c (vars_of_fontcolor_x):
        * fontcolor-xlike-inc.c:
        * fontcolor.c:
        * fontcolor.c (font_instantiate):
        * fontcolor.c (specifier_type_create_fontcolor):
        * fontcolor.c (reinit_specifier_type_create_fontcolor):
        * frame-x.c (x_set_frame_text_value):
        * insdel.c (GAP_CAN_HOLD_SIZE_P):
        * insdel.c (buffer_insert_string_1):
        * insdel.c (buffer_delete_range):
        * insdel.c (buffer_replace_char):
        * insdel.c (init_buffer_text):
        * intl-win32.c:
        * intl-win32.c (lcid_to_locale_mule_or_no):
        * intl-win32.c (determine_code_page):
        * intl-win32.c (mswindows_multibyte_to_unicode_putprop):
        * intl-win32.c (syms_of_intl_win32):
        * intl-win32.c (vars_of_intl_win32):
        * intl-win32.c (complex_vars_of_intl_win32):
        * intl-win32.c (init_intl_win32):
        * intl-x.c:
        * intl-x.c (init_x_locale):
        * intl.c (vars_of_intl):
        * keymap.c (Ftext_char_description):
        * lisp.h:
        * lstream.h:
        * make-src-depend (PrintPatternDeps):
        * redisplay-msw.c (mswindows_output_cursor):
        * redisplay-msw.c (mswindows_output_display_block):
        * redisplay-x.c:
        * redisplay-x.c (separate_textual_runs_xft_mule):
        * redisplay-x.c (separate_textual_runs):
        * redisplay-xlike-inc.c:
        * redisplay-xlike-inc.c (XLIKE_output_display_block):
        * regex.c:
        * regex.c (enum):
        * regex.c (print_partial_compiled_pattern):
        * regex.c (re_error_msgid):
        * regex.c (re_wctype_to_bit):
        * regex.c (regex_compile):
        * regex.c (compile_char_class):
        * regex.c (re_compile_fastmap):
        * regex.c (re_search_2):
        * regex.c (re_match_2_internal):
        * regex.h (RE_LISP_CONTEXT_ARGS):
        * regex.h (enum):
        * search.c:
        * search.c (byte_scan_buffer):
        * search.c (byte_find_next_ichar_in_string):
        * search.c (trivial_regexp_p):
        * search.c (search_buffer):
        * search.c (boyer_moore):
        * select-x.c (hack_motif_clipboard_selection):
        * select-x.c (Fx_store_cutbuffer_internal):
        * select-xlike-inc.c (lisp_data_to_selection_data):
        * select.c (Fown_selection_internal):
        * select.c (Fget_selection_internal):
        * specifier.c (specifier_instance_from_inst_list):
        * syntax.c:
        * syntax.c (scan_words):
        * syntax.h:
        * sysdep.c (qxe_readdir):
        * sysdep.c (qxe_closedir):
        * tests.c (Ftest_data_format_conversion):
        * tests.c (DFC_CHECK_DATA_COND_MULE):
        * text.c:
        * text.c (round_up_to_valid_ichar):
        * text.c (round_down_to_valid_ichar):
        * text.c (copy_text_between_formats):
        * text.c (dfc_convert_to_external_format):
        * text.c (dfc_convert_to_internal_format):
        * text.c (internal_to_external_charset_codepoint):
        * text.c (get_external_charset_codepoint):
        * text.c (reinit_vars_of_text):
        * text.c (vars_of_text):
        * text.h:
        * unicode.c:
        * unicode.c (unicode_encode):
        * unicode.c (syms_of_unicode):
        * unicode.c (complex_vars_of_unicode):
        * unicode.c (init_unicode):
        * unicode.h:
        * win32.c (mswindows_lisp_error_1):
        * xemacs.def.in.in:

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * fileio.c (Fwrite_region_internal):
        Increase the buffer size within this function, speeding up
        autosave of large files significantly in my testing.
        * fileio.c (Fdo_auto_save):
        GCPRO around calling auto save handlers in a more idiomatic way,
        that also avoids issues with Lisp code from echo_area_message().

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c:
        Make obarray larger by default given that its htentries will leak
        on resizing after pdump_load().
        * symbols.c:
        OBARRAY_SIZE hasn't be used in this file since 2016, remove it.

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * symbols.c (value_slot_past_magic):
        Fix a very old bug in this function, don't check whether
        *store_pointer is SYMBOL_VALUE_LISP_MAGIC_P() and then access the
        SHADOWED field of SYM, which cannot be SYMBOL_VALUE_LISP_MAGIC_P,
        since we know it is a symbol, a distinct type.

2025-02-02  Aidan Kehoe  <kehoea@parhasard.net>

        * cmds.c (Fself_insert_internal): Removed. Moved to cmdloop.el.
        * cmds.c (syms_of_cmds):
        Remove its DEFSUBR().

2025-02-01  Aidan Kehoe  <kehoea@parhasard.net>

        Suppress some warnings provoked in emacs.c, 64-bit native
        Windows.

        * emacs.c:
        * emacs.c (make_argc_argv):
        Correct the type of ARGV in this, Extbyte *** rather than Wexttext
        ***, it is not used in Windows so the T string ambiguity never
        arose.
        Check the length of the list fits in a C int before
        casting. Adjust types in the body of the function.
        * emacs.c (free_argc_argv):
        Correct the type of ARGV in this.
        * emacs.c (argmatch):
        Modernise the declaration of this. Take MINLEN as a Charcount as
        works best with the body of the function.
        * emacs.c (SHEBANG_PROGNAME_LENGTH):
        No longer cast this to int, since we are comparing it to the
        result of wext_strlen(), a size_t.
        * emacs.c (main_1):
        When converting the windows termination handle to a HANDLE, use
        strotoll if we're running on 64-bit Windows.
        * emacs.c (Fkill_emacs):
        Cast XFIXNUM (arg) to int for standards compliance with C.
        * lisp.h:
        Update declaration of make_argc_argv(), free_argc_argv().
        * text.h (wext_strtoll):
        New #define.

2025-02-01  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h:
        * number.h (DEFINE_C_INTEGER_TYPE_LISP_CONVERSION):
        Suppress a couple of warnings provoked in headers, 64-bit native
        Windows.

2025-01-27  Aidan Kehoe  <kehoea@parhasard.net>

        * s/windowsnt.h:
        If we have Visual Studio 2015 or newer, #define HAVE_SNPRINTF and
        HAVE_VSNPRINTF as is appropriate.

2025-01-23  Aidan Kehoe  <kehoea@parhasard.net>

        Rename various C variables that reflect Fixnums from Vfoo_bar_baz
        to foo_bar_baz. I had introduced them all and it was misleading,
        suggesting that they were Lisp objects.

        * alloc.c:
        * alloc.c (vars_of_alloc):
        * bytecode.c (UNUSED):
        * data.c:
        * data.c (vars_of_data):
        * eval.c:
        * eval.c (bind_multiple_value_limits):
        * eval.c (Fmultiple_value_call):
        * event-Xt.c:
        * event-Xt.c (x_event_to_emacs_event):
        * event-Xt.c (vars_of_event_Xt):
        * gc.c:
        * lisp.h:
        * text.c:
        * text.c (vars_of_text):

2025-01-23  Aidan Kehoe  <kehoea@parhasard.net>

        Declare all those C variables for which DEFVAR_BOOL() or
        DEFVAR_CONST_BOOL() are used, as type Boolint. Generally a good
        idea, and done in preparation for further changes.

        * gc.c:
        * gc.c (vars_of_gc):
        Remove a duplicate DEFVAR_BOOL() for purify_flag, already done in
        alloc.c. 

        * alloc.c:
        * alloc.c (vars_of_alloc):
        Remove some incorrect information regarding purify_flag.
        
        * abbrev.c:
        * buffer.c:
        * bytecode.c:
        * bytecode.c (meter_code):
        * console-x.c:
        * console-x.c (x_initially_selected_for_input):
        * data.c:
        * data.c (eq_with_ebola_notice):
        * dired-msw.c:
        * editfns.c:
        * emacs.c:
        * emodules.c:
        * eval.c:
        * event-Xt.c:
        * event-gtk.c:
        * event-msw.c:
        * event-stream.c:
        * extents.c:
        * file-coding.c:
        * fileio.c:
        * filelock.c:
        * fontcolor-x.c:
        * frame.c:
        * glyphs.c:
        * lread.c:
        * menubar.c:
        * minibuf.c:
        * process.c:
        * redisplay.c:
        * redisplay.c (WINDOW_SCROLLED):
        * select-x.c:
        * symbols.c:
        * syntax.c:
        * window.c:
        Update declarations as above.

2025-01-20  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (main_1):
        Consolidate a couple of blocks to be called after successful
        pdump_load() for clarity.

2025-01-20  Aidan Kehoe  <kehoea@parhasard.net>

        Remove init_alloc_early(), which was basically empty.
        Move the error-checking code that was in it to
        common_init_alloc_early().
        Delegate much of what was in common_init_alloc_early() to the C
        implementation.
        * alloc.c:
        * alloc.c (Error_Behavior ERROR_ME, ERROR_ME_NOT, ERROR_ME_WARN,
        ERROR_ME_DEBUG_WARN): Initialize these statically.
        * alloc.c (init_alloc_early): Removed.
        * alloc.c (common_init_alloc_early):
        Remove initialization of various integers to zero, done by the C
        implementation anyway.
        staticpros_nodump is going to be zero at the point this is called,
        no need to check.
        * emacs.c (main_1):
        No longer call init_alloc_early().
        * symsinit.h:
        Remove its declaration.

2025-01-20  Aidan Kehoe  <kehoea@parhasard.net>

        init_eistring_once_early(), reinit_eistring_once_early() can be
        delegated to the C implementation, do that.
        * emacs.c (main_1):
        Don't call init_eistring_once_early() or reinit_eistring_early()
        in this function.
        Merge two blocks that are guarded by if (!initialized) for
        clarity.
        * symsinit.h:
        Remove the declarations of init_eistring_once_early(),
        reinit_eistring_once_early().
        * text.c (Eistring the_eistring_malloc_zero_init): Give this a
        static initialization with mallocp_ equal to one.
        Trust the C implementation to initialize the_eistring_zero_init to
        all zeroes.
        * text.c (reinit_eistring_early): Removed.
        * text.c (init_eistring_once_early): Removed.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Remove reinit_opaque_early(); all it does is creates a free list
        of Lisp_Opaque_Ptrs, something alloc.c will do automatically
        anyway.

        * emacs.c (main_1):
        Remove call to reinit_opaque_early() from here.
        * opaque.c:
        * opaque.c (make_opaque_ptr):
        Allocate the opaque_ptr using ALLOC_NORMAL_LISP_OBJECT(), which
        ultimately calls alloc_managed_lcrecord on a free list created on
        the fly anyway.
        * opaque.c (free_opaque_ptr):
        Call free_normal_lisp_object() here, which ultimately calls
        free_managed_lcrecord() anyway.
        * symsinit.h:
        Remove the declaration for reinit_opaque_early().

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Move the call to fatal() when a window system was specified that
        we don't support, to check_compatibile_window_system().
        * emacs.c (check_compatible_window_system):
        Check MUST against an array of supported window systems, die if it
        is not encountered.
        * emacs.c (main_1):
        Remove separate explicit calls to fatal() from main_1().

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Remove a couple of guards around catching signals that are irrelevant
        with PDUMP and are likely to cause problems with
        #'run-emacs-from-temacs.
        * data.c (init_data_very_early):
        * signal.c (init_signals_very_early):

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Move compute_memusage_stats_length() to
        disksave_object_finalization() from reinit_vars_of_alloc(), since
        it can be done at dump time once all the object types have been
        initialized.
        This means that reinit_vars_of_alloc() is now empty, remove it.
        Allocate lrecord_stats_metadata on the heap, dump it using
        dump_add_root_block_ptr(), so at pdump_load() it's just a pointer
        being set rather than copying the block to BSS.

        * alloc.c (disksave_object_finalization):
        Call compute_memusage_stats_length() here.
        * alloc.c (reinit_vars_of_alloc): Removed.
        * alloc.c (init_alloc_once_early): Add lrecord_stats_metadata to
        the dump file #ifdef MEMORY_USAGE_STATS.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Move the Lstream_implementation object to the dump file, avoiding
        the need to explicitly re-initialize their methods post
        pdump_load ().

        * emacs.c (main_1):
        Remove creation of the lstream types from this block that dealt
        with post-pdump_load() call. Now the block is empty, remove it
        entirely.

        * event-msw.c (init_slurp_stream): Removed.
        * event-msw.c (init_shove_stream): Removed.
        * event-msw.c (init_winsock_stream): Removed.   
        * event-msw.c (vars_of_event_mswindows):
        Move DEFINE_LSTREAM_IMPLEMENTATION() for the various
        mswindows-specific lstream types to this function. Move the
        LSTREAM_HAS_METHOD() calls here too.

        * file-coding.c (lstream_type_create_file_coding): Removed.
        * file-coding.c (vars_of_file_coding):
        Move DEFINE_LSTREAM_IMPLEMENTATION() for the coding lstream to
        this function. Move the LSTREAM_HAS_METHOD() calls here too.

        * lstream.c:
        * lstream.c (lstream_type_create): Removed.
        * lstream.c (vars_of_lstream):
        Move DEFINE_LSTREAM_IMPLEMENTATION() for the various other lstream
        types to this function. Move the LSTREAM_HAS_METHOD() calls here
        too.

        * lstream.h:
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
        Revise this to xnew_and_zero() the Lstream implementation (rather
        than having it in the C data segment), and to make it known to the
        dump file.

        * lstream.h (DECLARE_LSTREAM): Declare an Lstream as a pointer
        rather than an array.
        Make lstream_implementation_description available to
        file-coding.c, event-msw.c.
        * symsinit.h:
        Remove declarations for functions to initialize the lstreams post
        pdump_load(), no longer needed.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (main_1):
        the_structure_type_dynarr in lread.c is dumped, there is no value
        to reiniting the structure types after pdump_load(), avoid this.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        There's no actual need for the various init_gc_* functions, remove
        them.

        * emacs.c (main_1):
        Remove calls to init_gc_early (), init_gc_once_early(),
        reinit_gc_early(), not needed.
        Examine GC_CONS_THRESHOLD rather than ALWAYS_GC if ERROR_CHECK_GC
        and deciding whether to GC after calling the complex_vars_of()
        functions.

        * gc.c (int always_gc): Removed.
        Remove ALWAYS_GC, equivalent to setting gc-cons-threshold to -1,
        not visible to Lisp.
        * gc.c (recompute_need_to_garbage_collect):
        No longer check it in this function.
        * gc.c (show_gc_cursor_and_message): Update a comment now
        always_gc is gone.
        * gc.c (common_init_gc_early): Removed.
        This did various things that are better done by the portable
        dumper and by the C implementation.
        * gc.c (vars_of_gc): Trust the portable dumper to preserve
        gc_cons_percentage, gc_cons_threshold, Vgc_message.
        * gc.h:
        Remove the declarations for the various init_gc functions.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need to call init_lcrecord_lists after pdump_load(),
        just set a pointer into the dumped data instead, simplifying
        startup a little. Remove the initialization of
        lrecord_implementations_tablet to all zeroes, trust the C
        implementation to do that.

        * alloc.c (Vall_lcrecord_lists): New variable, a Lisp vector whose
        storage is to be used post pdump_load() for all_lcrecord_lists.
        * alloc.c (init_lcrecord_lists): Removed.
        * alloc.c (reinit_alloc_early):
        Just set all_lcrecord_lists to the vector data of
        Vall_lcrecord_lists, which is already garbage protected. Don't
        call init_lcrecord_lists().
        * alloc.c (init_alloc_once_early):
        During loadup initialize all_lcrecord_lists using xnew_array, move
        the former body of init_lcrecord_lists into this function.
        Initialize and staticpro() Vall_lcrecord_lists once vector objects
        are available.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        * lstream.h (DECLARE_STACK_FIXED_BUFFER_LSTREAM):
        When declaring the Lisp_Object, initialize it to Qunbound,
        suppressing a compiler warning about a pointer to uninitialized
        data and provoking a more predictable error if we attempt to write
        to the stream before it's initialized.

        * lstream.h (INIT_STACK_FIXED_BUFFER_OUTPUT_STREAM):
        Do the initialization of the Lisp_Object to the stack lstream here.

2025-01-22  Aidan Kehoe  <kehoea@parhasard.net>

        Quiet various warnings when compiling on OpenBSD. Use snprintf()
        instead of sprintf() if available.
        Avoid strcpy(), strcat() since they don't do bounds checking, use
        emacs_printf_ascbyte instead.

        * alloc.c (pluralize_word):
        Be more careful about bounds checking in this function. Return the
        new length of the pluralized word.
        * alloc.c (pluralize_and_append):
        Use emacs_snprintf_ascbyte() instead of strcpy(), strcat(). Take
        BUFSIZE as an argument.
        * alloc.c (object_memory_usage_stats):
        Pass the buffer size to pluralize_and_append().
        * emacs.c:
        * emacs.c (assert_equal_failed):
        Use snprintf() if available. Inappropriate to use emacs_snprintf()
        when things are in an inconsistent state with XEmacs crashing.
        * event-Xt.c (x_reset_modifier_mapping):
        Document why I don't plan to remove a call to XKeycodeToKeysym().

2025-01-21  Aidan Kehoe  <kehoea@parhasard.net>

        Avoid calling various functions that require a working redisplay
        when the current window is on a stream device. Thank you for the
        bug report, Ulrich Müller.

        * window.h: Declare redisplayable_window_p() here.
        * indent.c (vmotion): Use it, don't attempt to scroll if redisplay
        infrastructure not available.
        * indent.c (vertical_motion_1): Use it, ditto.

        * window.c:
        * window.c (redisplayable_window_p): New. 
        * window.c (Fpos_visible_in_window_p):
        Return Qnil early if this is a window on a stream device.
        * window.c (Fwindow_end):
        Just return w->end_pos if WINDOW is on a stream device.
        * window.c (Fdelete_other_windows):
        Don't attempt to scroll if WINDOW is on a stream device.
        * window.c (window_scroll): Ditto.
        * window.c (Fcenter_to_window_line):
        Ditto.
        * window.c (get_current_pixel_pos):
        Return 0 if this window does not have an associated display
        buffer, rather than crashing.
        * window.c (Fcurrent_pixel_column): Call decode_window()
        appropriately in here.
        * window.c (Fcurrent_pixel_row): Ditto.

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Move OBJECT_HAS_METHOD() calls to immediately follow
        INIT_LISP_OBJECT(), for clarity and to improve simplicity of
        startup (since many of the reinit_*_early() and *_objects_create()
        functions are no longer needed).

        * alloc.c (reinit_alloc_objects_early): Removed. Calls moved to
        init_alloc_once_early().
        * alloc.c (init_alloc_once_early):
        Call OBJECT_HAS_METHOD in this function
        * buffer.c (buffer_objects_create): Removed.
        * buffer.c (syms_of_buffer): Move its contents to this function,
        beside INIT_LISP_OBJECT().

        * bytecode.c (bytecode_objects_create): Removed.
        * bytecode.c (syms_of_bytecode): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * casetab.c (casetab_objects_create): Removed.
        * casetab.c (syms_of_casetab): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * chartab.c (chartab_objects_create): Removed.
        * chartab.c (syms_of_chartab): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * elhash.c:
        * elhash.c (hash_table_objects_create): Removed.
        * elhash.c (init_elhash_once_early): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * emacs.c (main_1):
        Remove calls to functions that are now no longer needed.

        * extents.c (extents_objects_create): Removed.
        * extents.c (syms_of_extents): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * faces.c (faces_objects_create): Removed.
        * faces.c (syms_of_faces): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * frame.c (frame_objects_create): Removed.
        * frame.c (init_frame): Correct some style here in passing.
        * frame.c (syms_of_frame): Move the contents of
        frame_object_create() to this function, beside INIT_LISP_OBJECT().

        * glyphs.c (glyphs_objects_create): Removed.
        * glyphs.c (syms_of_glyphs): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * lstream.c (lstream_objects_create): Removed.
        * lstream.c (syms_of_lstream): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * mule-charset.c (mule_charset_objects_create): Removed.
        * mule-charset.c (syms_of_mule_charset): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * process.c (reinit_process_early): Removed.
        * process.c (syms_of_process): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * rangetab.c:
        * rangetab.c (rangetab_objects_create): Removed.
        * rangetab.c (syms_of_rangetab): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * scrollbar.c (scrollbar_objects_create): Removed.
        * scrollbar.c (syms_of_scrollbar): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * specifier.c (specifier_objects_create): Removed.
        * specifier.c (syms_of_specifier): Move its contents to this
        function, beside INIT_LISP_OBJECT().

        * symbols.c: Remove the OBARRAY_SIZE #define in passing, no longer
        used in this file.
        * symbols.c (reinit_symbol_objects_early): Removed.
        * symbols.c (init_symbols_once_early): Move its contents to this
        function, beside INIT_LISP_OBJECT().
        * symsinit.h:
        Remove declarations for all the *_object_create() functions, no
        longer needed.

        * ui-gtk.c (ui_gtk_objects_create): Removed.
        * ui-gtk.c (syms_of_ui_gtk): Move its contents to this
        function, beside INIT_LISP_OBJECT().
        * window.c (window_objects_create): Removed.
        * window.c (syms_of_window): Move its contents to this
        function, beside INIT_LISP_OBJECT().

2025-01-19  Aidan Kehoe  <kehoea@parhasard.net>

        Initialize the event stream objects using C macros, for symmetry,
        consistency with the specifier objects.

        * events.h:
        * events.h (struct event_stream):
        Rename the event_pending_p field of this to event_pending_p_cb,
        for symmetry with all the other fields.

        * events.h (DEFINE_EVENT_STREAM): New macro.
        Allocate an event stream object with xnew_and_zero(), and make the
        portable dumper aware of it.
        
        * events.h (EVENT_STREAM_HAS_METHOD): New macro, initialize a
        given method for an event stream.

        * events.h (HAS_EVENT_STREAM_METHOD_P): New macro, return non-zero
        if an event stream has a given method.

        * gpmevent.c (hook_event_callbacks_once):
        Adjust this given the new name for event_pending_p().

        * gpmevent.c (vars_of_gpmevent):
        Fix this in passing, staticpro() already does
        dump_add_root_lisp_object(), no need to do that explicitly.

        * event-Xt.c:
        * event-Xt.c (vars_of_event_Xt):
        Use the macros to initialize the event stream.

        * event-gtk.c:
        * event-gtk.c (vars_of_event_gtk):
        Use the macros to initialize the event stream.

        * event-msw.c:
        * event-msw.c (vars_of_event_mswindows):
        Use the macros to initialize the event stream.

        * event-stream.c:
        Adjust event_stream_description_1 to reflect the new name for the
        event_pending_p method.

        * event-stream.c (event_stream_event_pending_p):
        Adjust this function to reflect the new name for the
        event_pending_p method.

        * event-stream.c (event_stream_force_event_pending):
        Use HAVE_EVENT_STREAM_METHOD_P in this.

        * event-stream.c (event_stream_drain_queue):
        Ditto.
        * event-stream.c (Faccept_process_output):
        Update a comment here.

        * event-tty.c:
        * event-tty.c (vars_of_event_tty):
        Use the macros to initialize the event stream.

2025-01-18  Aidan Kehoe  <kehoea@parhasard.net>

        * device-gtk.c (gtk_init_device):
        Add a comment regarding a deprecated function which should stay.
        * device-gtk.c (Fgtk_keysym_on_keyboard_p):
        Use decode_gtk_device() rather than re-implementing it.
        * device-gtk.c (Fgtk_style_info):
        Ditto.
        * menubar-gtk.c:
        * menubar-gtk.c (menu_name_to_accelerator):
        Revise this to take a Lisp string, to respect our internal
        encoding, and to use our case infrastructure.
        * menubar-gtk.c (menu_convert):
        Move a statement after the declarations.
        * menubar-gtk.c (menu_descriptor_to_widget_1):
        Call menu_name_to_accelerator with its new calling convention.
        * menubar-gtk.c (menu_create_menubar):
        Don't call gtk_widget_set_name() on ITEM before checking ITEM is
        non-NULL
        * toolbar-gtk.c (init_gtk_toolbar_stock_icons):
        Call make_lisp_hash_table() explicitly rather than call0 (intern
        ("make-hash-table")).

2025-01-18  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        Move the declarations for Qzero, Qone, Qnull_pointer to this file
        (on union builds).
        * alloc.c (common_init_alloc_early):
        Move there initialization from here to init_alloc_once_early().
        * alloc.c (init_alloc_once_early):
        Initialize Qzero, Qone here, make them known to the portable dumper.
        * symbols.c:
        Move the declarations for Qzero, Qone, Qnull_pointer from this
        file, they're used far earlier in alloc.c, and they're not symbols
        in any event.

2025-01-18  Aidan Kehoe  <kehoea@parhasard.net>

        Move the event_stream and process_methods structures to the dump
        file, no need to explicitly initialize them post pdump-load.
        Similarly for filedesc_with_input, event-Xt.c.
        Declare filedesc_to_what_closure as an array in BSS, trust that
        C will initialize it to all zeroes.

        * event-Xt.c:
        * event-Xt.c (init_what_input_once) Removed. Leave this to the
        portable dumper and to the C implementation.
        * event-Xt.c (mark_what_as_being_ready):
        Access Vfiledesc_with_input as a Lisp vector.
        * event-Xt.c (unselect_filedesc): Ditto. 
        * event-Xt.c (Xt_process_to_emacs_event): Ditto.
        * event-Xt.c (Xt_tty_to_emacs_event): Ditto.
        * event-Xt.c (reinit_vars_of_event_Xt):
        Move creation of the struct event_stream to vars_of_event_Xt(),
        trust pdump_load() to restore it.

        * event-Xt.c (vars_of_event_Xt):
        Initialize Vfiledesc_with_input as a Lisp vector. Make it
        reachable for GC pre-dump, but unreachable for GC after
        pdump_load(), since it is usually 1024 in length and full of
        either Qnil or process objects that are reachable from
        Vprocess_list.
        Trust the C runtime to initialize filedesc_to_what_closure[] to all
        zeroes.

        * event-gtk.c:
        * event-gtk.c (mark_what_as_being_ready):
        * event-gtk.c (unselect_filedesc):
        * event-gtk.c (gtk_process_to_emacs_event):
        * event-gtk.c (gtk_tty_to_emacs_event):
        * event-gtk.c (reinit_vars_of_event_gtk):
        * event-gtk.c (vars_of_event_gtk):
        Exactly the same changes as for event-Xt.c, basically identical code.

        * event-msw.c (reinit_vars_of_event_mswindows):
        Move initializing the event stream object to
        vars_of_event_mswindows. Trust the C runtime to initialize
        mswindows_pending_timers_count, dde_eval_pending to 0, since
        they're in BSS.

        * event-msw.c (vars_of_event_mswindows):
        Initialize the event stream object here. Dump it, let pdump_load()
        restore it in the normal way.

        * event-stream.c:
        * event-stream.c (const struct sized_memory_description
        event_stream_description): New. Describe a struct event_stream for
        the sake of the portable dumper. Used by event-Xt.c, event-msw.c,
        event-tty.c.

        * event-tty.c:
        * event-tty.c (reinit_vars_of_event_tty): Make this empty.
        * event-tty.c (vars_of_event_tty):
        Initialize the event stream object here. Dump it, let pdump_load()
        restore it in the normal way.

        * events.h: Declare event_stream_description.

        * process-nt.c (process_type_create_nt): Remove this, move it into
        vars_of_process_nt().
        * process-nt.c (vars_of_process_nt): Initialize the process
        methods in this function.
        * process-unix.c:
        * process-nt.c (process_type_create_unix): Remove this, move it into
        vars_of_process_unix().
        * process-unix.c (vars_of_process_unix):
        Initialize the process methods in this function.
        * process.c (static const struct memory_description
        process_methods_description): New.
        * process.c (vars_of_process): Tell the portable dumper about the
        process methods, don't restore them explicitly.

2025-01-16  Aidan Kehoe  <kehoea@parhasard.net>

        Rearrange main_1() to avoid the need to save and restore values
        before and after loading the dump file.
        * emacs.c:
        Remove a comment cautioning about this issue.
        * emacs.c (main_1):
        Remove some SCO-specific code that has long been #ifdefed out.
        Handle the -mswindows-termination-handle command line argument
        first, since it's needed for debugging and it's not visible to
        Lisp.
        Next handle -nd (needed to decide on whether to load the dump
        file) and -sd (which immediately exits).
        Then load the dump file. Only after that, process the remaining
        command line arguments, overriding the restored Lisp-visible
        variables as appropriate.
        * emacs.c (standard_args):
        Remove -nuni from this, which option has been obsolete since Win95
        support was removed.
        Re-order the structure to reflect changed order of processing in
        main_1().
        * emacs.c (main):
        Correct a comment here.

2025-01-27  Aidan Kehoe  <kehoea@parhasard.net>

        * syswindows.h:
        Remove declarations for functions provided in ntheap.c, which had
        been used for unexec on that platform.
        * vm-limit.c:
        Don't attempt to provide malloc warnings if on win32_native, given
        we no longer provide gmalloc.o so this won't work, and we have
        removed the functions that give information on the data limits.
        * vm-limit.c (check_memory_limits):
        Remove long obsolete code that checks if pointers exceed the size
        available to Lisp for pointers, which never happens with the
        current implementation.

        * s/cygwin-common.h:
        Remove #defines for TEXT_START and HEAP_IN_DATA.

        * s/gnu.h:
        Remove #define for UNEXEC, no longer needed.
        * s/linux.h:
        Ditto. Remove #define for UNEXEC_USE_MAP_PRIVATE, no longer
        needed.
        Remove #defines for A_TEXT_OFFSET, A_TEXT_SEEK,
        ADJUST_EXEC_HEADER. Remove #define for SYSTEM_MALLOC, now
        obligatory.
        * s/mingw32.h:
        Remove #defines for TEXT_START, HEAP_IN_DATA, UNEXEC, no longer
        needed.
        * s/mingw32.h (OBJECTS_SYSTEM): Remove ntheap.o from this.
        * s/netbsd.h:
        Remove #defines for UNEXEC, HAVE_TEXT_START, A_TEXT_OFFSET,
        A_TEXT_SEEK from this file, no longer needed.
        * s/sol2.h: Remove #define for UNEXEC from this file, no longer
        needed.
        * s/usg5-4.h:
        Remove #define for ADDR_CORRECT from this file, no longer needed.

        * mem-limits.h:
        * mem-limits.h (get_lim_data): Remove the implementation of this
        for WIN32_NATIVE, no longer relevant.
        * nt.c (init_mswindows_environment):
        Remove a call to cache_system_info(), no longer needed now unexec
        is gone.
        * ntheap.c: Remove this file, which implemented unexec on
        WIN32_NATIVE. 

        * m/alpha.h (DATA_START):
        Remove #defines for TEXT_START, HEAP_IN_DATA, no longer needed.
        * m/arm.h:
        Remove #defines for TEXT_START, DATA_START, NO_REMAP, no longer
        needed.
        * m/hp800.h:
        Remove #defines for TEXT_START, DATA_START, NO_REMAP, UNEXEC, no
        longer needed.

        * m/ibmrs6000.h:
        Remove #defines for A_TEXT_OFFSET, ADDR_CORRECT, TEXT_START,
        DATA_START, UNEXEC, no longer needed.

        * m/intel386.h:
        Remove #defines for TEXT_START, NO_REMAP, no longer needed.
        
        * m/m68k.h:
        Remove #defines for TEXT_START, NO_REMAP, no longer needed.

        * m/mips.h:
        Remove #defines for TEXT_START, DATA_START, NO_REMAP, no longer needed.
        * m/powerpc.h:
        Remove #defines for NO_REMAP, ADDR_CORRECT and a couple more, no
        longer needed in absence of unexec.
        * m/sparc.h:
        Remove #defines for A_TEXT_OFFSET, A_TEXT_SEEK, no longer needed.
        * m/template.h (LOAD_AVE_CVT):
        * m/windowsnt.h:
        Remove #define for DATA_START, no longer needed.
        * Makefile.in.in ($(DUMP_TARGET)): Remove some code bracketed in
        #ifdef HEAP_IN_DATA, no longer needed with removal of unexec.
        * config.h.in:
        Remove the #define for SYSTEM_MALLOC, always on so not needed.
        Update comment regarding HAVE_MALLOC_WARNING, the glibc feature
        this relied on has been removed.
        * depend (ntheap.o): Remove entry for this.
        * emacs.c: Remove mention of ntheap.c

2025-01-24  Aidan Kehoe  <kehoea@parhasard.net>

        * redisplay.c:
        Declare force_valid_bytebpos_or_zero() before defining it in this
        file, suppress a warning.
        This should be used minimally (only other use is in scrollbar.c),
        intentionally not declared in a header.

2025-01-24  Aidan Kehoe  <kehoea@parhasard.net>

        Qnull_pointer breaks in the initialization of struct Lisp_Subr on
        Cygwin union builds, "initializer element is not constant." This
        is not rectified by declaring Qnull_pointer as const.
        Move DOC to the end of struct Lisp_Subr, just omit it in the DEFUN
        macro, which gives the same result (defined to be bitwise zero).

        This breaks binary compatibility with modules; however
        fb35ba719d24 of October did this recently anyway, and I plan
        further module bug fixes which should require bumping the module
        version number shortly. * lisp.h (struct Lisp_Subr): Rearrange
        this.

        Thank you for the bug report, Caj Svensson.

        * lisp.h DEFUN): Omit explicit initialization of Qnull_pointer.
        * lisp.h (DEFUN_NORETURN): Ditto.

2025-01-13  Aidan Kehoe  <kehoea@parhasard.net>

        * callint.c:
        * callint.c (Finteractive): Document limitations with string
        (interactive) specifications when writing code compatible with GNU
        Emacs.
        * callint.c (callint_prompt):
        Fix my bug in this, supply Qstring to the Fformat_into()
        call. Transform markers to integers as was previously done.
        * callint.c (Fcall_interactively):
        Clean up some cases within this, removed unneeded local variables
        for clarity.

2025-01-12  Aidan Kehoe  <kehoea@parhasard.net>

        * eval.c: (trace_out_and_die): Removed.
        * eval.c (signal_call_debugger):
        No longer call trace_out_and_die() on noninteractive debug builds,
        allow Lisp to override the debugger for the sake of testing.

2025-01-06  Aidan Kehoe  <kehoea@parhasard.net>

        * insdel.c (signal_before_change):
        * insdel.c (signal_after_change):
        Remove examination of before-change-function,
        after-change-function from these functions, only respect
        before-change-functions, after-change-functions, now we have
        symbol-value handlers in obsolete.el to make this possible.

2025-01-06  Aidan Kehoe  <kehoea@parhasard.net>

        Debug resize_string (), make its behaviour more uniform.
        * alloc.c:
        * alloc.c (resize_string):
        Define a couple of macros to make sure the string copying
        behaviour is the same for the various sizes encountered. Avoid
        corrupting the heap if shrinking a non-big string.
        * sequence.c (Fclear_string):
        Pass POS as -1 to resize_string here, since we are overwriting the
        whole thing.
        * sequence.c (concatenate): Adjust a comment here regarding
        resize_string().

2024-12-31  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h:
        * process.c:
        * process.c (syms_of_process):
        * tls.c:
        * tls.c (syms_of_tls):
        Make Qtls_error available and non-zero on non-TLS builds, given
        that we use this symbol in signalling an error when TLS support is
        unavailable.

2024-12-30  Aidan Kehoe  <kehoea@parhasard.net>

        * incbin.h:
        Specifying the type of the dumped data doesn't work with COFF
        output currently. This was already implemented for mingw,
        implement it for Cygwin too.

2024-12-27  Aidan Kehoe  <kehoea@parhasard.net>

        * abbrev.c (abbrev_obarray_has_blank_p):
        Modernise return type. Check OBARRAY is a hash table before
        calling oblookup() on it, avoid a (rare) crash. Thank you Henry
        S. Thompson.
        * abbrev.c (abbrev_match):
        Check TABLE is a hash table before calling elisp_maphash() on it.
        * abbrev.c (MATCHFUN):
        Check abbrev-start-location non-nil before calling
        abbrev_obarray_has_blank_p() in this macro.

2024-12-25  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_load):
        Avoid infinite loop when examining $PATH to find the XEmacs
        binary, --without-dump-in-exec.

2025-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (extract_object_file_name):
        Revise this, no need for NAME_NONRELOC, NAME_RELOC as arguments,
        take DOC_POS as an OFF_T.
        * doc.c (unparesseuxify_doc_string):
        Revise this, POSITION needs to be an OFF_T.
        * doc.c (open_doc_file): New. Open a documentation file (either
        Vinternal_doc_file_name or one specified in FILEPOS), and return
        the associated file descriptor. Refactored from get_doc_string(),
        get_object_file_name(), adjusted to prefer DOC-DUMP-ID over pure
        DOC if looking in doc-directory.
        If we added DUMP_ID to the file name successfully, update
        Vinternal_doc_file_name to reflect this.
        * doc.c (get_doc_string): Use open_doc_file ().
        * doc.c (get_object_file_name): Use open_doc_file ().
        * doc.c (Fbuilt_in_symbol_file):
        No need to fret about the sign of DOC_OFFSET,
        get_object_file_name() now does that for us.
        * lisp.h:
        Update the declaration of unparesseuxify_doc_string() here. 
        * lread.c (pas_de_holgazan_ici):
        Adjust types, call to unparesseuxify_doc_string() here.

2025-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        * number.h (DEFINE_C_INTEGER_TYPE_LISP_CONVERSION):
        Correct a misspelling in this macro.

2024-12-24  Aidan Kehoe  <kehoea@parhasard.net>

        * device-gtk.c (gtk_delete_device):
        * device-x.c (x_delete_device):
        * emacs.c:
        * emacs.c (Fdump_emacs):
        FREE_CHECKING is no longer available. It depended on a glibc
        feature that was removed, and is no longer even
        auto-detected. Remove all mention of it.
        
        * lisp.h: Remove declaration of Freally_free(), previously in
        free-hook.c.

2024-12-22  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        * Makefile.in.in ($(RAW_EXE)):
        If the dump size is known and DUMP_IN_EXEC is defined, build
        temacs with a dumped_data full of zeroes that reflects that size.
        No longer binary-patch with ../lib-src/insert-data-in-exec,
        instead relink if the dump size known to temacs is identical to
        the current dump size.
        If the dump sizes differ, rebuild temacs with the new dump file
        size and re-dump.
        Echo so the user has an idea what is going on with this.

        * dump-data.c (dumped_data):
        Use Dale Weiler's INCBIN to inline the dumped ata.
        * dump-data.c (dumped_data_size): Revise this, use the
        dumped_size variable generated by INCBIN.
        * dump-data.c (dumped_data_get): Revise this, just use dumped_data
        (already appropriately aligned by INCBIN()).
        * dump-data.c (dumped_data_max_size): Removed, no longer needed.
        * dump-data.c (dumped_data_align_offset): Removed, no longer
        needed.

        * dump-data.h: Remove declarations of functions removed from
        dump-data.c.
        * emacs.c (main_1):
        Remove the -si / --show-inline-info argument, no longer needed.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        Remove lastfile.c, one more remnant of unexec, which makes revised
        handling of DUMP_IN_EXEC more difficult.
        * lastfile.c: Removed.
        * Makefile.in.in: Remove mention of lastfile.o from this.
        * depend (lastfile.o): Remove mention of lastfile.o from this.
        * emacs.c:
        Remove extern declaration of my_edata, no longer used.
        * emacs.c (Fdump_emacs):
        Ditto.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c:
        #include "paths.h" here to allow a better-defined search for
        installed dump files.
        * dumper.c (pdump_align_table):
        Move the pdump_free function pointer inside the non-DUMP_IN_EXEC
        code.
        * dumper.c (DUMP_IN_EXEC): #define this to 1 on WIN32_NATIVE.
        * dumper.c (pdump_resource_get): New. Rename pdump_ram_try() to
        this on non-WIN32 builds for symmetry.
        * dumper.c (snprintf): Provide a very limited snprintf in this
        file for systems where it is not available.
        * dumper.c (pdump_file_try): Revise this to take a directory name
        and a file name, avoiding issues with shift_jis and multibyte
        characters that may have ASCII slash in them.
        Check in only two places for the dump file, either the directory
        the XEmacs executable was loaded from, or that configured at
        compile time (depending on PATH_EXEC, or PATH_PREFIX, or
        neither (just relative to where the XEmacs binary was found).
        * dumper.c (pdump_load):
        Make separate implementations of this for DUMP_IN_EXEC
        vs. non-DUMP_IN_EXEC.
        Have this take its argument as an Extbyte *, appropriate given no
        localisation available at this point of startup.
        Return a Boolint, a better type.
        For the non-DUMP_IN_EXEC implementation, handle the ambiguity of
        multibyte file names better by checking whether directories exist
        when there is a slash in argv[0].
        * dumper.h:
        Update the return type and argument type of pdump_load().
        * emacs.c:
        * emacs.c (Boolint inhibit_configured_paths): Make this available
        to other files, for the sake of pdump_load().
        * emacs.c (init_cmdargs):
        Remove the code to save initial_argc, initial_argv in passing, not
        used.
        * emacs.c (main_1):
        Cast the argument to pdump_load() as appropriate.
        * lisp.h:
        Declare inhibit_configured_paths here.

2024-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * s/windowsnt.h:
        Remove further unexec-specific code from this file.

2024-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        * dired.c (file_name_completion):
        * fileio.c (Ffile_name_directory):
        * fileio.c (Fexpand_file_name):
        Remove long-unused code that checked the FILE_SYSTEM_CASE
        #define, superseded by #'file-system-ignore-case-p.

2024-12-17  Aidan Kehoe  <kehoea@parhasard.net>

        * toolbar.c: (Ftoolbar_button_p, Ftoolbar_specifier_p): Move these
        to Lisp.
        * toolbar.c (syms_of_toolbar):
        Remove the DEFSUBR()s from here.

2024-12-07  Aidan Kehoe  <kehoea@parhasard.net>

        On WIN32_NATIVE, given there is good native support for
        including the dump file in the executable, remove the support for
        loading it from an external file, avoid potential security issues
        stemming from loading this file which stores function pointers and
        thus should be regarded as having executable code.

        * dumper.c: (pdump_file_unmap): Remove the WIN32_NATIVE
        implementation of this.
        * dumper.c: (pdump_file_get): Remove the WIN32_NATIVE
        * dumper.c (pdump_resource_free):
        * dumper.c (pdump_file_try): Move this inside the non WIN32_NATIVE
        #ifdefs.
        * dumper.c (pdump_load):
        Adjust this function appropriately.

2024-12-02  Aidan Kehoe  <kehoea@parhasard.net>

        * number.c (internal_coerce_number):
        When converting a bignum to a fixnum, use bignum_to_emacs_int(),
        rather than bignum_to_long(), which will lose (more) data on
        certain platforms.

2024-12-01  Aidan Kehoe  <kehoea@parhasard.net>

        Get the native mswindows and Cygwin builds working once more.
        * device-msw.c (msprinter_reinit_device):
        Pass the FROM_IO_ERROR argument to
        msprinter_delete_device_internal().
        * device-msw.c (msprinter_delete_device):
        Take a FROM_IO_ERROR argument.

2024-11-21  Aidan Kehoe  <kehoea@parhasard.net>

        * incbin.h:
        Allow INCBIN_ALIGNMENT_INDEX to be specified explicitly and not
        auto-detected in this header.

2024-11-21  Aidan Kehoe  <kehoea@parhasard.net>

        * incbin.h: New. Import this header file, from Dave
        Weiler. Public domain, no licence issues.
        Include Dave's UNLICENSE.txt inline into the file.

2025-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        * data.c:
        Move definition of Qunbound to opaque.c.
        * emacs.c (main_1):
        Call init_opaque_once_early () before init_symbols_once_early (),
        now the former creates Qunbound.
        * opaque.c:
        * opaque.c (init_opaque_once_early):
        Qunbound is now a zero-length Lisp_Opaque object, no longer a
        symbol-value-magic.
        * symbols.c:
        Update documentation, remove mention of SYMVAL_UNBOUND_MARKER.
        * symbols.c (do_symval_forwarding):
        Since Qunbound is no longer symbol-value-magic, this function just
        returns valcontents when Qunbound is encountered. This was also
        the behaviour previously, so the change is correct by inspection.
        * symbols.c (Fset):
        Qunbound is no longer symbol-value-magic, so 
        if (!SYMBOL_VALUE_MAGIC_P (valcontents) || UNBOUNDP (valcontents))
        just becomes
        if (!SYMBOL_VALUE_MAGIC_P (valcontents))
        behaviour is exactly the same by inspection.
        * symbols.c (default_value):
        Since Qunbound is no longer symbol-value-magic, this function just
        returns valcontents when Qunbound is encountered. This was also
        the behaviour previously, so the change is correct by inspection.
        * symbols.c (Fmake_variable_buffer_local)
        Since Qunbound is no longer symbol-value-magic, the condition of
        the if statement is 0, and the code after the if statement is
        executed. This was also the behaviour previously, since the case
        within the switch just break;ed out of the switch statement,
        change is correct by inspection.
        * symbols.c (Fmake_local_variable)
        Exactly the same reasoning applies as for
        Fmake_variable_buffer_local (), twice in this function.
        * symbols.c (Fbuilt_in_variable_type):
        This returns Qnil since Qunbound is no longer symbol-value-magic;
        this was also the behaviour previously, correct by inspection.
        * symbols.c (static const struct symbol_value_magic
        guts_of_unbound_marker): Removed. No longer needed.
        * symbols.c (init_symbols_once_early):
        Remove initialisation of Qunbound from here.
        * symeval.h (enum symbol_value_type):
        Remove SYMVAL_UNBOUND_MARKER from this, no longer needed.

2024-11-09  Aidan Kehoe  <kehoea@parhasard.net>

        Attempt to avoid XEmacs crashing if the X11 server has crashed and
        we have other devices and consoles to fall back to. Thank you,
        Henry S. Thompson.

        * console-impl.h (struct console_methods):
        New flag to delete_device_method, FROM_IO_ERROR.
        * device-gtk.c (gtk_delete_device):
        Update declaration, flag not used on GTK.
        * device-msw.c (mswindows_delete_device):
        Update declaration, flag not used on mswindows.
        * device-msw.c (msprinter_delete_device_internal):
        Update declaration, flag not used on msprinter.
        * device-tty.c (tty_delete_device):
        Update declaration, flag not used on tty.
        * device-x.c (x_delete_device):
        Use it, avoid crashing XEmacs within XFreeGC when the X11 device
        has crashed
        * device.c (delete_device_internal):
        Pass FROM_IO_ERROR to the delete device methods.

2024-11-03  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_load_finish):
        Correct a cast here, thank you Mats Lidell and the buildbot.

2024-11-03  Aidan Kehoe  <kehoea@parhasard.net>

        Add thorough support for address space layout randomization, ASLR,
        now needed for macOS with Apple Silicon. This gives a 1% slowdown
        on my testing with ASLR turned off, which is acceptable.
        Configure change to turn this on by default not yet done, for the
        sake of better hg bisect behaviour.

        * alloc.c:
        * alloc.c (lrecord_implementation_description): New.
        * alloc.c (lrecord_implementation_pointer_description): New.
        We can no longer just dump the lrecord_implementation table as an
        opaque block, given data segment pointers are relocated.
        Ditto for the staticpros.
        * alloc.c (c_data_pointer_description): New. Describe a pointer to
        something in the C data segment.

        * alloc.c (init_alloc_once_early):
        Call dump_add_root_block() on lrecord_implementations_table,
        lrecord_memory_descriptions in this file rather than in dumper.c.

        * console.c:
        Be much more thorough in console_methods_description_1, now
        function pointers need to be relocated at pdump_load().
        * console.c (console_type_create):
        Remove the dead console type from the list in a way that is more
        friendly to pdump.
        * dumper.c:
        * dumper.c (struct pdump_static_pointer):
        Make the types of the fields of this struct more correct.

        * dumper.c (struct pdump_header):
        Add entries for the address of known C function and C data
        segment values at dump-time, to allow proper calculation of
        offsets at run time.

        * dumper.c (pdump_register_sub):
        Handle XD_FUNCTION_POINTER, XD_DATA_POINTER within this.
        * dumper.c (pdump_store_new_pointer_offsets):
        Update the opening comment to this fairly thoroughly.
        Handle XD_FUNCTION_POINTER, XD_DATA_POINTER within this function.

        * dumper.c (pdump_reloc_c_func): New. Given a pointer to a C
        function stored at dump time, return a value reflecting the
        run-time environment.
        * dumper.c (pdump_reloc_c_data): New. Given a pointer to somewhere
        in the C data segment stored at dump time, return a value
        reflecting the run-time environment.
        * dumper.c (pdump_reloc_lisp_object): New. Given a Lisp_Object
        stored at dump time, if it is non-NULL pointer type, return a
        value reflecting the run time environment.

        * dumper.c (pdump_reloc_lisp_data): New. Given a non-Lisp_Object
        heap value stored at dump time, if it is non-NULL pointer, return
        a value reflecting the run time environment.

        * dumper.c (pdump_load_lispdesc_indirect_description): New. Like
        lispdesc_indirect_description, but handles pdump_load()-time
        relocation of C data pointers.
        * dumper.c (pdump_reloc_one): Update not to take DELTA explicitly,
        now there are three that need to be observed.
        * dumper.c (pdump_dump_root_block_ptrs): Update to reflect
        corrected types of struct pdump_static_pointer.
        * dumper.c (pdump):
        Update some comments. Move dumping of
        lrecord_implementations_table, lrecord_memory_descriptions to
        alloc. Save the address of Fcons, lisp_object_description to the
        header.
        * dumper.c (pdump_load_finish):
        Handle relocation of data segment pointers as well as heap
        pointers in this function.
        * elhash.c:
        Document there are two C function pointers stored in
        hash_table_test_description.
        * eval.c:
        Document there is a C function pointer and two ASCII strings
        stored in Lisp_Subr.
        * events.c:
        Document there is a C function pointer stored in
        struct Lisp_Magic_Eval_Data.
        * file-coding.c:
        Document there are two C function pointers stored in
        struct detector.
        Document there are many C function pointers stored in
        struct coding_system_methods.
        * gc.c:
        * gc.c (lispdesc_one_description_line_size):
        Handle XD_DATA_POINTER, XD_FUNCTION_POINTER here.
        Move lrecord_memory_descriptions to alloc.c
        * gc.c (kkcc_marking):
        Handle XD_DATA_POINTER, XD_FUNCTION_POINTER here.
        * glyphs.c:
        Document there is a C function pointer stored in Lisp_Glyph.
        Document there is a C function pointer stored in ii_keyword_entry.
        Document there are many C function pointers stored in
        struct image_instantiator_methods.
        * lisp.h:
        * lisp.h (struct Lisp_Subr):
        Change the types of NAME, PROMPT to const Ascbyte *.
        * lread.c:
        * lread.c (structure_keyword_entry_description): New.
        * lread.c (structure_keyword_entry_dynarr_description): New.
        * lread.c (structure_type_description): New.
        * lread.c (structure_type_dynarr_description): New.
        Document the structure type infrastructure more thoroughly for the
        dumper.
        * lread.c (structure_type_create):
        Dump the structure type properly.

        * lrecord.h:
        Extensive updates to a long comment in this header.
        * lrecord.h (enum memory_description_type):
        New entries, XD_FUNCTION_POINTER, XD_DATA_POINTER in this enum.
        * lrecord.h (struct opaque_convert_functions):
        Comment documenting lack of a need for memory descriptions for
        this as of today.
        * lstream.c (lstream_implementation_description_1):
        Document there are many C function pointers, an ASCII string, and
        a data segment pointer stored in struct lstream_implementation.

        * lstream.h (lstream_implementation):
        Update the type of NAME to be, explicitly, Ascbyte *.
        * specifier.c (specifier_methods_description_1):
        Document there are many C function pointers, an ASCII string, and
        a data segment pointer stored in struct specifier_methods.
        * specifier.c (specifier_caching_description_1):
        Document that there are two C function pointers stored in struct
        specifier_caching.
        * symbols.c:
        * symbols.c (symbol_value_magic_description): New. Document that a
        symbol_value_magic stores a pointer to the data segment. 
        * symbols.c (symbol_value_buffer_local_description_1): Use it.
        * symbols.c (symbol_value_lisp_magic_description): Use it.
        * symbols.c (symbol_value_varalias_description): Use it.
        * symbols.c (symbol_value_forward_description): Use it.
        * ui-gtk.c:
        Document that there are two C function pointers in
        emacs_ffi_data.

2024-10-17  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor.c (color_instantiate):
        Don't attempt to pass a Lisp_Object as an int to
        FACE_PROPERTY_INSTANCE_1, thank you Mats Lidell and the buildbot.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        Supply file-name, coding system information for symbols loaded
        from modules.

        * alloc.c:
        * alloc.c (uninit_memory_usage_stats): New.
        * doc.c:
        * doc.c (Fbuilt_in_symbol_file):
        Check the plist of the variable-documentation property for file
        name information, as is supplied for variables in modules.
        * doc.c (syms_of_doc): Move Qsymbol_file to general-slots.h, now
        it is used by emodules.c.
        * emodules.c (Vknown_file_names): New. Weak list of file names
        known by emodules_doc_subr() and emodules_doc_sym().
        * emodules.c (emodules_doc): New. Implementation of the next two
        functions.
        * emodules.c (emodules_doc_subr):
        Revise this, accept FILE_NAME and CODING_SYSTEM_NAME, documenting
        the file a given subr was loaded from, and the coding system used
        for the file name and for the docstring.
        * emodules.c (emodules_doc_sym):
        Ditto.
        * emodules.c (vars_of_module):
        staticpro() Vknown_file_names.
        * emodules.h:
        * emodules.h (EMODULES_VERSION):
        Bump this, now emodules_doc_sym() and emodules_doc_sbur() take
        extra args.
        #define CDOCSUBR and CDOCSYM appropriately.
        * general-slots.h:
        Include Qsymbol_file here.
        * lrecord.h:
        * lrecord.h (UNDEF_LISP_OBJECT):
        Call uninit_memory_usage_stats() here.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        Move the memory usage stats out of struct lrecord_implementation,
        given that does not work with module support.

        * lrecord.h:
        * lrecord.h (struct lrecord_implementation):
        Remove most of the memory usage infrastructure from this
        structure.
        * lrecord.h (INIT_MEMORY_USAGE_STATS):
        Call the new init_memory_usage_stats() within this #define,
        whether or not MEMORY_USAGE_STATS is defined.
        * lrecord.h (INIT_LISP_OBJECT_BEGINNING):
        Ditto.
        
        * alloc.c:
        * alloc.c (Vmemusage_stats_lists): New.
        Lisp vector storing what used to be stored in the
        memusage_stats_list field of lrecord_implementation; this is just
        staticpro()ed, making GC protection and dumping easier.

        * alloc.c (lrecord_stats_metadata): New C array, for other data
        related to memory usage and previously in struct
        lrecord_implementation.
        
        * alloc.c (init_memory_usage_stats): New. Called from
        INIT_LISP_OBJECT() whether or not MEMORY_USAGE_STATS support is
        included. 
        * alloc.c (tick_lrecord_stats):
        * alloc.c (finish_object_memory_usage_stats):
        * alloc.c (Fobject_memory_usage):
        * alloc.c (lisp_object_memory_usage_full):
        * alloc.c (compute_memusage_stats_length):
        * alloc.c (init_alloc_once_early):
        Create Vmemusage_stats_lists very early.
        * alloc.c (syms_of_alloc):
        Initialise those elements of Vmemusage_stats_lists that are
        Qnull_pointer to Qnil, now that is available.
        * buffer.c (vars_of_buffer):
        * casetab.c (vars_of_casetab):
        * casetab.c (complex_vars_of_casetab):
        * chartab.c (vars_of_chartab):
        * elhash.c (vars_of_elhash):
        * mule-charset.c (vars_of_mule_charset):
        * scrollbar.c (vars_of_scrollbar):
        * specifier.c (vars_of_specifier):
        * window.c (vars_of_window):
        * frame.c (vars_of_frame):
        Use INIT_MEMORY_USAGE_STATS instead of OBJECT_HAS_PROPERTY(...
        memusage_stats_list) within these files, now the memory usage
        stats are no longer in lrecord_implementation.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.c (find_make_module):
        Given we now unload modules, modules[i].soname can be NULL, check
        for this before calling qxestrcmp().
        * emodules.c (attempt_module_delete):
        After successful unload, set the pointer to the unload function to
        NULL.
        * lread.c (vars_of_lread): Update the docstring for load-history
        to document the (defun . SYMBOL) syntax.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        * alloc.c (make_subr): New.
        * alloc.c (sweep_subrs): New.
        * alloc.c (init_alloc_early): Call init_subr_alloc().
        * lisp.h: Declare make_subr.
        * symbols.c (check_module_subr):
        Call make_subr() in this macro, ALLOC_NORMAL_LISP_OBJECT() does
        not work.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        Get unloading of modules working again, when MEMORY_USAGE_STATS is
        not defined

        * alloc.c:
        * alloc.c (unstaticpro_nodump_1):
        Operate on staticpros_nodump, as was intended.
        * alloc.c (unstaticpro_nodump): Ditto.
        * symeval.h (DEFVAR_SYMVAL_FWD_OBJECT):
        Call staticpro (), not staticpro_1 () in this macro, so the
        redefinition in emodules.h has a chance to do its thing.

2024-10-14  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (struct Lisp_Subr):
        Make the DOC field of this structure a Lisp_Object, simplifying
        dump and GC and avoiding memory leaks with docstrings for subrs in
        modules.
        Declare PROMPT and NAME as const CIbyte *, not const char *.
        * lisp.h (DEFUN):
        * lisp.h (DEFUN_NORETURN):
        Initialise DOC using Qnull_pointer, not 0.
        * doc.c:
        * doc.c (Fbuilt_in_symbol_file):
        No need for quite as many casts within this file.
        If XSUBR (fun)->doc is a Lisp string, retrieve its file name from
        its plist, in anticipation of work in this direction for modules.
        * doc.c (Fdocumentation):
        * doc.c (Fsnarf_documentation):
        * doc.c (verify_doc_mapper):
        * doc.c (syms_of_doc):
        Do a DEFSYMBOL for Qsymbol_file here.

        * lrecord.h:
        * lrecord.h (enum memory_description_type):
        * dumper.c:
        * dumper.c (pdump_register_sub):
        * dumper.c (pdump_store_new_pointer_offsets):
        * dumper.c (pdump_reloc_one):
        * gc.c (lispdesc_one_description_line_size):
        * gc.c (kkcc_marking):
        Remove the XD_DOC_STRING annotation from the dumper and the
        garbage collector, no longer needed.

        * emodules.c (emodules_doc_subr):
        Just build_ascstring () on DOC and set subr->doc to its result,
        avoid leaking the docstring on unload of the module.
        * eval.c:
        Annotate the DOC field of Lisp_Subr as a Lisp object.
        * symbols.c: (check_module_subr):
        Copy the subr structure to Lisp-allocated memory. Don't put a
        pointer to the new subr in the DOC field of the old subr, not
        needed.
        * symbols.c (defsubr):
        * symbols.c (defsubr_macro):
        Correct the load history entries for subrs loaded from modules in
        passing.

2024-10-13  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode.c:
        * bytecode.c (bytecode_arithop):
        Simplify the implementation of Bmax, Bmin in this file.
        * data.c (Fmax, Fmin):
        Move to Lisp, for the sake of maintainability (no need for #ifdef
        WITH_NUMBER_TYPES). There is no loss of speed for the usual case
        of byte-compiled code, since both functions have bytecodes.
        * data.c (syms_of_data):
        Remove the DEFSUBRs for these.
        * lisp.h:
        Remove their declarations.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c:
        * regex.c (enum):
        * regex.c (print_partial_compiled_pattern):
        * regex.c (fixup_on_failure_jump_smart):
        * regex.c (regex_compile):
        * regex.c (re_compile_fastmap):
        * regex.c (re_match_2_internal):
        Remove on_failure_keep_string_jump in favour of
        on_failure_jump_exclusive, reducing code size and failure stack
        usage.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.h (DETECTOR_DESCRIPTION_OFFSET): New macro.
        * file-coding.h (INITIALIZE_DETECTOR_DESCRIPTION):
        Use it, placate both g++ and -fsanitize=undefined at the same time.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * extents.c (Fset_extent_parent):
        Never pass a NULL first argument to qsort() in this function, even
        if the length of the array to be sorted is zero.
        * text.h (EI_ALLOC_AND_COPY):
        Never pass a NULL first argument to memcpy() in this macro, even
        if the length to be copied is zero.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * doprnt.c (fixnum_to_string_base_10):
        * lisp.h (FLOAT_HASHCODE_FROM_DOUBLE):
        Further couple of casts for the sake of -fsanitize=undefined.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * data.c (Fash): 
        Do bit shifting on EMACS_UINTs for the sake of -fsanitize=undefined.
        * regex.c:
        * regex.c (extract_number):
        Do bit shifting on an unsigned type for the sake of
        -fsanitize=undefined.
        * sysdep.c (get_random):
        Ditto.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.h (INITIALIZE_DETECTOR_DESCRIPTION):
        Use offsetof() rather than portable_offsetof() in this macro, for
        the sake of -fsanitize=undefined.
        * lisp.h:
        Motivate this change in a comment.

2024-09-22  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c:
        * file-coding.c (aligned_sizeof_coding_system): New.
        * file-coding.c (allocate_coding_system): Use it.
        Avoid misaligned coding systems objects in the dump file,
        previously addressed for lstreams, specifiers, opaque data in
        Martin Buchholz's change of 2001-01-24. Approach taken the same as
        that for specifiers.
        * file-coding.c (struct convert_eol_coding_system):
        Remove a dummy integer no longer needed.

2024-09-08  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor.c (color_instantiate):
        * fontcolor.c (font_instantiate):
        * fontcolor.c (face_boolean_instantiate):
        * fontcolor.c (face_background_placement_instantiate):
        * glyphs.c (image_instantiate):
        * specifier.c (specifier_instance_from_inst_list):
        * specifier.h (struct specifier_methods):
        Avoid passing an int among the Lisp_Object va_args of the
        specifier instantiate methods, this is not portable behaviour,
        thank you clang and -fsanitize=undefined.

2024-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (Fvector):
        * alloc.c (make_string):
        * alloc.c (make_extstring):
        * array.c:
        * array.c (Dynarr_delete_many):
        * array.h:
        * file-coding.c (convert_eol_encode):
        * lstream.c (resizing_buffer_write_with_extents):
        Avoid calls to memcpy(), memmove() with N zero, thank you clang
        and -fsanitize=undefined.

2024-09-07  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (SET_LISP_READONLY): New macro, for symmetry with the
        rvalue LISP_READONLY macro.
        * alloc.c (make_string_nocopy):
        Mark the created string as readonly for Lisp, since this function
        is routinely called with CONTENTS as a C string literal, and those
        are not guaranteed writable. Use SET_LISP_READONLY() for this.

2024-08-18  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (make_string_nocopy):
        With ERROR_CHECK_TEXT, assert that we haven't been called on stack
        data.

2024-06-24  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (resize_string):
        Avoid calling free() on dumped data in this function.
        * alloc.c (verify_string_chars_integrity):
        Correct types in this function.
        * data.c (init_errors_once_early):
        Correct the docstring for the setting-constant error.

2024-08-26  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c:
        * regex.c (regex_compile):
        * regex.c (BAD_INTERVAL):
        * regex.c (at_begline_loc_p):
        * regex.c (at_endline_loc_p):
        * regex.c (compile_range):
        * regex.c (compile_extended_range):
        * regex.c (re_match_2_internal):
        * regex.h:
        * regex.h (RE_CHAR_CLASSES):
        * regex.h (RE_DOT_NEWLINE):
        * regex.h (RE_INTERVALS):
        * regex.h (RE_NO_POSIX_BACKTRACKING):
        * regex.h (RE_NO_MULTI_DIGIT_BK_REFS):
        Remove those regex syntax options that we don't use, for the sake
        of maintainability. Remove re_comp(), re_exec (), regcomp (),
        regexec (), regerror (), regfree (), for the same reason.

2024-08-26  Aidan Kehoe  <kehoea@parhasard.net>

        Move handling of on_failure_jump_smart to compile time, regex.c.

        * regex.c:
        * regex.c (PUSH_FAILURE_POINT): Fix a bug in passing when debugging.
        * regex.c (POP_FAILURE_POINT): Fix a bug in passing when debugging.

        * regex.c (fixup_on_failure_jump_smart): New.
        * regex.c (regex_compile): Call it.
        * regex.c (mutually_exclusive_p): Adjust the calling convention of
        this to reflect that it's only called at compilation of the
        regexp, not at match time.
        * regex.c (re_match_2_internal):
        Remove handling of on_failure_jump_smart from this funnction. 
        * regex.h:
        Remove RE_MUTUALLY_EXCLUSIVE_P_ARGS{,DECL} from this header, no
        longer needed.

2024-08-24  Aidan Kehoe  <kehoea@parhasard.net>

        Move the regex.c voluminous logging #defines to using variadic
        macros.
        * regex.c (DEBUG_PRINT): New.
        * regex.c (DEBUG_PRINT1, DEBUG_PRINT2, DEBUG_PRINT3,
        DEBUG_PRINT4): Removed.
        * regex.c (DEBUG_FAIL_PRINT): Revise.
        * regex.c (DEBUG_MATCH_PRINT): Revise.
        * regex.c (DEBUG_FAIL_PRINT_DOUBLE_STRING): Revise.
        * regex.c (DEBUG_MATCH_PRINT_DOUBLE_STRING): Revise.

        * regex.c (ENSURE_FAIL_STACK):
        * regex.c (PUSH_FAILURE_REG):
        * regex.c (POP_FAILURE_REG):
        * regex.c (CHECK_INFINITE_LOOP):
        * regex.c (PUSH_FAILURE_POINT):
        * regex.c (POP_FAILURE_POINT):
        * regex.c (regex_compile):
        * regex.c (mutually_exclusive_p):
        * regex.c (re_match_2_internal):
        Switch to DEBUG_PRINT() in all these functions.

2024-08-24  Aidan Kehoe  <kehoea@parhasard.net>

        Integrate Stefan Monnier's GNU change of March 2000, which removed
        the code to deal with inner groups with start_memory, stop_memory
        (making it more economic of pattern space), and allows much more
        shy groups than previously, since they do not require an internal
        register number.

        Significant changes necessary for the commit to work on XEmacs
        include being careful to use two bytes for the register numbers
        for start_memory, stop_memory, to preserve the code that copies
        the compiled pattern buffer to the stack when matching for the
        sake of re-entrancy, to error appropriately with patterns like
        "a++", which GNU accepts, and to replace GNU's use of
        NUM_NONREG_ITEMS with NUM_FAILURE_ITEMS, which better names the
        items in question.

        git commit 505bde11b0fb6f539db1ef0713f19c3c2d86064a     
        Author: Stefan Monnier <monnier@iro.umontreal.ca>
        Date:   Wed Mar 8 23:25:41 2000 +0000

        This is a big redesign of failure-stack and register handling,
        prompted by bugs revealed when trying to add shy-groups.  Overall,
        what happened is that loops are now structured a little
        differently, groups can be shy and the code is a little simpler.
    
        * regex.c: (enum re_opcode_t): Remove jump_past_alt, maybe_pop_jump,
        push_dummy_failure and dumy_failure_jump.
        Add on_failure_jump_(exclusive, loop and smart).
        Also fix the comment for (start|stop)_memory since they now only take
        one argument (the second has becomes unnecessary).
        (print_partial_compiled_pattern): Adjust for changes in re_opcode_t.
        (print_compiled_pattern): Use %ld to printf long ints and flush to make
        debugging a little easier.
        (union fail_stack_elt): Make the integer unsigned.
        (struct fail_stack_type): Add a `frame' element.
        (INIT_FAIL_STACK): Init `frame' as well.
        (POP_PATTERN_OP): New macro for re_compile_fastmap.
        (DEBUG_PUSH, DEBUG_POP): Remove.
        (NUM_REG_ITEMS): Remove.
        (NUM_NONREG_ITEMS): Adjust.
        (FAILURE_PAT, FAILURE_STR, NEXT_FAILURE_HANDLE, TOP_FAILURE_HANDLE):
        New macros for the cycle detection.
        (ENSURE_FAIL_STACK): New macro for PUSH_FAILURE_(REG|POINT).
        (PUSH_FAILURE_REG, POP_FAILURE_REG, CHECK_INFINITE_LOOP): New macros.
        (PUSH_FAILURE_POINT): Don't push registers any more.
        The pattern address pushed is not the destination of the jump
        but the source of it instead.
        (NUM_FAILURE_ITEMS): Remove.
        (POP_FAILURE_POINT): Adapt to the new stack structure (i.e. pop
        registers before the actual failure point).
        Don't hardcode any meaning for str==NULL anymore.
        (union register_info_type, REG_MATCH_NULL_STRING_P, IS_ACTIVE)
        (MATCHED_SOMETHING, EVER_MATCHED_SOMETHING, SET_REGS_MATCHED): Remove.
        (REG_UNSET_VALUE): Use NULL (why not?).
        (compile_range): Remove declaration since it doesn't exist.
        (struct compile_stack_elt_t): Remove inner_group_offset.
        (old_reg(start|end), reg_info, reg_dummy, reg_info_dummy): Remove.
        (regex_grow_registers): Remove dead code.
        (FIXUP_ALT_JUMP): New macro.
        (regex_compile): Add shy-groups
        Change loops to use on_failure_jump_smart&jump instead of
        on_failure_jump&maybe_pop_jump.
        Change + loops to eliminate the initial (dummy_failure_)jump.
        Remove c1_base (looks like unused variable to me).
        Use `jump' instead of `jump_past_alt' and don't bother with
        push_dummy_failure in alternatives since it is now unnecessary.
        Use FIXUP_ALT_JUMP.
        Eliminate a useless `#ifdef emacs' for (re)allocating the stack.
        (re_compile_fastmap): Remove dead variables i and num_regs.
        Exit from loop when bufp->can_be_null rather than jumping to `done'.
        Avoid jumping backwards so as to ensure termination.
        Use PATTERN_STACK_EMPTY and POP_PATTERN_OP.
        Improved handling of backreferences.
        Remove dead code in handling of `anychar'.
        (skip_noops, mutually_exclusive_p): New functions taken from the
        handling of `maybe_pop_jump' in re_match_2_internal.
        Slightly improve mutually_exclusive_p to handle ".+\n".
        ((lowest|highest)_active_reg, NO_(LOWEST|HIGHEST)_ACTIVE_REG)
        Remove.
        (re_match_2_internal): Use %p instead of 0x%x when printf'ing ptrs.
        Don't SET_REGS_MATCHED anymore.  Remove many dead variables.
        Push register (in `start_memory') on the stack rather than storing it
        in old_reg(start|end).
        Remove the cycle detection from `stop_memory', replaced by the use
        of on_failure_jump_loop for greedy loops.
        Add code for the new on_failure_jump_<foo>.
        Remove ad-hoc code in `on_failure_jump' to push more registers
        in the case of a loop.
        Take out code from `maybe_pop_jump' into separate functions and
        adapt it to the semantics of `on_failure_jump_smart'.
        Remove jump_past_alt, dummy_failure_jump and push_dummy_failure.
        Remove dummy_failure handling and handling of `failures to jump
        to on_failure_jump' (this last one was already dead code, it seems).

        * regex.h:
        * regex.h (RE_EXECUTE_CHARSET_MULE_ARGS_DECL): New.
        * regex.h (RE_EXECUTE_CHARSET_MULE_ARGS): New.
        * regex.h (RE_MUTUALLY_EXCLUSIVE_P_ARGS_DECL): New.
        * regex.h (RE_MUTUALLY_EXCLUSIVE_P_ARGS): New.
        All provided to make mutually_exclusive_p () portable to XEmacs
        and to those files under lib-src/ that use regex.o.
        * regex.h (struct re_pattern_buffer):
        Update some comments in this file.

2024-08-18  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor-x.c (x_print_font_instance):
        Use the appropriate format specifier for an address when printing
        an XFT font's address.
        * redisplay-x.c (x_output_string):
        Cast some members of an XRectangle structure, suppressing a
        warning from the C++ compiler.

2024-08-18  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (Vinhibit_read_only):
        Add information regarding the buffer-local status of this variable
        to its docstring (usually not buffer local, usually buffer-local
        in the minibuffer).

2024-06-20  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode.c: (Fcompiled_function_interactive): Give some more
        information in the docstring regarding what an interactive spec
        can be.
        * callint.c:
        * callint.c (quotify_args): Removed, no longer needed.
        * callint.c (Fcall_interactively):
        Update to use the metadata for the command history generated by
        byte-compiler, or to call #'byte-compile-annotate-interactive
        ourselves if this is not available (e.g. with an interpreted command).
        * callint.c (syms_of_callint):
        Define Qbyte_compile_annotate_interactive as a symbol, making the
        Lisp function available to #'call-interactively.

2024-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        * symbols.c (Fapropos_internal): Removed. Now in lisp/apropos.el.

2024-05-17  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor-x.c (get_string):
        Avoid leaking the result of XGetAtomName in this macro.
        * fontcolor-x.c (get_number):
        Use more braces in this macro to reduce the chance of bugs.
        * fontcolor-x.c (truename_via_random_props):
        Avoid calling XFree on stack memory allocate by
        EXTERNAL_TO_ITEXT(), now the get_string() macro has been
        corrected.

2024-05-01  Aidan Kehoe  <kehoea@parhasard.net>

        * callint.c (Fcall_interactively):
        When reading a character with the ?c interactive spec, just use
        the PROMPT argument to #'read-char rather than re-implementing
        it, giving better user feedback regarding the character typed.

2024-04-29  Aidan Kehoe  <kehoea@parhasard.net>

        Use the newer _CONST_X_STRING X11 #define instead of the
        xt-wrappers.h approach to suppressing warnings with string
        constants used for X11 String types. Update various declarations
        to String rather than char * to work better with this.

        Remove the Xt_RESOURCE macro, which basically hid casts to
        String.  Remove the Xt_SET_ARG macro for the same reason,

        Keep the Xt_SET_VALUE, Xt_GET_VALUE convenience macros, they
        remain of use. Put them in console-x-impl.h.

        Use BEGIN_C_DECLS/END_C_DECLS appropriately in  array.h,
        EmacsManager.h, lisp.h for a cleaner C++ build.
        
        * EmacsFrame.c:
        * EmacsFrame.c (res):
        * EmacsFrame.c (EmacsFrameSetCharSize):
        * EmacsManager.c:
        * EmacsManager.c (res):
        * EmacsManager.h:
        * EmacsShell-sub.c:
        * EmacsShell-sub.c (update_size_hints_internal):
        * array.h:
        * config.h.in:
        * console-x-impl.h:
        * device-x.c:
        * device-x.c (emacs_options):
        * device-x.c (sanity_check_geometry_resource):
        * device-x.c (x_init_device):
        * device-x.c (x_get_resource_prefix):
        * frame-x.c:
        * frame-x.c (x_wm_set_cell_size):
        * frame-x.c (x_wm_set_variable_size):
        * frame-x.c (x_wm_store_class_hints):
        * frame-x.c (x_set_frame_text_value):
        * frame-x.c (x_initialize_frame_size):
        * frame-x.c (x_create_widgets):
        * frame-x.c (x_set_frame_icon):
        * frame-x.c (x_set_frame_position):
        * frame-x.c (x_update_frame_external_traits):
        * glyphs-x.c (x_redisplay_widget):
        * glyphs-x.c (x_widget_instantiate):
        * glyphs-x.c (x_button_instantiate):
        * input-method-xlib.c (IMInstantiateCallback):
        * input-method-xlib.c (res):
        * input-method-xlib.c (EmacsXtCvtStringToXIMStyles):
        * lisp.h:
        * menubar-x.c (make_dummy_xbutton_event):
        * select-x.c (hack_motif_clipboard_selection):

2024-02-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * keymap.c (control_meta_superify): Restore 'static' as all uses
        are in keymap.c and resolves [-Wmissing-prototypes].

2024-02-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * fontcolor-tty.c (find_tty_closest_color_1): Resolve
        [-Wdeclaration-after-statement].

2024-02-15  Richard Hopkins  <xemacs@unbit.co.uk>

        Internally the color name is a symbol and now TTY_COLOR_ENTRY_NAME
        always returns a symbol rather than a symbol or a string; the
        conversion back to string is for consistency at the lisp level.

        * fontcolor-tty.c (find_tty_closest_color_1): Return entry as-is
        from color_alist.
        (Ffind_tty_closest_color): Convert color name to string here
        instead.

2024-02-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * fontcolor-tty.c (Ffind_tty_color):
        (find_tty_closest_color_1):
        (tty_color_list):
        (tty_initialize_color_instance): Use new accessors rather than
        explicit car/cdr calls.

        * console-tty-impl.h (TTY_COLOR_ENTRY_NAME):
        (TTY_COLOR_ENTRY_DATA): New accessors for entry in color_alist
        which maps NAME to COLOR_DATA.
        (TTY_COLOR_DATA_FG_STRING):
        (TTY_COLOR_DATA_BG_STRING):
        (TTY_COLOR_DATA_RGB_VECTOR): New. Get appropriate value from the
        mapped COLOR_DATA.

2024-02-12  Richard Hopkins  <xemacs@unbit.co.uk>

        Add support on TTY for X color names and hex color strings that
        will fallback to an available device color.  This extracts the MSW
        implementation to make it available for use on both TTY and MSW.

        * fontcolor.h (Rgbref): New integral type to represent a color
        allowing [0-255] for each RGB component.
        (invalid_rgb): Declare it.
        (RGB_CONSTANT): New macro for initializing shared_X_color_map.
        (rgb_valid_p): New. Check if an Rgbref instance is valid and the
        RGB components can be used.
        (rgb_pack): New. Pack the given red, green and blue into a single
        Rgbref.
        (rgb_red): New. Extract the red component from an Rgbref.
        (rgb_green): New. Extract the green component from an Rgbref.
        (rgb_blue): New. Extract the blue component from an Rgbref.
        (shared_X_string_to_color): Declare it.
        (shared_X_color_to_string): Declare it.
        (shared_X_color_list): Declare it.

        * fontcolor.c (invalid_rgb): New. Sentinel value for an invalid
        RGB.
        (colormap_t): Moved from fontcolor-msw.c
        (shared_X_color_map): Extracted from mswindows_X_color_map.
        (hexval): Moved from fontcolor-msw.c.
        (colormap_t_compare): Moved from fontcolor-msw.c.
        (shared_X_string_to_color): New. Extracted from
        mswindows_X_string_to_color.
        (shared_X_color_to_string). New. Extracted from
        mswindows_color_to_string.
        (shared_X_color_list): New. Extracted from mswindows_color_list.

        * fontcolor-tty.c (tty_color_list): Use shared_X_color_list.
        (tty_initialize_color_instance): Use shared_X_string_to_color to
        support color names and hex strings.
        (tty_valid_color_name_p): Use shared_X_string_to_color to support
        color names and hex strings.

        * fontcolor-msw.c (colormap_t): Moved to fontcolor.c
        (mswindows_X_color_map): Moved to fontcolor.c.
        (hexval): Moved to fontcolor.c.
        (colormap_t_compare): Moved to fontcolor.c
        (mswindows_string_to_color): Use shared_X_string_to_color.
        (mswindows_color_to_string): Use shared_X_color_to_string.
        (mswindows_color_list): Use shared_X_color_list.

2023-11-19  Aidan Kehoe  <kehoea@parhasard.net>

        * scrollbar.c (update_scrollbar_instance):
        Fix my bug with buffer-position-based scrolling, thank you Richard
        Hopkins.
        NEW_SLIDER_SIZE as window_displayed_height() * 512 was never a
        good decision, far too big, and this misled the toolkits. The
        previous arithmetic is cheap, works for him, works for me, always
        worked for the toolkits.

2023-11-05  Aidan Kehoe  <kehoea@parhasard.net>

        * line-number.c:
        * line-number.c (byte_beginning_of_line): New.
        Given a line number, return the Bytebpos of the beginning of that
        line. This is the inverse of buffer_line_number ().

        * line-number.h:
        Declare it.

        * redisplay.c (force_valid_bytebpos_or_zero):
        Make this un-static given it's now used by
        scrollbar_slider_position_to_lisp ().
        * scrollbar-gtk.c:
        * scrollbar-gtk.c (gtk_update_scrollbar_instance_values):
        Fix handling of line-oriented scrolling.
        Use marker_byte_position() instead of marker_position(), given we
        function in either lines or byte positions.

        * scrollbar-gtk.c (scrollbar_cb):
        Use scrollbar_slider_position_to_lisp () when creating an argument
        to #'scrollbar-vertical-drag.
        * scrollbar-msw.c (mswindows_handle_scrollbar_event):
        Ditto.

        * scrollbar-x.c:
        * scrollbar-x.c (x_update_scrollbar_instance_values):
        Fix handling of line-oriented scrolling.
        Use marker_byte_position() instead of marker_position(), given we
        function in either lines or byte positions.

        * scrollbar-x.c (x_update_vertical_scrollbar_callback):
        Use scrollbar_slider_position_to_lisp () when creating an argument
        to #'scrollbar-vertical-drag.

        * scrollbar.c:
        * scrollbar.c (scrollbar_slider_position_to_lisp): New.
        * scrollbar.c (update_scrollbar_instance):
        Mark that scrolling is line-oriented or not explicitly when
        passing values to the toolkit code.
        * scrollbar.h:
        * scrollbar.h (struct scrollbar_instance):
        New field, line_oriented_scrolling_p.

2023-10-22  Aidan Kehoe  <kehoea@parhasard.net>

        * event-msw.c (mswindows_wnd_proc):
        Only respond to TTN_NEEDTEXTW, not TTN_NEEDTEXTA messages, when
        handling WM_NOTIFY. Change missed in 0f36f2ab4a32 , thank you Kurt
        Geisel.

2023-10-21  Aidan Kehoe  <kehoea@parhasard.net>

        1. Make upshift_event (), downshift_event (), event_upshifted_p ()
        also do the right things with non-ASCII keysyms with case.

        2. Only accept characters as the #'character-of-keysym property,
        an obsolescent way to document that a symbol has an associated
        character, and something never supported by GNU, so char-int
        confoundance should never have come up.

        * events.c:
        * events.c (event_to_character):
        Fixnums will never appear as event keysyms, don't check for them.
        Only check for characters as the character-of-keysym property and
        the related ascii-character property, these are XEmacs approaches
        to specifying associated characters that should not come up in GNU
        code.

        * events.c (upshift_event):
        Don't check for fixnums as event keysyms.  Generalise the case
        mapping to handle non-ASCII case transformation.
        * events.c (downshift_event):
        Ditto.
        * events.c (event_upshifted_p):
        Use a more modern return type here.
        Use a more modern implementation that deals with non-ASCII case
        transformation. 

        * keymap.c (event_matches_key_specifier_p):
        * keymap.c (meta_prefix_char_p):
        Use more modern return types types for these functions.
        
        * keymap.c (map_keymap_sort_predicate):
        * keymap.c (describe_map_mapper):
        * keymap.c (describe_map_sort_predicate):
        * keymap.c (describe_map):
        Only accept characters, not char-ints, for the character-of-keysym
        property in these functions.

        * keymap.h (event_matches_key_specifier_p):
        Update a return type here.

2023-10-20  Aidan Kehoe  <kehoea@parhasard.net>

        Some changes to get the latest beta building with Visual
        Studio from Kurt Geisel <kgeisel@outlook.com>. Thank you Kurt!

        * dumper.c (pdump_resource_get):
        Even though the resource segment is marked read/write, we now need
        to explicitly change the pages in the mapped resource address
        space to be writeable in order to allow pdump relocation to not
        hit write access violations.

        * lisp.h (max_align_t): Our definition of max_align_t is no longer
        needed from VS 2019 onwards.

        * nt.c (init_nt):
        Code that duplicates standard handles as non-inheritable breaks
        ucrt lookup of standard stream identifiers (stdout, stdin,
        stderr), which are now resolved as function calls (defined by the
        preprocessor) that assume the file handles in the global table are
        stable. This breaks non-console I/O and the build-time piping from
        i.exe.

2023-10-10  Richard Hopkins  <xemacs@unbit.co.uk>

        * fontcolor-tty.c (find_tty_closest_color_1): Internal function to
        find the closest color from the color_alist.

        * fontcolor-tty.c (Ffind_tty_closest_color): New.  From the given
        RGB components (0-255) it will find the closest registered color
        for the device.  Expose to lisp in preparation for use from
        #'font-tty-find-closest-color.

        * fontcolor-tty.c (syms_of_fontcolor_tty): Add
        Ffind_tty_closest_color.

2023-10-09  Richard Hopkins  <xemacs@unbit.co.uk>

        * fontcolor-tty-impl.h (struct tty_color_instance_data): Add
        fields for is_rgb_known, red, green and blue.

        * fontcolor-tty-impl.h (COLOR_INSTANCE_TTY_IS_RGB_KNOWN):
        (COLOR_INSTANCE_TTY_RED):
        (COLOR_INSTANCE_TTY_GREEN):
        (COLOR_INSTANCE_TTY_BLUE): New wrappers for new fields.

        * fontcolor-tty.c (tty_initialize_color_instance): Populate
        is_rgb_known, red, green and blue based on data populated in
        color_alist.

        * fontcolor-tty.c (tty_color_instance_rgb_components): New
        function implementing generic #'color-instance-rgb-components; the
        components are converted to 16-bit as required.

        * fontcolor-tty.c (console_type_create_fontcolor_tty): Register
        #'color-instance-rgb-components.

2023-10-08  Aidan Kehoe  <kehoea@parhasard.net>

        Recent Motif Xm.h unilaterally #defines USE_XFT if XFT is
        available, which makes building without it difficult for
        XEmacs. Change our #define to XEMACS_USE_XFT.
        Change some related #defines for symmetry.

        * console-xlike-inc.h (XEMACS_USE_XFT):
        * fontcolor-xlike-inc.c:
        * fontcolor-xlike-inc.c (XFUN):
        * fontcolor-xlike-inc.c (FcResultToString):
        * redisplay-x.c:
        * redisplay-x.c (x_get_gc):
        * redisplay-x.c (separate_textual_runs_xft_nomule):
        * redisplay-x.c (separate_textual_runs_xft_mule):
        * redisplay-x.c (separate_textual_runs):
        * redisplay-x.c (x_text_width_single_run):
        * redisplay-x.c (x_output_string):
        * redisplay-xlike-inc.c (XLIKE_output_display_block):

2023-10-05  Aidan Kehoe  <kehoea@parhasard.net>

        * window.c (Fwindow_end):
        window_display_buffer () can sometimes give NULL if the window has
        yet to be redisplayed, check for that in this function.

2023-10-04  Aidan Kehoe  <kehoea@parhasard.net>

        * search.c (set_lisp_search_registers):
        Force the correct order of START, END arguments to
        set_extent_endpoints(), thank you Jody Weissmann, thank you Henry
        S. Thompson.

2023-09-30  Aidan Kehoe  <kehoea@parhasard.net>

        Add modifiers.h, on the model of keymap-buttons.h. Use it in 
        those places where code iterates through modifiers.

        Print modifiers for motion, misc-user events, which was not done
        previously.
        Fix a bug in passing where list structure was not appropriately
        generated for motion events, thank you Henry S. Thompson. 
        
        * modifiers.h:
        * modifiers.h (XEmacs is free software): New.

        * events.c (print_event):
        Print modifiers for motion, misc-user events.
        * events.c (Fmake_event):
        Iterate through modifiers using modifiers.h when processing them.
        * events.c (format_event_object):
        Iterate through modifiers using modifiers.h when printing them.
        * events.c (Fevent_modifiers):
        Iterate through modifiers using modifiers.h when constructing a
        symbolic list of them.
        * events.h:
        * events.h (enum event_modifiers):
        Use FROB_MODIFIER and modifiers.h when constructing this enumeration.

        * keymap.c:
        * keymap.c (FROB_MODIFIER): Use this #define with modifiers.h when
        declaring symbols needed to declare modifiers.
        * keymap.c (bucky_sym_to_bucky_bit):
        Use modifiers.h within this function.
        * keymap.c (control_meta_superify):
        Ditto.
        * keymap.c (canonicalize_keysym):
        Ditto, error within this function rather than in callers when
        supplied with keysyms that are modifiers names and that are not
        buttons.
        * keymap.c (parse_list_keystroke): New. Refactored out of
        Fcanonicalize_keysym(), also used in define_key_parser().
        * keymap.c (Fcanonicalize_keysym): Use parse_list_keystroke ().
        * keymap.c (define_key_parser): Ditto.
        * keymap.c (Fsingle_key_description):
        Use modifiers.h in this function, avoid printing redundant
        modifiers multiply.
        For symmetry with treatment of event arguments, use
        character_to_event() to extract modifiers for control characters.
        * keymap.c (describe_map):
        Use modifiers.h when iterating through modifiers to print them.
        * keymap.c (syms_of_keymap):
        Use modifiers.h when iterating through modifier names for
        DEFSYMBOL().
        * keymap.h:
        Use modifiers.h when iterating through modifier names for
        declarations.
        * lisp.h:
        Remove declaration of control_meta_superify(), no longer used in
        events.c.

2023-10-07  Aidan Kehoe  <kehoea@parhasard.net>

        Clean up a few straggling remnants of the old mark algorithm,
        missed in cca3709a62ad .

        * alloc.c:
        Remove mention of objects' mark methods.
        * array.c (mark_Lisp_Object_dynarr): Removed, not necessary since
        KKCC is the only mark algorithm.
        * buffer.c (common_init_complex_vars_of_buffer):
        Remove mention of a mark method.
        * console-impl.h (struct console_methods): Remove the
        mark_console(), mark_device(), mark_frame(),
        mark_color_instance(), mark_font_instance(), and
        mark_image_instance() methods.
        * console-msw.c (console_type_create_mswindows):
        Remove mention of the mark_console() method.
        * console-tty.c (tty_initially_selected_for_input):
        Remove tty_mark_console ().
        * console-tty.c (console_type_create_tty):
        Remove mention of mark_consol().
        * console.c (common_init_complex_vars_of_console):
        * device-gtk.c:
        * device-gtk.c (console_type_create_device_gtk):
        Remove gtk_mark_device().
        * device-msw.c:
        Remove mswindows_mark_device(), msprinter_mark_device().
        * device-x.c:
        Remove x_mark_device().
        * file-coding.c:
        Remove chain_mark(), chain_mark_coding_stream_1(),
        chain_mark_coding_stream(), undecided_mark(), and
        undecided_mark_coding_stream().
        * file-coding.h (struct coding_system_methods):
        * file-coding.h (struct detector):
        Remove the mark methods from these structures.

        * fontcolor-msw.c:
        Remove mswindows_mark_color_instance(),
        mswindows_mark_font_instance(), 
        
        * fontcolor-tty.c:
        Remove tty_mark_color_instance(), tty_mark_font_instance().

        * fontcolor.c:
        Remove color_mark(), font_mark(), face_boolean_mark(),
        face_background_placement_mark().

        * frame-gtk.c:
        Remove gtk_mark_frame().

        * frame-msw.c:
        Remove mswindows_mark_frame(), msprinter_mark_frame().

        * frame-x.c:
        Remove x_mark_frame().

        * gc.c:
        Be clearer in the documentation here that we don't use mark
        methods at all.

        * gccache-x.h:
        Clarify how the hash table in the x_gc_cache is reachable for the
        GC.

        * glyphs.c:
        Remove image_mark().

        * gutter.c:
        Remove mark_gutters().
        * gutter.h:
        Remove its declaration.

        * intl-win32.c:
        Remove mswindows_multibyte_mark().
        * lisp.h:
        Remove declarations for mark_Lisp_Object_dynarr(),
        mark_buffer_syntax_cache().
        * lrecord.h:
        Update comments here to reflect that KKCC is the only mark
        algorithm and to update examples.

        * mule-ccl.c:
        Remove mark_ccl_program() from here.
        * mule-ccl.h:
        Remove its declaration.

        * mule-coding.c:
        Remove multibyte_mark_coding_stream(), multibyte_mark(),
        iso2022_mark_iso2022_coding_stream(),
        iso2022_mark_coding_stream(), iso2022_mark(),
        iso2022_mark_detection_state(), ccl_mark(), and
        ccl_mark_coding_stream().
        * redisplay.c:
        Remove mark_glyph_block_dynarr(), mark_redisplay_structs().
        * redisplay.h:
        Remove the declaration of mark_redisplay_structs().
        * specifier.h (struct specifier_methods):
        Remove the mark method.
        * syntax.c:
        Remove mark_buffer_syntax_cache().

2023-09-08  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor-tty.c:
        Add information to mark escape_fore, escape_back with KKCC.

2023-08-26  Richard Hopkins  <xemacs@unbit.co.uk>

        Use the escape sequence found during initialization rather than
        re-lookup during redisplay.  This de-duplication should also help
        support hex/rgb codes in future as they won't be a key in
        color_alist.

        * redisplay-tty.c (set_foreground_to): Use provided escape
        sequence rather than re-lookup in color_alist.
        (set_background_to): Use provided escape sequence rather than
        re-lookup in color_alist.
        (tty_turn_on_face_1): Pass the escape sequence instead of color
        name to set_foreground_to / set_background_to.

        * fontcolor-tty.c (tty_initialize_color_instance): Populate
        escape_fore and escape_back with escape strings from color_alist.

        * fontcolor-tty.c (tty_mark_color_instance): Mark new escape_fore
        and escape_back.

        * fontcolor-tty-impl.h (struct tty_color_instance_data):
        (escape_fore): Add to hold ANSI escape sequence string.
        (escape_back): Add to hold ANSI escape sequence string.
        (COLOR_INSTANCE_TTY_ESCAPE_FORE): Wrapper for escape_fore.
        (COLOR_INSTANCE_TTY_ESCAPE_BACK): Wrapper for escape_back.

2023-08-10  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (portable_offsetof):
        Cast the result of this to Bytecount, rather than size_t, so its
        use (almost exclusively for the OFFSET field of struct
        memory_description) doesn't cause problems with clang++-11.

2023-08-06  Richard Hopkins  <xemacs@unbit.co.uk>

        * fontcolor-tty.c (Fregister_tty_color): Ensure rgb_vector_len is
        wrapped with #'make_integer for the "RGB-VECTOR must have a length
        of 3." error.

2023-08-05  Richard Hopkins  <xemacs@unbit.co.uk>
 
        Allow registering RGB values for TTY colors with the intention
        these can later be used to support HEX codes translation and
        fallback, along with 24-bit Trucolor support.

        * console-tty-impl.h (struct tty_console): Clairfy layout of
        color_alist for new rgb_vector element.

        * fontcolor-tty.c (Fregister_tty_color): Add new rgb_vector arg.
        This must be a 3-element vector with each element being an integer
        in the range 0-255; anything else signals an error.  Update
        color_alist accordingly.

        * fontcolor-tty.c (Ffind_tty_color): Update result to include new
        rgb_vector.

        * redisplay-tty.c (set_background_to): Update reference to
        bg_string due to color_alist updates to handle rgb_vector.
 
2023-08-06  Aidan Kehoe  <kehoea@parhasard.net>

        * keymap.c (control_meta_superify): Make this available to other
        files.
        Add the modifiers in strictly descending numerical order, to allow
        #'canonicalize-keysym to minimise consing.
        * events.c (Fevent_modifiers):
        Use control_meta_superify () in this function, to ensure this
        function and #'canonicalize-keysym give consistent resutls.

        * keymap.c (Fcanonicalize_keysym):
        If KEYSYM is already in canonical form (including the order of its
        modifiers), return it.
        * lisp.h:
        Declare control_meta_superify () for files that are not keymap.c.

2023-08-05  Aidan Kehoe  <kehoea@parhasard.net>

        * event-stream.c (enum did_munge_result): New.
        Enumeration documenting the various munging of events that
        munge_keymap_translate() and friends may have done.

        * event-stream.c (this_command_keys_shift_translated): New.
        A boolean variable to allow handle-pre-motion-command and
        handle-post-motion-command to know whether
        retry-undefined-key-binding-unshifted has been necessary. Name
        from GNU, implementation our own.

        * event-stream.c (munge_keymap_translate):
        Implement the enumeration for DID_MUNGE.
        * event-stream.c (command_builder_find_leaf_no_jit_binding):
        Ditto.
        * event-stream.c (command_builder_find_leaf):
        Ditto.
        * event-stream.c
        (command_builder_find_leaf_and_update_global_state):
        Check DID_MUNGE for MUNGED_RETRY_UPSHIFTED, set
        this_command_keys_shift_translated to non-zero if appropriate.
        * event-stream.c (reset_this_command_keys):
        Set this_command_keys_shift_translated to zero.
        * event-stream.c (vars_of_event_stream):
        Make this-command-keys-shift-translated available to Lisp.
        * events.c (Fevent_key):
        Extend the docstring of this some more.

2023-07-31  Aidan Kehoe  <kehoea@parhasard.net>

        * doprnt.c (rewrite_rational_spec):
        Make the %z integer length modifier explicitly equivalent to the
        %l modifier when formatting for Lisp, avoid infinite loop.

2023-07-30  Aidan Kehoe  <kehoea@parhasard.net>

        Make algorithm used in #'find, #'position with :from-end and
        lists, strings the same as that with arrays; use
        list_position_cons_before() for the non :from-end list case, which
        is cheaper for the usual case where the test is #'eq and there is
        no key argument.

        * sequence.c:
        * sequence.c (list_position_cons_before):
        Update documentation for this function. Error if END and START are
        not valid bounding index designators, which it did not previously.

        * sequence.c (position):
        Call list_position_cons_before () and adjust the algorithm with
        :from-end and strings, lists as above.

        * sequence.c (Fdelete_duplicates):
        Be more careful about the END argument to
        list_position_cons_before () now that it's checked.
        * sequence.c (Fremove_duplicates):
        Be more careful about the END argument to
        list_position_cons_before () now that it's checked.

        * sequence.c (mismatch_list_string):
        * sequence.c (mismatch_list_array):
        * sequence.c (mismatch_string_array):
        Work around the compiler thinking an argument to make_integer ()
        with the ternary operator is non-idempotent in these functions, in
        passing.

2023-07-29  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor-gtk.c (gtk_color_instance_rgb_components):
        Return something understood by Lisp (that is, three fixnums
        between 0 and 65535) under GTK3, rather than floats. 
        This fixes detection that a frame has a light background in
        #'get-frame-background-mode for me.

2023-07-22  Richard Hopkins  <xemacs@unbit.co.uk>

        * redisplay-tty.c (set_foreground_to):
        (set_background_to): Use console specific color_alist.

        * fontcolor.c (Fcolor_list): Provide device arg to #'color-list.

        * fontcolor-tty.c:
        (Vtty_color_alist): Remove; it's now an entry in struct
        tty_console.
        (Fregister_tty_color): Add new console arg.  Use console specific
        color_alist.
        (Funregister_tty_color): Add new console arg.  Use console
        specific color_alist.
        (Ffind_tty_color): Add new console arg.  Use console specific
        color_alist.
        (tty_color_list): Add device arg.  Use console specific
        color_alist.
        (tty_initialize_color_instance): Use existing device arg.  Use
        console specific color_alist.
        (tty_valid_color_name_p): Use console specific color_alist.
        (vars_of_fontcolor_tty): Delete staticpro call for the now deleted
        Vtty_color_alist.

        * fontcolor-msw.c (mswindows_color_list): Add UNUSED device arg.

        * fontcolor-gtk.c (gtk_color_list): Add UNUSED device arg.

        * device-tty.c:
        (Qmake_device_late_tty_entry_point): New.
        (tty_finish_init_device): New. Call
        #'make-device-late-tty-entry-point.
        (syms_of_device_tty): DEFSYMBOL Qmake_device_late_tty_entry_point.
        (console_type_create_device_tty): Provide finish_init_device
        method.

        * console-tty.c (tty_console_data_description_1): Add entry for
        color_alist.
        (allocate_tty_console_struct): Set color_alist entry to Qnil.
        (tty_init_console): Set color_alist entry to Qnil.
        (tty_mark_console): Mark color_alist.

        * console-tty-impl.h (struct tty_console): Add color_alist
        entry.

        * console-impl.h (struct console_methods): Add device arg for
        color_list_method.

2023-06-17  Aidan Kehoe  <kehoea@parhasard.net>

        * file-coding.c (no_conversion_decode):
        * file-coding.c (no_conversion_encode):
        * unicode.c (unicode_decode):
        * unicode.c (unicode_encode):
        Restore the skip_ascii() optimization for the no-conversion and
        utf-8 coding systems, dropped in the course of the
        unicode-internal merge. This gives a 25% speedup on loading
        Unihan.txt as UTF-8, and a 33% speedup on loading it using
        no-conversion.
        Further work: add the skip_ascii() optimization to the multibyte
        code if the relevant charsets make that appropriate.

2023-05-17  Richard Hopkins <xemacs@unbit.co.uk>

        * src/device-msw.c (mswindows_device_system_metrics): Update
        DM_num_color_cells calculation for non RC_PALETTE devices
        to use BITSPIXEL and cap it to 24-bits.

        The previous calculation using SIZEPALETTE could return 0 or
        256 even when many more colors are available.  A consequence
        of this is that themes with (min-colors NUM) would not be
        respected.  Under the same scenario this change now makes
        (device-color-cells) => 16777216, which also matches the
        result from GNU Emacs on the same setup.  It may make sense
        to always use this calculation just like GNU does but for now
        respect the old calculation whilst more exposure is gained.

        The related commit in GNU Emacs was made available in the 24.3
        release.

        commit 821812e2477f45ac5f2572dd7d469b8408e351aa
        Author: Daniel Colascione <dancol@dancol.org>
        Date:   Mon Oct 8 10:44:42 2012 -0800

        * w32fns.c (Fx_display_color_cells): Instead of using NCOLORS,
        which is broke under remote desktop, calculating the number of
        colors available for a display based on the display's number of
        planes and number of bits per pixel per plane.  (bug#10397).

ChangeLog Entries from tests/ChangeLog

goto announcement, summary, changes

2025-06-14  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.36 "leeks" is released.

2025-06-03  Alan Mackenzie  <acm@muc.de>

        * automated/search-tests.el: Add tests for "\\>" and "\\_>" in the
        presence of characters with 'syntax-table extent properties.

2025-05-25  Alan Mackenzie  <acm@muc.de>

        * automated/regexp-tests.el: Add some tests for the PAREN argument
        of regexp-opt.

2025-05-24  Alan Mackenzie  <acm@muc.de>

        * automated/search-tests.el: Add tests for regexp buffer searches
        which use "\\_<" and "\\_>".

2025-05-24  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/lisp-tests.el (test-interactive):
        Check that compiled functions supplied as arguments to
        (interactive ...) in lambdas are not doubly-compiled.

2025-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/mule-tests.el: Test detection of coding cookies in
        this file. 

2025-05-07  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-tests.el:
        Test symbol boundary anchors, just added to regex.c, heavily
        inspired by the testing of the word boundaries. Use #'eql rather
        than #'= since if the test fails it will give a non-number
        result.

2025-03-20  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/lisp-tests.el (Assert-compare-buffer-substrings): New.
        Test #'compare-buffer-substrings, which just had its
        implementation revised to avoid O(N) calls to BUF_FETCH_CHAR(). 
        * automated/lisp-tests.el: Re-encode this file in UTF-8 now the
        non-mule build is gone and it is helpful to have Greek character
        literals. 

2025-03-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-tests.el:
        Move some code to test unicode-error-default-translation-table,
        unicode-invalid-sequence-regexp-range here from lisp/unicode.el.

2025-01-13  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/call-interactively.el:
        New file, initial testing of the string (interactive) specs.

2025-01-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/mule-tests.el:
        Test resize_string() with big, small strings.

2023-10-18  Richard Hopkins  <xemacs@unbit.co.uk>

        * automated/color-tests.el: Add tests for rgb:hex/hex/hex variants
        and 3 digit per component #hex variant.  Also test the same result
        is obtained for different forms of the same color.

2023-10-17  Richard Hopkins  <xemacs@unbit.co.uk>

        * automated/color-tests.el: Test single hex digit per component.

2023-10-16  Richard Hopkins  <xemacs@unbit.co.uk>

        * automated/color-tests.el: Test white variants in formats
        #fefefe, component range [0.0, 1.0], and [0-255].

2023-10-15  Richard Hopkins  <xemacs@unbit.co.uk>

        * automated/color-tests.el: New.  Ensure colors read from rgb.txt
        are scaled correctly by testing "white".  Skip the test when
        rgb.txt is unavailable.

2023-09-30  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/event-tests.el: New.
        Test a bug just fixed with #'event-modifiers and motion
        events. Test misc-user events too in passing.

2023-08-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/region-tests.el:
        Further tests of shifted-motion handling, checking that varying
        values for `shifted-motion-keys-select-region' and `zmacs-region'
        are respected.
        * automated/keymap-tests.el:
        Test `canonicalize-keysym', just updated to cons much less and to
        return modifiers in a canonical order.

2023-08-05  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/region-tests.el:
        Test the shifted-motion handling, ensure a recently-reported bug
        associated with function-key-map entries for end, home and friends
        has not regressed.

2023-07-31  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/format-tests.el:
        Test the %z integer length modifier explicitly, check that it is
        equivalent to the %l modifier when supplied to Lisp.

2023-07-30  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/lisp-tests.el (probe-bounds-of-aref):
        Add some non-ASCII content when testing bounds with #'position and
        friends.

goto announcement, summary, changes

 
 

Conform with <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Automatically validated by PSGML